在pytorch中对非叶节点的变量计算梯度实例


Posted in Python onJanuary 10, 2020

在pytorch中一般只对叶节点进行梯度计算,也就是下图中的d,e节点,而对非叶节点,也即是c,b节点则没有显式地去保留其中间计算过程中的梯度(因为一般来说只有叶节点才需要去更新),这样可以节省很大部分的显存,但是在调试过程中,有时候我们需要对中间变量梯度进行监控,以确保网络的有效性,这个时候我们需要打印出非叶节点的梯度,为了实现这个目的,我们可以通过两种手段进行。

在pytorch中对非叶节点的变量计算梯度实例

注册hook函数

Tensor.register_hook[2] 可以注册一个反向梯度传导时的hook函数,这个hook函数将会在每次计算 关于该张量 在pytorch中对非叶节点的变量计算梯度实例 的时候 被调用,经常用于调试的时候打印出非叶节点梯度。当然,通过这个手段,你也可以自定义某一层的梯度更新方法。[3] 具体到这里的打印非叶节点的梯度,代码如:

def hook_y(grad):
 print(grad)

x = Variable(torch.ones(2, 2), requires_grad=True)
y = x + 2
z = y * y * 3

y.register_hook(hook_y) 

out = z.mean()
out.backward()

输出如:

tensor([[4.5000, 4.5000],
  [4.5000, 4.5000]])

retain_grad()

Tensor.retain_grad()显式地保存非叶节点的梯度,当然代价就是会增加显存的消耗,而用hook函数的方法则是在反向计算时直接打印,因此不会增加显存消耗,但是使用起来retain_grad()要比hook函数方便一些。代码如:

x = Variable(torch.ones(2, 2), requires_grad=True)
y = x + 2
y.retain_grad()
z = y * y * 3
out = z.mean()
out.backward()
print(y.grad)

输出如:

tensor([[4.5000, 4.5000],
  [4.5000, 4.5000]])

以上这篇在pytorch中对非叶节点的变量计算梯度实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
删除目录下相同文件的python代码(逐级优化)
May 25 Python
Python学习之asyncore模块用法实例教程
Sep 29 Python
使用Python进行二进制文件读写的简单方法(推荐)
Sep 12 Python
Python复数属性和方法运算操作示例
Jul 21 Python
Django学习笔记之ORM基础教程
Mar 27 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
初探利用Python进行图文识别(OCR)
Feb 26 Python
Django中使用 Closure Table 储存无限分级数据
Jun 06 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Pytorch之parameters的使用
Dec 31 Python
Python语言异常处理测试过程解析
Jan 08 Python
python如何获取apk的packagename和activity
Jan 10 #Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
Jan 10 #Python
python颜色随机生成器的实例代码
Jan 10 #Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 #Python
Python GUI自动化实现绕过验证码登录
Jan 10 #Python
pytorch nn.Conv2d()中的padding以及输出大小方式
Jan 10 #Python
如何给Python代码进行加密
Jan 10 #Python
You might like
PHP JSON 数据解析代码
2010/05/26 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP实现与java 通信的插件使用教程
2019/08/11 PHP
JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法
2016/05/19 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
深入了解Python数据类型之列表
2016/06/24 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
Python的pygame安装教程详解
2020/02/10 Python
使用TFRecord存取多个数据案例
2020/02/17 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
彪马加拿大官网:PUMA加拿大
2018/10/04 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
Python面试题:如何用Python来发送邮件
2016/03/15 面试题
2013年员工自我评价范文
2013/12/27 职场文书
毕业生个人投资创业计划书
2014/01/04 职场文书
导游实习生自荐书
2014/01/28 职场文书
学生自我评价范文
2014/02/02 职场文书
将相和教学反思
2014/02/04 职场文书
教学评估实施方案
2014/03/16 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
募捐倡议书
2014/04/14 职场文书
500字作文之周记
2019/12/13 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python