pytorch自动求梯度
概念
Tensor 是这个包的核⼼类,如果将其属性 .requires_grad 设置为 True ,它将开始追踪(track)在其上的所有操作(这样就可以利⽤链式法则进⾏梯度传播了)。
完成计算后,可以调 ⽤ .backward() 来完成所有梯度计算。此 Tensor 的梯度将累积到 .grad 属性中。
注意在 y.backward() 时,如果 y 是标量,则不需要为 backward() 传⼊任何参数;否则,需要传⼊⼀个与 y 同形的 Tensor 。
如果不想要被继续追踪,可以调⽤ .detach() 将其从追踪记录中分离出来,这样就可以防⽌将来的计 算被追踪,这样梯度就传不过去了。
此外,还可以⽤ with torch.no_grad() 将不想被追踪的操作代码块包裹起来,这种⽅法在评估模型的时候很常⽤,因为在评估模型时,我们并不需要计算可训练参数 ( requires_grad=True )的梯度。
Function 是另外⼀个很重要的类。 Tensor 和 Function 互相结合就可以构建⼀个记录有整个计算过程的有向⽆环图(DAG)。
每个 Tensor 都有⼀个 .grad_fn 属性,该属性即创建该 Tensor 的 Function , 就是说该Tensor 是不是通过某些运算得到的,若是,则 grad_fn 返回⼀个与这些运算相关的对象,否则是None。
例子一
注意:grad在反向传播过程中是累加的(accumulated),这意味着每⼀次运⾏反向传播,梯度都会累 加之前的梯度,所以⼀般在反向传播之前需把梯度清零
例子二
如果想在中间修改一个值的参数,但是又不想被梯度记录下来,就使用.data来改变