使用 FGSM 生成对抗性示例
时间: 2024-02-04 13:03:50 浏览: 21
FGSM(Fast Gradient Sign Method)是一种常用的对抗性攻击方法,它利用目标模型的梯度信息来生成对抗性样本。下面是使用 FGSM 生成对抗性示例的 Python 代码:
```python
import torch
import torch.nn.functional as F
from torchvision import models, transforms
from PIL import Image
# 加载预训练的模型
model = models.resnet18(pretrained=True)
model.eval()
# 定义图像预处理函数
preprocess = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
# 加载原始图像
image = Image.open("cat.jpg")
input = preprocess(image).unsqueeze(0)
# 计算对抗性扰动
epsilon = 0.1
input.requires_grad = True
output = model(input)
loss = F.nll_loss(output, torch.tensor([285]))
model.zero_grad()
loss.backward()
perturbation = epsilon * torch.sign(input.grad.data)
# 生成对抗性样本
adversarial = input + perturbation
adversarial = torch.clamp(adversarial, 0, 1)
# 输出结果
adversarial_image = transforms.functional.to_pil_image(adversarial.squeeze())
adversarial_image.show()
```
在上面的代码中,我们首先加载了一个预训练的 ResNet-18 模型,并定义了一个用于图像预处理的函数。然后,我们加载了一张名为 "cat.jpg" 的原始图像,并将其转换为 PyTorch 张量。接着,我们计算了对抗性扰动,在这里我们使用了 FGSM 方法,将 epsilon 设置为 0.1。最后,我们将扰动添加到输入图像中,生成了对抗性样本,并将其可视化。