Image 在同一张图像上使用torchvision.utils.save_图像两次,会使第二次保存无效。什么';发生什么事了?

Image 在同一张图像上使用torchvision.utils.save_图像两次,会使第二次保存无效。什么';发生什么事了?,image,image-processing,pytorch,tensor,torchvision,Image,Image Processing,Pytorch,Tensor,Torchvision,(此处详述的快速梯度符号攻击方法:) 我有一个经过训练的分类器,准确率>90%,用于创建这些对抗性示例,然后我使用torchvision.utils.save_image将图像保存到不同的文件夹中 文件夹层次结构如下所示: 文件夹1 原始图像.jpg(1) 扰动图像.jpg(2) 文件夹2 扰动图像.jpg(3) 这里(2)和(3)是相同的图像张量,它是原始图像张量和扰动图像张量的总和——我只想保存两次愚弄分类器的图像。我发现(1)和(2)打印没问题,但是(3)只打印扰动图像张量(它

(此处详述的快速梯度符号攻击方法:)

我有一个经过训练的分类器,准确率>90%,用于创建这些对抗性示例,然后我使用
torchvision.utils.save_image
将图像保存到不同的文件夹中

文件夹层次结构如下所示:

  • 文件夹1
    • 原始图像.jpg(1)
    • 扰动图像.jpg(2)
  • 文件夹2
    • 扰动图像.jpg(3)
这里(2)(3)是相同的图像张量,它是原始图像张量和扰动图像张量的总和——我只想保存两次愚弄分类器的图像。我发现(1)(2)打印没问题,但是(3)只打印扰动图像张量(它减去了原始图像张量!)。因此,当我打开(2)时,我会看到我的原始图片,上面有所有的噪声(随机RGB像素从FGSM攻击中切换),但当我打开(3)时,我会看到一个空白画布,上面只有这些随机RGB像素切换

由于我将同一变量(扰动图像数据)打印了两次,我不明白为什么
torchvision.utils.save\u image
在第二次调用扰动图像张量时选择减去它。下面是我描述的代码,数据是原始图像张量

epsilon=0.5
#收集数据梯度
data\u grad=data.grad.data
#呼叫FGSM攻击
扰动数据=fgsm攻击(数据,ε,数据梯度)
#扰动图像的再分类
扰动_输出=模型(扰动_数据)
扰动_输出=火炬.sigmoid(扰动_输出)
扰动输出=扰动输出.max(1,keepdim=True)[1]
max_pred=受干扰的_输出。项()
final_pred=火炬张量([0,0])到(装置)
最终预测[最大预测]=1
#存储所有原始图像和扰动图像,而不考虑模型预测
torchvision.utils.save_image(数据“./FOLDER_1/original.jpg”)
torchvision.utils.save_image(扰动的_数据,“./FOLDER_1/扰动的_image.jpg”)
#如果受干扰的图像愚弄了我们的分类器,请将其副本放入文件夹2中
如果!所有火炬(火炬均衡(最终预定目标):
torchvision.utils.save_image(扰动的_数据,“./FOLDER_2/扰动的_image.jpg”)
我几乎可以肯定这是一个torchvision错误,但我想在提交错误报告之前我会在这里询问。也许有人看到了我不知道的东西。我还附上了一个用于可视化的(2)(3)示例。第一幅图像格式正确,但第二幅图像打印时没有原始图像张量


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

扰动数据拷贝=扰动数据

然后,如果在第二次调用时使用扰动数据\u副本而不是扰动数据(由torchvision.utils.save\u image修改),则可以安全地保存扰动图像两次。我将提交一个错误报告和标签这篇文章。谢谢@Mat指出这一点

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


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

可能有一个输入错误:
torchvision.utils.save_image(扰动的_数据,“../../data/扰动的_image.jpg”)
,路径不应该是“/./data/FOLDER_2/扰动的_image.jpg”吗?只是让事情始终如一谢谢你指出它们!我已经修复了拼写错误,但它们不是问题的原因。我必须重新编写代码,以尽可能消除复杂性,同时保持问题的可复制性。我无法真正测试atm,但您是否在没有
if
条件的情况下进行了测试?如果仍然失败,这意味着
save_图像
会影响你的张量。如果不是的话,那就意味着条件就是这样。谢谢@Mat,你是对的
save_image
正在修改张量。请随意回答并接受您自己的问题,而不是编辑,我不介意;我想,只要相信我就行了。我个人会检查
save_image
的内部代码,看看是什么改变了张量,但这不是必须的。