Pytorch更新到0.4后,有一些比较重大的更新,也开始支持Windows系统,可以说是许多人的福音了。
而原先0.2 0.3版本的代码需要稍微修改一下才能继续用
主要变化
1.Variable并入Tensor
无需再import torch.autograd.Variable,Tensor直接可以计算梯度
(当然使用继续使用Variable并没有关系,用法功能都同往常,除了返回对象变成了Tensor类型)
requires_grad等属性也并入tensor
>>> x = torch.ones(1) # 创建一个tensor时默认 requires_grad=False
>>> x.requires_grad
False
# 可以使用 tensor.requeires_grad_() 来改变该标记(缺省为True)
>>> existing_tensor.requires_grad_()
>>> existing_tensor.requires_grad
True
# 实际例子
# 老版本 v0.3
for step, data in enumerate(data_loader, 1):
x, y = data
x = Variable(x)
y = Variable(y)
# 新版本 v0.4
for step, data in enumerate(data_loader, 1):
x, y = data # 这样就ok了
2.type()的更变
Tensor的type()不再反映数据类型。而是使用isinstance()或x.type()替代
>>> x = torch.DoubleTensor([1, 1, 1])
>>> print(type(x)) # 曾是 torch.DoubleTensor
<class 'torch.autograd.variable.Variable'>
>>> print(x.type()) # 可用: 'torch.DoubleTensor'
'torch.DoubleTensor'
>>> print(isinstance(x, torch.DoubleTensor)) # 可用: True
True
3.取数值 .data改为.detach()
.data原本是用于从Variable中获取所包装的Tensor。
合并之后,.data依旧能用与获取数据,但不能被用于计算梯度,某些情况下会导致出错。所以按照官方推荐用.detach()替代
# 前向传播 v0.3
output = model(x)
pred = torch.max(output.data, 1)[1]
# 前向传播 v0.4
output = model(x)
pred = torch.max(output.detach(), 1)[1]
4.累加损失时.data[0]改为.item()
以广泛使用的total_loss += loss.data[0]为例。
0.4.0之前,loss是一个封装了(1,)Tensor的Variable,但0.4.0的loss现在是一个零维的标量。
索引到标量是没有意义的(现在它会给出一个警告,但在0.5.0中将是一个系统错误)。
使用loss.item()可以从标量中获取Python数字。
running_loss += loss.data[0] # 老版本
running_loss += loss.item() # 0.4版本
5.弃用volatile
测试过程中,用with torch.no_grad():来代替
with torch.no_grad():
print('Testing...')
for step, data in enumerate(test_loader, 1):
......