在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实现的阳历转阴历(农历)算法
Apr 25 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
python使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
python机器学习案例教程——K最近邻算法的实现
Dec 28 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
Python带动态参数功能的sqlite工具类
May 26 Python
python SQLAlchemy的Mapping与Declarative详解
Jul 04 Python
将python文件打包exe独立运行程序方法详解
Feb 12 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
Python读写Excel表格的方法
Mar 02 Python
python process模块的使用简介
May 14 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
8个必备的PHP功能开发
2015/10/02 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
php实现水印文字和缩略图的方法示例
2016/12/29 PHP
文本框回车提交与禁止提交示例
2013/09/27 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
2014/12/15 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
angularjs实现上拉加载和下拉刷新数据功能
2017/06/12 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
vue实现element-ui对话框可拖拽功能
2018/08/17 Javascript
nodejs使用async模块同步执行的方法
2019/03/02 NodeJs
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
基于python时间处理方法(详解)
2017/08/14 Python
Python获取当前页面内所有链接的四种方法对比分析
2017/08/19 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
Python使用Pandas读写Excel实例解析
2019/11/19 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
基层党建工作宣传标语
2014/06/24 职场文书
工作简历自我评价
2015/03/11 职场文书
讲座通知范文
2015/04/23 职场文书
小学语文教学随笔
2015/08/14 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技