问题遇到的现象和发生背景
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]) # 表示将整个图像窗口分为1行4列, 当前位置为1
plt.subplot(132), plt.imshow(x), plt.title("adv_img"),plt.xlabel(label[index2]) # 表示将整个图像窗口分为1行4列, 当前位置为2
plt.subplot(133), plt.imshow(diff), plt.title("difference") # 表示将整个图像窗口分为1行4列, 当前位置为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]) # 表示将整个图像窗口分为1行4列, 当前位置为1
24 plt.subplot(132), plt.imshow(x), plt.title("adv_img"),plt.xlabel(label[index2]) # 表示将整个图像窗口分为1行4列, 当前位置为2
25 plt.subplot(133), plt.imshow(diff), plt.title("difference") # 表示将整个图像窗口分为1行4列, 当前位置为3
IndexError: too many indices for tensor of dimension 0
我的解答思路和尝试过的方法
我想要达到的结果
想知道怎么处理