2

(此处详述快速梯度符号攻击方法: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)的示例以进行可视化。第一张图像的格式正确,但第二张图像打印时没有原始图像张量。

original_img_tensor + pert_img_tensor pert_img_tensor

4

2 回答 2

1

结果是torchvision.utils.save_image修改了输入张量。解决方法是在调用之前在某处添加一行torchvision.utils.save_image,类似于:

perturbed_data_copy = perturbed_data

如果在第二次调用中使用 perturbed_data_copy 而不是 perturbed_data(由 torchvision.utils.save_image 修改),那么您可以安全地保存扰动图像两次。我将提交错误报告并标记此帖子。感谢@Mat 指出这一点!

于 2019-11-26T17:07:22.533 回答
1

我也有这个问题,它源于torchvision只保存第二个张量。所以我将两个(image)张量(image1 + image2)加在一起形成一个新的张量(image3),但是当我第二次保存新的张量(image3)时,它只会保存为第二个张量(image2)总和。

PyTorch 在去年年底的某个时候有一个 PR 来解决这个问题。

于 2020-05-27T17:59:16.807 回答