在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语言技巧之三元运算符使用介绍
Mar 04 Python
python实现的解析crontab配置文件代码
Jun 30 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
详解Python实现多进程异步事件驱动引擎
Aug 25 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
Dec 21 Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 Python
十分钟利用Python制作属于你自己的个性logo
May 07 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
浅析python中的迭代与迭代对象
Oct 08 Python
Python3 中sorted() 函数的用法
Mar 24 Python
python实现飞船大战
Apr 24 Python
详解anaconda离线安装pytorchGPU版
Sep 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使HTML标签自动补全闭合函数代码
2012/10/04 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
PHP数字金额转换成中文大写显示
2019/01/05 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[01:14:05]《加油DOTA》第四期
2014/08/25 DOTA
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
pycharm+django创建一个搜索网页实例代码
2018/01/24 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
使用 Python 实现微信群友统计器的思路详解
2018/09/26 Python
python 图片去噪的方法示例
2019/07/09 Python
python实现操作文件(文件夹)
2019/10/31 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
python mysql中in参数化说明
2020/06/05 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
中间件分为哪几类
2012/03/14 面试题
什么是组件架构
2016/05/15 面试题
高级电工工作职责
2013/11/21 职场文书
生活小常识广播稿
2014/09/16 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
浅谈Python数学建模之固定费用问题
2021/06/23 Python
Golang 遍历二叉树
2022/04/19 Golang
Python可视化神器pyecharts绘制水球图
2022/07/07 Python