对抗样本保存中遇到坑(1)

从暑假开始就一直在尝试保存图片,奈何没有图像基础,尝试几天后放弃了,想着到学校后能不能问一问,开学后一直在读论文也没动手,寒假回到家开始跑实验了,而对抗样本代码整合还是不好做的,唯一好做的我认为应该是收集足够的对抗样本做实验,顺便说一下对抗样本是没有数据集的,实验数据都要自己生成,所以又回到了老问题,图像保存........

1、pytorch没有内置函数能够保存tensor格式的数据类型,需要转换

adv=(pig_tensor + delta)[0].detach().numpy()

adv表示对抗样本,pig_tensor表示原图,delta就是计算好的扰动合,detach()是报错说需要加这个,查阅后是生成了一个新的张量来保存,等于不能在原图中修改,最后numpy()是数据转换,具体来说是ndarray

2、对抗样本生成的tensor数据类型都是经过归一化后的结果,所以想要保存图像需要转回0-255

#错误代码
adv =int(adv*255)

 转回0-255直接乘以255没有问题,问题出在不能进行强制转换,具体原因不清楚,一步一步试出来的。

#正确代码
adv =(adv*255)
adv=np.floor(adv)

3、考虑到范围是0-255,所以小于0或者大于255的部分要进行裁剪

#裁剪操作
adv [adv<0]=0
adv [adv>255]=255

这里不能使用if判断去做,赋值时会把所有数组都变了,最终结果如下:

4、使用cv2.imwrite函数进行保存

#保存adv图片
cv2.imwrite("/home/shao/sun/data/adv{}.jpg".format(1), adv)

到这里你以为结束了吗,依然报错:

 报错查询结果如下:

 很明显我的代码并不是这个问题,最后终于发现应该将CHW转为HWC,这才是opencv的最终存储格式。

转numpy那里修改一下

#转numpy
adv=(pig_tensor + delta)[0].detach().numpy().transpose(1,2,0)

[0]的意思是去除了batchsize,等于将4维变为了3维,transpose函数用于交换维度,从CHW变为HWC。

最终adv的格式:

 总结

网上都说tensor格式的数据也能存,几乎试了所有方法发现还是不行,这也是暑假为什么实验无法成功的主要原因。如果想要批量保存图片,加一个for循环就好了,记得在format()里填一个变量。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值