PyTorch学习(一)
因为实验室整体环境的原因,安装的pytorch版本为0.3.1,而0.4及以上已经做出了比较大的改变,比如:
1.0.4中使用设备:.to(device)
2.0.4中删除了Variable,直接tensor就可以
3.with torch.no_grad():的使用代替volatile
尤其是针对于Variable和tensor的转换,对于新手来说真的是深陷其中费时费力,下面简述一下我经常遇到的几个常见的问题:
- AttributeError: ‘Variable’ object has no attribute ‘***’
例:想保存loss的输出结果在列表loss_dict中,如何直接用下述语句的话会出现如下错误
` print('Epoch: ', epoch + 1, '| train loss: %.4f' % loss.cuda())
loss_dict.append(loss.item())`
AttributeError: 'Variable' object has no attribute 'item'
此时需要添加一行:loss = loss.cpu().data.numpy(),如下,
print('Epoch: ', epoch + 1, '| train loss: %.4f' % loss.cuda())
loss = loss.cpu().data.numpy()
loss_dict.append(loss.item())
此时可以输出他的数据类型看需要怎样的数据再改,可以
print(loss)
出现cuda().FloatTensor()等样式,而append()方法只能用与Numpy数组中,因此要先变成cpu()形式的,再变成numpy数组,因为神经网络中都是以tensor形式进行数据传递的。
2. 可视化损失的变换过程
首先定义一个列表
loss_dict = []
然后在训练过程中loss更新后写入:
loss = loss.cpu().data.numpy()
loss_dict.append(loss.item())
然后可视化
plt.plot(loss_dict, label='loss for every epoch')
plt.legend()
plt.show()
- 错误:‘dice_loss’ object has no attribute ‘backward’
此处涉及到损失函数的调用
criterion=dice_loss().cuda()#使用自定义的损失函数
criterion=nn.CrossEntropyLoss()#使用nn中自带的损失函数