关于pytorch求导总结(torch.autograd)

 更新时间:2023年06月14日 10:05:44   作者:不知名大学僧  
这篇文章主要介绍了关于pytorch求导总结(torch.autograd),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1、Autograd 求导机制

我们在用神经网络求解PDE时, 经常要用到输出值对输入变量(不是Weights和Biases)求导;

例如在训练WGAN-GP 时, 也会用到网络对输入变量的求导,pytorch中通过 Autograd 方法进行求导

其求导规则如下:

1.1当x为向量,y为一标量时

通过autograd 计算的梯度为:

1.2先假设x,y为一维向量

其对应的jacobi(雅可比)矩阵为

grad_outputs 是一个与因变量 y 的shape 一致的向量

在给定grad_outputs 后,通过Autograd 方法 计算的梯度如下:

1.3当 x 为1维向量,Y为2维向量

给出grad_outputs与Y的shape一致

Y 与x的jacobi矩阵

则 Y 对 x 的梯度:

1.4当 X ,Y均为2维向量时

​​​​​​​

1.5当XY为更高维度时

可以按照上述办法转化为低维度的求导

值得注意的是:

求导后的梯度shape总与自变量X保持一致对自变量求导的顺序并不会影响结果,某自变量的梯度值会放到该自变量原来相同位置梯度是由每个自变量的导数值组成的向量,既有大小又有方向grad_outputs 与 因变量Y的shape一致,每一个参数相当于对因变量中相同位置的y进行一个加权。

2、pytorch求导方法

2.1在求导前需要对需要求导的自变量进行声明

2.2torch.autograd.gard()

grad =  autograd.grad( outputs, inputs, grad_outputs=None, retain_graph=None,    create_graph=False, only_inputs=True, allow_unused=False )

参数解释:

  • outputs:求导的因变量 Y
  • inputs : 求导自变量 X
  • grad_outputs:

当outputs为标量时,grad_outputs=None , 不需要写,当outputs 为向量,需要为其声明一个与outputs相同shape的参数矩阵,该矩阵中的每个参数的作用是,对outputs中相同位置的y进行一个加权。

不然会报错

autograd.grad()返回的是元组数据类型,元组的长度与inputs长度相同,元组中每个单位的shape与相同位置的inputs相同

retain_graph:

1、当求完一次梯度后默认会把图信息释放掉,都会free掉计算图中所有缓存的buffers,当要连续进行几次求导时,可能会因为前面buffers不存在而报错。

因为第二个梯度计算z对x的导数,需要y对x的计算导数的缓存信息,但是在计算grad1后,保存信息被释放,找不到了,因此报错。

修改如下:

2、一般计算的最后一个梯度可以不需要保存计算图信息,这样在计算后可以及时释放掉占用的内存。

3、在pytorch中连续多次调用backward()也会出现这样的问题,对中间的backwad(),需要保持计算图信息

create_graph: 若要计算高阶导数,则必须选为True

求二阶导方法如下:

allow_unused: 允许输入变量不进入计算

2.3torch.backward()

def backward(
                        gradient: Optional[Tensor] = None,
                        retain_graph: Any = None,
                        create_graph: Any = False,
                        inputs: Any = None) -> Any
                                                )

如果需要计算导数,可以在tensor上直接调用.backward(),会返回该tensor所有自变量的导数。

通过name(自变量名).grad 可以获得该自变量的梯度如果tensor是标量,则backward()不需要指定任何参数如果tensor是向量,则backward()需要指定gradient一个与tensorshape相同的参数矩阵,即这里的gradient 同 grad_outputs 作用和形式完全一样。

总结

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

相关文章

  • 解决python报错MemoryError的问题

    解决python报错MemoryError的问题

    今天小编就为大家分享一篇解决python报错MemoryError的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python中的随机函数random详解

    Python中的随机函数random详解

    大家好,本篇文章主要讲的是Python中的随机函数random详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法

    Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法

    这篇文章主要给大家介绍了关于Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法,分享出来,对同样遇到这个问题的朋友们一个参考学习,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • 如何使用python爬取知乎热榜Top50数据

    如何使用python爬取知乎热榜Top50数据

    主要是爬取知乎热榜的问题及点赞数比较高的答案,通过requests请求库进行爬取,对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-09-09
  • 利用python实现简易版的贪吃蛇游戏(面向python小白)

    利用python实现简易版的贪吃蛇游戏(面向python小白)

    这篇文章主要给大家介绍了关于如何利用python实现简易版的贪吃蛇游戏的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Python能干什么、Python主要应用于哪些方面

    Python能干什么、Python主要应用于哪些方面

    无论是从入门级选手到专业级选手都在做的爬虫,还是Web程序开发、桌面程序开发还是科学计算、图像处理, Python都可以胜任。Python为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、 数据库、文本等大量内容。用Python开发,许多功能不必从零编写
    2023-06-06
  • Python HMAC模块维护数据安全技术实例探索

    Python HMAC模块维护数据安全技术实例探索

    本篇博客将带领读者深入探索Python中HMAC模块的高级应用,通过丰富的示例代码和详细的解释,揭示HMAC在实际应用场景中的多面光芒,从基础概念到密码存储、文件完整性验证、API安全,再到与加密算法的巧妙结合
    2024-01-01
  • 使用PDB简单调试Python程序简明指南

    使用PDB简单调试Python程序简明指南

    这篇文章主要介绍了使用PDB简单调试Python程序简明指南,本文讲解了使用PDB调试程序的简单技巧,方便、简洁实用,需要的朋友可以参考下
    2015-04-04
  • Python实现统计文章阅读量的方法详解

    Python实现统计文章阅读量的方法详解

    这篇文章主要为大家详细介绍了如何溧阳Python语言实现统计文章阅读量的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • Python中json.dumps()和json.dump()的区别小结

    Python中json.dumps()和json.dump()的区别小结

    在Python中,json.dumps()和json.dump()是两个常用的函数,本文主要介绍了Python中json.dumps()和json.dump()的区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02

最新评论