Pytorch 如何将代码升级到0.4 版本

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):
    ......

猜你喜欢

转载自blog.csdn.net/xzy5210123/article/details/81588038