pytorch中关于backward的几个要点说明

 更新时间:2023年02月21日 08:42:19   作者:老李今天学习了吗  
这篇文章主要介绍了pytorch中关于backward的几个要点说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

pytorch中backward的2个要点

1. requires_grad

用pytorch定义一个网络层,如果数据中加入requires_grad=True,那么对于这个变量而言,就有了属于自己的导数(grad),如果这个数据是矩阵,那么他的grad是同样大小的一个矩阵。

我们将requires_grad视为该变量的一个属性,我们知道,我们在现实生活中,或者说在神经网络中,大部分的函数都是一阶连续可微的,也就是说,他的梯度具有唯一性。requires_grad的存在非常合理。

2. scale才能有backward

scale是标量的意思。

首先我们可用用如下语句查看等式中某个自变量的梯度。

print(x.grad, y.grad)

但是有个前提,我们必须要先对他的结果使用.backward()才能去查看,不然的话,他的梯度会显示为none。

非常需要注意的一点是,能够使用.backward()的必须是标量(scale),不然程序会报错。

结合实际的情况,我们看任何一个网络,使用backward的地方几乎只有一个,那就是loss.backward()。

首先loss肯定是一个标量,无论是MSE还是交叉熵,也无论是否加上了正则项,那都是求和之后的结果,也就是一个数值。这一点非常重要。

以下是我随意写的一个网络层,可以感受一下

import torch
import torch.nn as nn
class Linear(nn.Module):
    def __init__(self, inc, mult):
        super(Linear, self).__init__()
        self.intc = inc
        self.mult = mult
    def forward(self, input0):
        return torch.sum(torch.abs(input0*self.mult+self.intc))
def main():
    x = torch.tensor(1.0, requires_grad=True)
    y = torch.tensor(2.0,requires_grad=True)
    z = x**2+y
    p = z*2+x
    p.backward()
    print(z, x.grad, y.grad)
    A = torch.ones([3,3],requires_grad=True)
    print(A.requires_grad)
    f = Linear(1, -2)
    b = f(A)
    print(b)
    b.backward()
    print(A.grad)
if __name__ == '__main__':
    main()

pytorch中backward参数含义

1.标量与矢量问题

backward参数是否必须取决于因变量的个数,从数据中表现为标量和矢量;

  • 例如标量时
  • y=一个明确的值
  • 矢量时
  • y=[y1,y2]

2.backward 参数计算公式

当因变量公式不是一个标量时,需要显式添加一个参数进行计算,以pytorch文档示例说明:

import torch

a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
Q = 3*a**3 - b**2

例如求解公式

external_grad = torch.tensor([1., 1.])
Q.backward(gradient=external_grad)

可以看到backward参数为[1,1],具体计算的含义,我们把Q公式拆分为标量形式即:

backward参数为[1,1],计算公式为

3.autograd

torch.autograd是计算向量和雅可比公式的乘积的引擎:

其中J就是因变量与自变量的雅可比公式,v即backward中的参数;类比于第二节的例子可对应;

前向传播得到数值后,利用此形式计算直接后向传播计算出损失函数对应各权值的梯度下降值

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python基础详解之邮件处理

    Python基础详解之邮件处理

    这篇文章主要介绍了Python基础详解之邮件处理,文中有非常详细的代码示例,对正在学习python基础的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Python调用.net动态库实现过程解析

    Python调用.net动态库实现过程解析

    这篇文章主要介绍了Python调用.net动态库实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python使用穷举法求两个数的最大公约数问题

    Python使用穷举法求两个数的最大公约数问题

    这篇文章主要介绍了Python使用穷举法求两个数的最大公约数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 详细解读Python中的json操作

    详细解读Python中的json操作

    json操作是最为基本的、最为常用的,Python自带的json模块就可以满足大部分应用场景,而且使用起来极为简单,下面这篇文章主要给大家介绍了关于Python中json操作的相关资料,需要的朋友可以参考下
    2022-05-05
  • Python基础之数据类型知识汇总

    Python基础之数据类型知识汇总

    今天带大家复习一下Python基础知识,文中对数据类型相关知识做了详细的汇总,对刚入门python的小伙伴很有帮助哟,需要的朋友可以参考下
    2021-05-05
  • 详解Python解决抓取内容乱码问题(decode和encode解码)

    详解Python解决抓取内容乱码问题(decode和encode解码)

    这篇文章主要介绍了Python解决抓取内容乱码问题(decode和encode解码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Python线性回归图文实例详解

    Python线性回归图文实例详解

    用python进行线性回归分析非常方便,有现成的库可以使用比如numpy.linalog.lstsq、scipy.stats.linregress、pandas.ols等,这篇文章主要给大家介绍了关于Python线性回归的相关资料,需要的朋友可以参考下
    2021-11-11
  • 关于Keras模型可视化教程及关键问题的解决

    关于Keras模型可视化教程及关键问题的解决

    今天小编就为大家分享一篇关于Keras模型可视化教程及关键问题的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 情人节快乐! python绘制漂亮玫瑰

    情人节快乐! python绘制漂亮玫瑰

    情人节快乐! 这篇文章主要教大家如何用python绘制漂亮玫瑰花,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Python压缩解压缩zip文件及破解zip文件密码的方法

    Python压缩解压缩zip文件及破解zip文件密码的方法

    这篇文章主要介绍了Python压缩解压缩zip文件及尝试破解zip文件密码的方法,给出了一个使用zipfile模块的简单示例,需要的朋友可以参考下
    2015-11-11

最新评论