weixin_63979347 2022-05-13 11:42 采纳率: 0%
浏览 36
已结题

为什么使用FGSM后得到的图片,用plt显示图片是报错?

问题遇到的现象和发生背景
my_model = mobilenet_v2() #实例化模型
model_state= torch.load("D:\PyTorch_CIFAR10-master\state_dicts\mobilenet_v2.pt", map_location='cpu',encoding='utf-8')#载入模型的方式
my_model.load_state_dict(model_state) #将模型放入对象
my_model.eval()#使模型所有层进入评估模式以禁用Dropout
img = mpimg.imread('./car.png')#载入图片
print("图片的形状:",img.shape) # numpy数组格式为(H,W,C)

#图像的预处理
transf2 = transforms.Compose([
     transforms.ToTensor(),#将plt图片转化成张量,转换过程中会对图像的像素值进行归一化成 [0.0, 1.0]的范围
     transforms.Normalize(mean = (0.4914, 0.4822, 0.4465),std = (0.2471, 0.2435, 0.2616))#归一化,计算方式是:C=(C-mean)/ std  
])
img_tensor2 = transf2(img)
print(img_tensor.size())# tensor数据格式是torch(C,H,W)
x=img_tensor2=torch.unsqueeze(img_tensor2, dim=0)#升维,在第dim维前升维

#对于原图像的预测
label=['plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']
y=my_model(img_tensor2)
print(y)#查看具体概率
index=torch.argmax(y)#modele()以张量形式返回对每个类别的概率,argmax()返回最大值的序号
print("该图片的预测类别为: ",label[index]) 

问题相关代码,请勿粘贴截图

def UnNormalize(x):
    """反归一化"""
    mean = torch.tensor((0.4914, 0.4822, 0.4465,)).view((1, -1, 1, 1))
    std = torch.tensor((0.2471, 0.2435, 0.2616,)).view(( 1,-1, 1, 1))
    x = (x * std) + mean
    return x

def showimg(x):
     """三张图片一起打印"""
     diff = x-img
     plt.subplot(131), plt.imshow(img), plt.title("ori_img"),plt.xlabel(label[index])  # 表示将整个图像窗口分为14列, 当前位置为1
     plt.subplot(132), plt.imshow(x), plt.title("adv_img"),plt.xlabel(label[index2])  # 表示将整个图像窗口分为14列, 当前位置为2
     plt.subplot(133), plt.imshow(diff), plt.title("difference")  # 表示将整个图像窗口分为14列, 当前位置为3
     plt.show()

def UnToTensor(x):
     """将Tensor转化回ndarray"""
     x=torch.squeeze(x)#降维
     x=x.permute(1,2,0)
     x=x.numpy()#转化回ndarray
     return x

for param in my_model.parameters():
  param.requires_grad=False
x.requires_grad=True
#设置优化器与损失函数
optimizer=torch.optim.Adam([x])
criterion=torch.nn.CrossEntropyLoss()
#设置定向与迭代次数
epoches=100
target=torch.Tensor([8]).long()


for epoch in range(epoches):
  output=my_model(x)
  loss=criterion(output,target)
  label=torch.argmax(output)
  print("epoch:{} ||loss:{} ||label:{}".format(epoch,loss,label))
  if label==target:
    index2=8
    break
  optimizer.zero_grad()
  loss.backward()
  x.data=x.data-0.01*torch.sign(x.grad.data)


x=UnNormalize(x)
x=x.squeeze(0).permute(1,2,0).data.numpy().astype(np.float32)

Difference(img,x)
showimg(x)


运行结果及报错内容
IndexError                                Traceback (most recent call last)
d:\PyTorch_CIFAR10-master\zy1.ipynb Cell 2' in <cell line: 38>()
     36 #x=np.array(x)
     37 Difference(img,x)
---> 38 showimg(x)

d:\PyTorch_CIFAR10-master\zy1.ipynb Cell 1' in showimg(x)
     21 """三张图片一起打印"""
     22 diff = x-img
---> 23 plt.subplot(131), plt.imshow(img), plt.title("ori_img"),plt.xlabel(label[index])  # 表示将整个图像窗口分为14列, 当前位置为1
     24 plt.subplot(132), plt.imshow(x), plt.title("adv_img"),plt.xlabel(label[index2])  # 表示将整个图像窗口分为14列, 当前位置为2
     25 plt.subplot(133), plt.imshow(diff), plt.title("difference")  # 表示将整个图像窗口分为14列, 当前位置为3

IndexError: too many indices for tensor of dimension 0

我的解答思路和尝试过的方法
我想要达到的结果

想知道怎么处理

  • 写回答

1条回答 默认 最新

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月20日
  • 修改了问题 5月13日
  • 赞助了问题酬金5元 5月13日
  • 创建了问题 5月13日

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误