在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使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
python实现抽奖小程序
Apr 15 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
Aug 20 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
通过cmd进入python的步骤
Jun 16 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
Python同时迭代多个序列的方法
Jul 28 Python
Python 操作SQLite数据库的示例
Oct 16 Python
pymysql模块使用简介与示例
Nov 17 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 GeoIP的使用教程
2011/03/09 PHP
php设计模式  Command(命令模式)
2011/06/17 PHP
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
PHP中$this和$that指针使用实例
2015/01/06 PHP
怎样搭建PHP开发环境
2015/07/28 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
模拟一个类似百度google的模糊搜索下拉列表
2014/04/15 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
jQuery实现伸展与合拢panel的方法
2015/04/30 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
pycharm运行scrapy过程图解
2019/11/22 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
利用CSS3动画实现圆圈由小变大向外扩散的效果实例
2018/09/10 HTML / CSS
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
经济职业学院毕业生自荐书
2014/03/17 职场文书
报到证办理个人委托书
2014/10/06 职场文书
评职称个人总结
2015/03/05 职场文书
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
《群青的幻想曲》京力秋树角色PV公开
2022/04/08 日漫
基于Python实现西西成语接龙小助手
2022/08/05 Golang