pytorch如何自定义forward和backward函数

 更新时间:2024年10月12日 16:08:13   作者:xx_xjm  
PyTorch自动求导功能强大,但在特定情况下需要用户自行定义backward函数,通过实例解释了保存变量、计算梯度、链式法则等核心概念,并展示了如何通过自定义函数集成到网络中以及如何正确返回梯度,此外,还讨论了多输出情况下的梯度传递

pytorch自定义forward和backward函数

pytorch会自动求导,但是当遇到无法自动求导的时候,需要自己认为定义求导过程,这个时候就涉及到要定义自己的forward和backward函数。

举例如下:

看到这里,大家应该会有很多疑问

比如:

  • 1:ctx.save_for_backward和ctx.saved_tensors的含义
  • 2:backward中各个计算函数的意义,以及backward的输入参数grad_out是什么,以及grad_out包含哪些数据。

针对以上问题,我们一个个解答

  • 第一个问题:百度吧,答案很多!!!!
  • 第二个问题:拿上面这个例子来看,我们定义了一个类似于线性层的东西,但注意这不是线性层,因为我们是直接把输入和weight用*来做点对点的乘法的,所以这不是我们通常情况下的线性层。

但是这么看也费劲,我们写一个网络,把这个函数加到网络中去,再完整的跑一遍看吧!

测试代码

结果如下:

来进行解答

首先,backward函数的返回值,就是对应着forward里面的参数的梯度,也就是说,forward函数里面有几个输入参数,那么backward函数的输出就要有几个!为什么是这样?

我们首先要理解backward的输入grad_out,为什么backward的参数就是一个,因为这是根据链式法则来的

比如,我们定义三个函数H(对应上面网络中linear1),F(自定义函数xjm_inter),D(对应上面网络中linear2),定义一个输入x(对应上面输入a),定义一个输出y(对应上面输出b):

y = D(F(H(X)))

现在,我们求y对x的偏导,那么:

dy/dx = dy/dD * dD/dF * dF/dH * dH/dx

好吧看到这里你可能还是不懂,为什么backward的参数就是一个grad_out!!

我们韩式以上面则个函数为例子,但是,我们现在不求y对x的导数,我们假设F函数有一个叶子节点(或者说requires_grad=True)的参数w1,现在我们要求y对w1的导数:

所以

dy/dw1 = dy/dD *dD/dF * dF/dw1

那么此时,F就是我们上面代码中自定义的xjm_inter函数,则 grad_out = dy/dD *dD/dF。

怎么理解呢,根据链式法则,我们呢所定义的网络中的每一层都是一个单独的函数,所以函数中的变量的最终求导其实只取决于该函数本身,链式法则求导传递过来的其实永远都知识一个值,这就是为什么backward函数的输出只有一个。

扩展

当forward的输出有多个的时候,那么就有多个链式法则,因为可以同时对x或者对w求导,此时backward的输入可以是一个,也可以是对应forward输出的个数,如果是一个则是一个元组,包含对应的梯度!!!

那么我们的backward要实现什么样的功能呢?说到这里,大家应该大概能明白了,就是实现当前层那的梯度计算,并进行返回,所以,这也是为什么backward的返回值要和forward的输入值一一对应,否则会报错。

总结

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

相关文章

  • pandas 获取季度,月度,年度首尾日期的方法

    pandas 获取季度,月度,年度首尾日期的方法

    下面小编就为大家分享一篇pandas 获取季度,月度,年度首尾日期的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Python中np.where()的使用方式

    Python中np.where()的使用方式

    这篇文章主要介绍了Python中np.where()的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python搭建自己IP代理池的方法实现

    Python搭建自己IP代理池的方法实现

    本文主要介绍了Python搭建自己IP代理池的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python多线程+代理池爬取天天基金网、股票数据过程解析

    python多线程+代理池爬取天天基金网、股票数据过程解析

    这篇文章主要介绍了python多线程+代理池爬取天天基金网、股票数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python实现快速替换Word文档中的关键字

    Python实现快速替换Word文档中的关键字

    使用Python自动化处理Word文档可以帮助您提高效率,并减少手动处理文档所需的时间和精力,所以本文为大家准备了Python快速替换Word文档中的关键字的方法,希望对大家有所帮助
    2023-06-06
  • Python判断两个对象相等的原理

    Python判断两个对象相等的原理

    这篇文章主要介绍了Python判断两个对象相等的原理,需要的朋友可以参考下
    2017-12-12
  • 解读sqlalchemy的常用数据类型有哪些

    解读sqlalchemy的常用数据类型有哪些

    这篇文章主要介绍了解读sqlalchemy的常用数据类型有哪些,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Python实现随机生成迷宫并自动寻路

    Python实现随机生成迷宫并自动寻路

    最近在学习Python,正好今天在学习随机数,本文实现了Python实现随机生成迷宫并自动寻路,感兴趣的可以了解一下
    2021-06-06
  • Python中Numpy模块使用详解

    Python中Numpy模块使用详解

    这篇文章主要介绍了Python中Numpy模块使用详解,NumPy是Python 的一个扩展程序库,支持大量的维度数组与矩阵运算。更多相关内容需要的朋友可以参考一下
    2022-07-07
  • 已安装Pytorch却提示no moudle named 'torch'(没有名称为torch的模块)

    已安装Pytorch却提示no moudle named 'torch'(没有名称为torch

    这篇文章主要给大家介绍了关于已安装Pytorch却提示no moudle named 'torch'(没有名称为torch的模块)的相关资料,当提示"No module named 'torch'"时,可能是由于安装的Pytorch版本与当前环境不匹配导致的,需要的朋友可以参考下
    2023-11-11

最新评论