pytorch常用操作

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)

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值