(此处详述快速梯度符号攻击方法:https ://pytorch.org/tutorials/beginner/fgsm_tutorial.html )
我有一个训练有素的分类器,准确率 > 90%,我用它来创建这些对抗性示例,然后我用torchvision.utils.save_image
它来将图像保存到不同的文件夹中。
文件夹层次结构如下:
- FOLDER_1
- original_image.jpg (1)
- perturbed_image.jpg (2)
- FOLDER_2
- perturbed_image.jpg (3)
这里(2)和(3)是同一个图像张量,是原始图像张量和一个扰动图像张量之和---我只是想保存两次欺骗分类器的图像。我发现(1)和(2)打印正常,但(3)只打印扰动图像张量(它减去了原始图像张量!)。因此,当我打开(2)时,我看到我的原始图片顶部有所有噪声(来自 FGSM 攻击的随机 RGB 像素开关),但是当我打开(3)时,我看到一个带有随机 RGB 像素开关的空白画布只要。
由于我两次打印相同的变量(perturbed_data),我不明白为什么torchvision.utils.save_image
第二次调用它时选择减去扰动图像张量。我所描述的代码如下,数据是原始图像张量。
epsilon = 0.5
# Collect datagrad
data_grad = data.grad.data
# Call FGSM Attack
perturbed_data = fgsm_attack(data, epsilon, data_grad)
# Re-classify the perturbed image
perturbed_output = model(perturbed_data)
perturbed_output = torch.sigmoid(perturbed_output)
perturbed_output = perturbed_output.max(1, keepdim=True)[1]
max_pred = perturbed_output.item()
final_pred = torch.tensor([0, 0]).to(device)
final_pred[max_pred] = 1
# Store all original and perturbed images, regardless of model prediction
torchvision.utils.save_image(data, "./FOLDER_1/original.jpg")
torchvision.utils.save_image(perturbed_data, "./FOLDER_1/perturbed_image.jpg")
# If the perturbed image fools our classifier, put a copy of it in FOLDER_2
if !torch.all(torch.eq(final_pred, target)):
torchvision.utils.save_image(perturbed_data, "./FOLDER_2/perturbed_image.jpg")
我几乎可以肯定这是一个 torchvision 错误,但我想在提交错误报告之前我会在这里询问。也许有人看到了我没有看到的东西。我还附上了(2)和(3)的示例以进行可视化。第一张图像的格式正确,但第二张图像打印时没有原始图像张量。