入门pytorch书本《深度学习入门之pytorch》,首先学习一维线性回归的实现。书中代码
虽然书中的代码仍在维护,但是pytorch更新了部分函数,本文仅做一些修改,不做一维线性回归的讲解,具体实现可参考代码链接。
-
Variable 与Tensor
variable与tensor合并,旧版本的variable封装仍可以工作,新的tensor就不需要再用variable封装了,requires_grad为tensor的一个属性,默认为False,语句w = Variable(torch.randn(1), requires_grad=True)
,更改为w = torch.randn(1, requires_grad=True)
,对b的初始化操作相同。 -
.data 与.detach()
.data是tensor的一个属性,而.detach()是一个方法,0.4保留了.data,但是更推荐使用.detach()实现从tensor中提取数据转换为numpy,原因是.detach()更安全。两者都与tensor共享内存,且requires_grad=false,但是在调用tensor数据过程中,.detach()对tensor的更改会被检测到并报错,而.data不会报错,使得在后续autograd中出现错误且不易察觉。详细解析
原代码中画图部分的.data改成.detach() -
零维张量
loss是零维张量,提取张量的数据由loss.data[0]
更改为loss.item()
-
w.grad.zero_()
原文中先对loss反向传播了一次,然后写了重复多次训练的代码,笔者学习时将第一次loss反向传播省略,直接重复训练,导致报错,‘“Nonetype”object has no attribute ‘zero_’’,原因是系统将w的grad初始化为None,直接写for循环需要先将grad清零再反向传播,因此报错,需要在for 循环前进行一步反向传播,或者增加一步判断,当epoch大于0时再进行梯度清零