pytorch的四个hook函数
训练神经网络模型有时需要观察模型内部模块的输入输出,或是期望在不修改原始模块结构的情况下调整中间模块的输出,pytorch可以用hook回调函数来实现这一功能。主要使用四个hook注册函数:register_forward_hook、register_forward_pre_hook、register_full_backward_hook、register_full_backward_pre_hook。这四个函数可以被继承nn.Module的任意模块调用,传入hook函数并进行注册,从而在执行该模块的相应阶段调用hook函数实现所需功能。
register_forward_hook(self, hook, *, prepend, with_kwargs)
为模块注册一个在该模块前向传播之后执行的回调函数。
hook(module, args, output):需执行的回调函数对象,module为当前模块引用,args为当前模块前向传播输入,output为当前模块前向传播输出。可以返回修改后的output来修改该模块前向传播输出。
prepend:将该hook函数放在回调函数列表最前面,从而最先执行,否则放在队列最后。
with_kwargs:hook函数是否传入关键字参数,如果为True,则hook额外增加关键字参数,变为 hook(module, args, kwargs, output)。注意!如果with_kwargs=False,模块传入的关键字参数将不会被捕获,坑了我一个下午。
register_forward_hook注册函数本身返回一个handle句柄,可执行handle.remove()将注册的该hook函数移除。
register_forward_pre_hook(self, hook, *, prepend, with_kwargs)
为模块注册一个在该模块前向传播之前执行的回调函数。
hook(module, args):args为该模块前向传播输入。可以返回修改后的args来修改该模块前向传播输入。
其它参数、特性与前面一致。
register_full_backward_hook(self, hook, prepend)
为模块注册一个在该模块反向传播之后执行的回调函数。
hook(module, grad_input, grad_output):grad_input与grad_output分别为该模块前向传播输入和输出的梯度。可以返回修改后的grad_input来修改该模块前向传播输入的梯度。
register_full_backward_pre_hook(self, hook, prepend)
为模块注册一个在该模块反向传播之前执行的回调函数。
hook(module, grad_output):grad_output为该模块前向传播输出的梯度。可以返回修改后的grad_output来修改这一梯度。
pytorch的四个hook函数的更多相关文章
- [PyTorch 学习笔记] 5.2 Hook 函数与 CAM 算法
本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson5/hook_fmap_vis.py https://gi ...
- Java语言程序设计(基础篇) 第四章 数学函数、字符和字符串
第四章 数学函数.字符和字符串 4.2 常用数学函数 方法分三类:三角函数方法(trigonometric method).指数函数方法(exponent method)和服务方法(service m ...
- SQL2005四个排名函数(row_number、rank、dense_rank和ntile)的比较
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: .row_number .rank .dense_rank .ntile 下面分别介绍一下这四个 ...
- 四个排名函数(row_number、rank、dense_rank和ntile)的比较
排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 下面分别介绍一 ...
- HOOK函数(一)——进程内HOOK
什么是HOOK呢?其实很简单,HOOK就是对Windows消息进行拦截检查处理的一个函数.在Windows的消息机制中,当用户产生消息时,应用程序通过调用GetMessage函数取出消息,然后把消息放 ...
- sql 的是四个排名函数
四个排名函数的用法: http://www.cnblogs.com/xhyang110/archive/2009/10/27/1590448.html 字符串分割:http://www.cnblogs ...
- Python 全栈开发四 python基础 函数
一.函数的基本语法和特性 函数的定义 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数 ...
- JMeter学习(十四)JMeter函数学习(转载)
转载自 http://www.cnblogs.com/yangxia-test JMeter函数是一些能够转化在测试树中取样器或者其他配置元件的域的特殊值.一个函数的调用就像这样:${_functio ...
- Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究
Python进阶----反射(四个方法),函数vs方法(模块types 与 instance()方法校验 ),双下方法的研究 一丶反射 什么是反射: 反射的概念是由Smith在1982年首次提出的 ...
- Pytorch中randn和rand函数的用法
Pytorch中randn和rand函数的用法 randn torch.randn(*sizes, out=None) → Tensor 返回一个包含了从标准正态分布中抽取的一组随机数的张量 size ...
随机推荐
- Ubuntu 修改密码
强制修改密码 可以通过切换到 root 帐户强制修改密码来绕过密码长度限制: sudo su # 切换到 root 帐户 passwd USER # 修改密码 或者: sudo passwd $(wh ...
- express项目的创建
前言 前端开发者若要进行后端开发,大多都会选择node.js,在node生态下是有大量框架的,其中最受新手喜爱的便是老牌的express.js,接下来我们就从零创建一个express项目. 安装nod ...
- 【计算机视觉前沿研究 热点 顶会】ECCV 2024中目标检测有关的论文
整值训练和尖峰驱动推理尖峰神经网络用于高性能和节能的目标检测 与人工神经网络(ANN)相比,脑激励的脉冲神经网络(SNN)具有生物合理性和低功耗的优势.由于 SNN 的性能较差,目前的应用仅限于简单的 ...
- JavaScript – ECMAScript 版本
参考 TC39.ECMA-262.ECMAScript 的一些事儿 简史 es3 千禧年后稳定版 es4 革命版本, 最后在 2008 年难产了 es5 2009 年推出, 拿了 es4 一些比较简单 ...
- SpringMVC —— 入门案例执行流程
启动服务器初始化过程 1.服务器启动,执行ServletContainersInitConfig类,初始化web容器 2.执行createServletApplicationContext方法, ...
- 离线安装Nginx
离线安装nginx gcc-c++ 该链接内有安装nginx所需的环境 openssl.pcre.zlib 直接执行该命令安装即可 rpm -Uvh *.rpm --nodeps --force 将下 ...
- select框多选(利用Bootstrap-select)
前端HTML: <select id="usertype" multiple class="selectpicker" style="width ...
- Cache和DMA一致性
DMA应该多多少少知道点吧.DMA(Direct Memory Access)是指在外接可以不用CPU干预,直接把数据传输到内存的技术.这个过程中可以把CPU解放出来,可以很好的提升系统性能.那么DM ...
- /proc/pids/maps
本实例中的用户空间地址从 0x00000000 到 0x80000000,从地址空间划分可知,从低到高依次是: 可执行文件的代码段.数据段.BSS段. 堆heap. 文件映射和匿名映射,包括vdso. ...
- iOS比较枚举NSOrderedSame NSOrderedAscending NSOrderedDescending使用小结
项目开发中偶然间看到这种比较枚举,之前没注意过,仔细研究了一下结果还挺有意思,我们可以用升降序相等来帮助理解比较结果. NSString 两个字符串的比较,用 a compare:b 来比,得出的结果 ...