1、当经过网络模型后,输出的output tensor为[1,16]时,将其展平为一维numpy()向量,然后按照降序排列
output = model.forward(img) #img为Variable类型
print(output.shape) #tensor[1,16]
#将其展平为一维向量,然后排序
output = output.data.cpu().numpy().flatten()
print(output.shape)#(16,)
output = output.argsort() #降序排列输出
output = output[::-1]
print(output.shape) #(16,)
2、当输入到模型model中的input是tensor类型时,获取其预测的标签pred
注意:不论是使用_,pred=output.max(1) 还是使用pred=torch.argmax(output,1)得到的索引pred都属于tensor类型
如果需要获得label的索引数值,例如15,则需要使用tensor.item(),得到该数值
input = input.to(device)
label = label.to(device)
output = model(input) [1,num_classes]
_,pred = output.max(1)#返回每一列中最大值和其索引,keepdim保证
#或者使用pred = np.argmax(output,1) dim=0按列比较,dim=1按行比较,直接返回该行最大值的索引
当输入到模型model中的input是Variable类型时,output类型同样为Variable,获取其预测标签pred:
x = Variable(pert_image,requires_grad=True) #更新输入的x
fs = model.forward(x) #前向传播得到输出output,
k_i = np.argmax(fs.data.cpu().numpy().flatten())#将输出结果展平为一维数组,输出最大值索引
3、不同维度的Tensor,可以直接相加减,自动将维度较小的进行扩展
4、不同类型之间的转化
#一、将tensor类型的变量例如perturb_image shape为[1,3,64,64],转化为图像保存在指定的位置
#可以先转化为numpy,再转化为PIL Image
pert_image = pert_image.squeeze(0).data.cpu().numpy().transpose(2, 1, 0)
pert_image = Image.fromarray(pert_image.astype('uint8')).convert('RGB')
pert_image.save(perturb_path + '/' + path.split('/')[-1].replace(".jpg", "_adv.jpg"))
#二、tensor类型转化为numpy类型变量
img_array = img.data.cpu().numpy()
#三、numpy类型转化为tensor类型
a = np.ones(5)
b = torch.from_numpy(a)
#四、PIL Image类型和numpy类型的相互转化
img = np.array(Image.open("l.jpg"))
img = Image.fromarray(img)
img.show()
#五、Tensor直接转化为 PIL Image类型
img = transforms.ToPILImage()(perturb.data.cpu()).convert('RGB')
5、比较两幅图像之间的相似度:compare_ssim(numpy1,numpy2)
#input为tensor,shape为[1,3,64,64]
img1 = input.squeeze().detach().cpu().numpy()#[3,64,64] 不进行反向传播
img1 = img1.transpose(2,1,0) #[64,64,3]
img2 = pert_image.squeeze().detach().cpu().numpy()
img2 = img2.transpose(2,1,0)
#计算两幅图的相似度
ssim = compare_ssim(img1,img2,multichannel=True)
6、当input类型为tensor时,经过模型前向传播得到输出output(tensor类型),当我们需要得到最大分类概率的label(整型的类别标签)时,可以使用:
#mask_img为tensor类型,求输出的按行计算的最大概率值的label,返回的是整型格式
torch.argmax(model(mask_img),dim=1)
7、训练模型时,使用model.train()指定模型处于训练模式,模型中的BatchNorm层和Dropout层正常运行
测试模型时,使用model.eval()指定模型处于测试模式,限制了BatchNorm层和Dropout层的正常运行
此外测试模型时,因为不需要反向传播,更新梯度,所以需要添加torch.no_grad()语句
例如:
with torch.no_grad():
for i,(input,label,path) in enumerate(testLoader):
#得到原本的数据样本
#print(type(input)) tensor
#print(type(label)) tensor
#print(type(path)) tuple
input = input.to(device)
#output = model(input)
#_,pred = output.max(1)
#print('******')
#print(pred) tensor 15
test_label_origin[i] = torch.argmax(model(input),dim=1)
#添加了扰动v后的mask_img
mask_img = (input + torch.tensor(v).to(device)).to(device)
#_,pert_pred = model(mask_img).max(1)
#print('#########')
#print(pert_pred) # tensor[15]
test_label_pert[i] = torch.argmax(model(mask_img),dim=1)