在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 环境变量和import模块导入方法(详解)
Jul 11 Python
Python优先队列实现方法示例
Sep 21 Python
python爬虫实例详解
Jun 19 Python
Python 对输入的数字进行排序的方法
Jun 23 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Python中remove漏删和索引越界问题的解决
Mar 18 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
Django实现前台上传并显示图片功能
May 29 Python
基于python实现图片转字符画代码实例
Sep 04 Python
python 爬取天气网卫星图片
Jun 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
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
数理公式,也可以这么唯美
2021/03/10 无线电
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
2012/02/27 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
javascript中的遍历for in 以及with的用法
2014/12/22 Javascript
JS实现固定在右下角可展开收缩DIV层的方法
2015/02/13 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
基于vue的验证码组件的示例代码
2019/01/22 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
python 捕获shell脚本的输出结果实例
2017/01/04 Python
浅谈Python中函数的定义及其调用方法
2019/07/19 Python
django重新生成数据库中的某张表方法
2019/08/28 Python
vscode调试django项目的方法
2020/08/06 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
产品生产计划书
2014/05/07 职场文书
小学生学习雷锋倡议书
2014/05/15 职场文书
建设工程授权委托书
2014/09/22 职场文书
工地材料员岗位职责
2015/04/11 职场文书
2019年感恩励志演讲稿(收藏备用)
2019/09/11 职场文书
解决Golang time.Parse和time.Format的时区问题
2021/04/29 Golang
Nginx实现会话保持的两种方式
2022/03/18 Servers
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
python的html标准库
2022/04/29 Python