register_backward_hook()和register_forward_hook()

2023-10-31 01:40
文章标签 forward backward register hook

本文主要是介绍register_backward_hook()和register_forward_hook(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

结论:

一:register_forward_hook()在指定网络层执行完前向传播后调用钩子函数

二:

1:register_backward_hook()在指定网络层执行完backward()之后调用钩子函数

2:register_backward_hook()返回的grad_input是关于所有输入变量的梯度,也就是说grad_input是个元组,包含有对该层网络的权重weight的梯度,偏置bias的梯度,以及该层输入x的梯度

3:grad_input元组中,关于权重,偏置和输入x的梯度的顺序,不同网络层是不一样的,比如

对于nn.Linear层,grad_input是按照bias的梯度,x的梯度,weight的梯度排列的。而在nn.Conv2d()层,grad_input是按照x的梯度,weight的梯度,bias的梯度排列的。

最后,这两个函数都会返回一个句柄handle,这个handle有一个remove()方法,用于将钩子函数从网络中去除。


一:

register_forward_hook(hook_fuc)中的hook_fuc函数需要有三个hook_func(model, input, output)这里的input和output是比较好理解的,因为是前向传播,所以input就是输入网络层的输入,output就是该层网络的输出。(注意,hook_func是在该层网络前向传播完成以后执行)

二:

1:register_backward_hook(hook_func),首先要明确,这里的hook_func只有在网络执行backward()之后才会调用,这里的hook_func(model,grad_input,grad_output)也包含三个参数,model即需要调用的网络层,grad_input是该层网络的所有输入的梯度,也就是包含有该层网络输入偏差的梯度,该层网络输入变量x的梯度(也就是变量x所有权重之和),以及改成网络权重的梯度(也就是输入x);而grad_output是指该层网络输出的梯度(这里可能有点疑问,接下来重点讲一下)

2:在nn.Linear层可以看到,这里的grad_input实际上是一个元组,包含三a:biasb:输入变量x的梯度(实际上就是weight的c:模型权重weight的梯度(实际上就是x)。

注意,我们这里y在求导的时候,是给了权重[[2,1]]的,计算过程如下:

3:我们可以看在nn.Conv2d层:结果如下

这篇关于register_backward_hook()和register_forward_hook()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/311942

相关文章

【hdu】Just a Hook(线段树区间修改)

线段树模板题,练的是懒惰标记。 懒惰标记,就是更新一段区间的时候,如果小区间被包含在了所需要更新的区间里面,那么直接对代表这个区间的数组元素赋值,之后做一个标记(表示这个区间的子区间都需要更新)但是不继续递归(这样可以节省很多的时候)。 116571152014-09-15 14:17:26Accepted1698796MS2380K1750 BG++KinderRiven #

【C++】win7 64下VC++6.0(Unable to register this add-in because its DLLRegisterServer return an error)

 FileTool.exe用于替换 Visual C++ 使用开发人员 Studio 对象模型中的打开和添加到项目菜单项。也是一个修复 VC6.0打开文件时出错退出的插件。 1. 下载FileTool.exe,并解压 2. 打开VC6.0,点击File-Open Workspace,选择刚解压出来的FileTool.dsw,并确定 3. 点击Bulid-Build FileTool.

react、vue 提供的 hook 函数对比

文章目录 useMemo vs computeduseEffect vs watch useMemo vs computed React 的useMemo 和 Vue3 的computed 分别用于优化性能和避免不必要的计算的两个概念。它们的目标相似,但实现方式和使用场景有所不同。它们都用于优化那些依赖于其他状态或属性,并且计算成本较高的表达式。以下是它们的主要区别: Rea

前向保密(Forward Secrecy,也称为完美前向保密,Perfect Forward Secrecy,PFS)

前向保密(Forward Secrecy,也称为完美前向保密,Perfect Forward Secrecy,PFS)是一种加密通信协议的属性,它确保即使在未来某个时间点上长期使用的私钥(如服务器的私钥)被泄露,攻击者也无法解密之前已经捕获并记录的加密通信内容。这意味着每次通信会话都使用一个独立的、临时的会话密钥进行加密,即使主私钥被泄露,之前的通信记录也仍然保持安全。 工作原理 前向保密通常

企业微信hook协议接口,聚合群聊客户管理工具开发

服务提供了丰富的API和SDK,可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互,可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作,通过接口可以实现自动回复、定时发送消息等功能,可以用来获取用户信息、添加或删除用户,发送文本消息、图片、文件、语音、视频等多种类型的消息,可以监听特定类型的消息,支持朋友圈

chrome 中class not register解决

刚刚上一篇博客更换帐户名为英文后,chrome的taskbar和开始菜单中的快捷方式一直这个问题。 查了查,说什么要改注册表。 但是chrome.exe可以正常工作,数据也都在。 刚刚发现一个特简单的方法。 在C盘搜索chrome, 删除quicklaunch和startmenu的快捷方式,然后把chrome.exe重新固定到这两个地方就ok了。 不过我之前清理注册表了,不知道这个需不

Android Hook ActivityThread mH 消息

背景: 今天面试被问到如何监听ActivityThread mH 类的消息,当时的想法是,mH 其实就是Handler, Android 没有提供获取到mH 的方法,就算我可以拿到mH 的 Looper, 最多也就可以在Looper 里面设置一个private Printer mLogging; ,当打印的时候就可以知道当前在分发mH 类的任何消息。 但是对方说,不希望在这里拦截,有没有其他方

【精讲】PCIe基础篇——BAR(Base Address Register)详解

一、为什么需要BAR         系统中的每个设备中,对地址空间的大小和访问方式可能有不同的需求,例如,一个设备可能有256字节的内部寄存器/存储,应该可以通过IO地址空间访问,而另一个设备可能有16KB的内部寄存器/存储,应该可以通过基于MMIO的设备访问。哪些地址应该使用哪种方式(IO或Memory)来访问它们的内部位置,这是系统软件(即BIOS和OS内核)的工作。因此设备必须为系统软件

linux内核hook技术之函数地址替换

前言     函数地址替换是一种更为简单、常见的hook方式,比如对security_ops、sys_call_table等结构中的函数进行替换,来完成自己的安全权限控制。     其中security_ops是LSM框架中所使用的,sys_call_table是系统调用表结构。当然了,这些结构目前在内核中都已经是只读数据结构了,如果想直接进行函数替换的话,首先就是考虑解决关闭写保护的问题。在

linux内核hook技术之跳转指令偏移值

前言     在另一篇博文中提到了指令覆盖和指令注入的hook方式,使用覆盖和注入方式完成内核函数hook,需要有很多的注意事项,而且容易被检测工具检测。这篇博文则聊一下如何通过替换跳转指令偏移值来完成内核函数的hook,这种hook技术也可以称为inline hook。     事先做个准备工作,手头正好有centos 6系列操作系统,还有一个热腾腾刚出锅的vmlinux。通过 gdb  v