在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中列表和元组的相关语句和方法讲解
Aug 20 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
快速了解Python中的装饰器
Jan 11 Python
对Python 内建函数和保留字详解
Oct 15 Python
Python中文编码知识点
Feb 18 Python
python解析yaml文件过程详解
Aug 30 Python
Python中断多重循环的思路总结
Oct 04 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
详解scrapy内置中间件的顺序
Sep 28 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
一篇文章弄懂Python中的内建函数
Aug 07 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生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
php命令行用法入门实例教程
2014/10/27 PHP
php猜单词游戏
2015/09/29 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
2018/05/03 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
2019/04/10 Javascript
javascript中的with语句学习笔记及用法
2020/02/17 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
Python中用于计算对数的log()方法
2015/05/15 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
python实现按首字母分类查找功能
2019/10/31 Python
python manage.py runserver流程解析
2019/11/08 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
英国香水店:The Perfume Shop
2017/03/27 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
2015年全民国防教育日活动总结
2015/03/23 职场文书
2015年商场工作总结
2015/04/27 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis