zoukankan      html  css  js  c++  java
  • 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来改变

  • 相关阅读:
    二叉树后序遍历
    [编程题] 赛马
    [编程题] 糖果谜题 C++实现输入未知个整数
    [编程题] 时钟
    [编程题] 会话列表
    A Fast Lock-Free Queue for C++
    Design Hangman
    Design a URL shortener [转]
    ostream 和 ostringsteam 的区别
    Hash Table Collision Handling
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/13555526.html
Copyright © 2011-2022 走看看