在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 05 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
Python基于贪心算法解决背包问题示例
Nov 27 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
Python3离线安装Requests模块问题
Oct 13 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
为什么python比较流行
Jun 19 Python
pycharm中使用request和Pytest进行接口测试的方法
Jul 31 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 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提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
PHP Trait代码复用类与多继承实现方法详解
2019/06/17 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
jquery获取选中的文本和值的方法
2014/07/08 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
JavaScript验证Email(3种方法)
2015/09/21 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python实现二叉搜索树
2016/02/03 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
python3操作mysql数据库的方法
2017/06/23 Python
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
求职简历自荐信
2013/10/20 职场文书
优秀生推荐信范文
2013/11/28 职场文书
初一学生评语大全
2014/04/24 职场文书
学生操行评语大全
2014/04/24 职场文书
商务日语专业的自荐信
2014/05/23 职场文书
雷人标语集锦
2014/06/19 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
公司租房协议书
2014/10/14 职场文书
2015年城市管理工作总结
2015/05/23 职场文书
python lambda 表达式形式分析
2022/04/03 Python
原生JS实现分页
2022/04/19 Javascript