pytorch hook 钩子函数的用法

这篇文章主要介绍了pytorch hook 钩子函数的用法,Hook 是 PyTorch 中一个十分有用的特性,使用后可以不必改变网络输入输出的结构,方便地获取、改变网络中间层变量的值和梯度,下文详细介绍需要的小伙伴可以参考一下

钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。

Hook 是 PyTorch 中一个十分有用的特性。利用它,我们可以不必改变网络输入输出的结构,方便地获取、改变网络中间层变量的值和梯度。这个功能被广泛用于可视化神经网络中间层的 featuregradient,从而诊断神经网络中可能出现的问题,分析网络有效性。

本文主要用 hook 函数输出网络执行过程中 forward 和 backward 的执行顺序,以此找到了bug所在。

用法如下:

# 设置hook func
def hook_func(name, module):
    def hook_function(module, inputs, outputs):
        # 请依据使用场景自定义函数
        print(name+' inputs', inputs)
        print(name+' outputs', outputs)
    return hook_function

# 注册正反向hook
for name, module in model.named_modules():
    module.register_forward_hook(hook_func('[forward]: '+name, module))
    module.register_backward_hook(hook_func('[backward]: '+name, module))

如一个简单的 MNIST 手写数字识别的模型结构如下:

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout1 = nn.Dropout(0.25)
        self.dropout2 = nn.Dropout(0.5)
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = F.max_pool2d(x, 2)
        x = self.dropout1(x)
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.dropout2(x)
        x = self.fc2(x)
        output = F.log_softmax(x, dim=1)
        return output

打印模型:

Net(
  (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1))
  (conv2): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1))
  (dropout1): Dropout(p=0.25, inplace=False)
  (dropout2): Dropout(p=0.5, inplace=False)
  (fc1): Linear(in_features=9216, out_features=128, bias=True)
  (fc2): Linear(in_features=128, out_features=10, bias=True)
)

构建hook函数:

# 设置hook func
def hook_func(name, module):
    def hook_function(module, inputs, outputs):
        with open("log_model.txt", 'a+') as f:
            # 请依据使用场景自定义函数
            f.write(name + '   len(inputs): ' + str(len(inputs)) + '\n')
            f.write(name + '   len(outputs):  ' + str(len(outputs)) + '\n')
    return hook_function

# 注册正反向hook
for name, module in model.named_modules():
    module.register_forward_hook(hook_func('[forward]: '+name, module))
    module.register_backward_hook(hook_func('[backward]: '+name, module))

输出的前向和反向传播过程:

[forward]: conv1   len(inputs): 1
[forward]: conv1   len(outputs):  8
[forward]: conv2   len(inputs): 1
[forward]: conv2   len(outputs):  8
[forward]: dropout1   len(inputs): 1
[forward]: dropout1   len(outputs):  8
[forward]: fc1   len(inputs): 1
[forward]: fc1   len(outputs):  8
[forward]: dropout2   len(inputs): 1
[forward]: dropout2   len(outputs):  8
[forward]: fc2   len(inputs): 1
[forward]: fc2   len(outputs):  8
[forward]:    len(inputs): 1
[forward]:    len(outputs):  8
[backward]:    len(inputs): 2
[backward]:    len(outputs):  1
[backward]: fc2   len(inputs): 3
[backward]: fc2   len(outputs):  1
[backward]: dropout2   len(inputs): 1
[backward]: dropout2   len(outputs):  1
[backward]: fc1   len(inputs): 3
[backward]: fc1   len(outputs):  1
[backward]: dropout1   len(inputs): 1
[backward]: dropout1   len(outputs):  1
[backward]: conv2   len(inputs): 2
[backward]: conv2   len(outputs):  1
[backward]: conv1   len(inputs): 2
[backward]: conv1   len(outputs):  1

因为只要模型处于train状态,hook_func 就会执行,导致不断输出 [forward] 和 [backward],所以将输出内容建议写到文件中,而不是 print

到此这篇关于pytorch hook 钩子函数的用法的文章就介绍到这了,更多相关pytorch hook 钩子函数内容请搜索昆居客【www.kunjuke.com】以前的文章或继续浏览下面的相关文章希望大家以后多多支持昆居客【www.kunjuke.com】!

相关推荐:

迷你世界工具大全用法2026

迷你世界里面有很多的道具物品,今天给大家带来了游戏里面的最新版本的工具大全用法,还有小伙伴不清楚游戏里面的工具怎么用,那么下面就是具体的内容. 迷你世界工具大全用法 氧气面罩 属性:工具 解锁途径:无需解锁 需要材料 棉花*2 雀莺羽毛*1 合成台 工具箱 用途:使用雀莺的羽毛制成的密封性极好的面罩,是星球旅行的必备装。装备到头部可以抵御外星恶劣的缺氧环境,装备会扣除耐久度,耐久度为0时装备会消失...

《挖掘者米娜》沼泽梯子用法介绍

《挖掘者米娜》中的平基沙龙商店里面的梯子是游戏里非常重要的一种工具,用得好能够得到很多好东西,首先梯子要偷偷摸摸的用,不能跑到平基的面前,要不然你就会被扔到外面,首先是蕾丝手套,就在沙龙商店的高处平台上。 挖掘者米娜沼泽梯子怎么用 店里梯子拿到的是魔能匣我记错了,漏了一个拿到梯子往沼泽入口走有俩灯地方放上去有个一火花能进的洞,靠提灯的光走到最后有一瓶血浆上限。 本文内容来源于互联网,如有侵权请联系...

OPPO Reno2从入门到精通:日常办公与娱乐提效5大核心用法【汇总】

OPPO Reno2通过ColorOS 6.1~7.2实现高效办公与娱乐:支持三指上滑分屏、横屏视频分屏回复、超级文本识别、全局字幕、私密保险箱及应用分身,各功能均需按步骤启用并满足特定条件。 OPPO Reno2日常办公与娱乐提效,核心在于把系统级多任务、智能识别和快捷交互能力真正用进真实场景——比如一边看会议视频一边记笔记,边刷短视频边查资料,或快速提取合同文字转成可编辑文档,这些都不是“可能...

Gemini3.5长文本处理落地踩坑与实战用法总结

做文档分析和代码审计时我会在kula ai聚合平台(leadhi.cn)上同时调几个模型对比长文本处理效果。最近密集用gemini 3.5 flash处理了一批万字级技术文档和合同,踩了不少坑也有些真感受。结合5月20日谷歌i/o大会的新消息和5月28日刚爆出的事故聊聊。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ --- 上下文窗口到了...

悟空浏览器怎么设置长按图片识别二维码_悟空浏览器识图功能用法

悟空浏览器网页图片长按识别二维码需启用“以图搜图”开关、授予照片/剪贴板/存储权限、更新至v5.8.0及以上版本、开启开发者模式调试或使用截图+相册识别备用方案。 如果您在悟空浏览器中打开网页后长按图片无法识别其中的二维码,则可能是功能未启用、权限缺失、版本过低或图片本身不支持交互。以下是实现网页图片长按识别二维码的具体操作步骤: 一、启用网页图片长按识别基础开关 该功能依赖浏览器内置的图像解析模...

Cursor重构函数提示词怎么写才能保持输入输出不变

必须锁定接口契约、禁止修改调用侧可见行为、提供与原逻辑一致的测试用例:明确写出函数签名与docstring,禁止更改函数名、参数顺序、默认值、返回类型及边界响应,附准确断言示例。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 要让Cursor在重构函数时严格保持原有输入输出行为不变,关键在于提示词必须锁定接口契约、禁止修改调用侧可见部分,并...
· AI · 126242

PPT怎么插入倒计时 演讲比赛PPT倒计时插件用法

最稳妥方案是用AppSource认证插件插入Live Timer Pro倒计时器,适用于Microsoft 365用户;无网络或旧版PPT可用逐帧消失动画备用;需灵活控制则用TimeLeft软件叠加投屏。 演讲比赛对时间控制极为敏感,超时直接扣分,PPT里必须嵌入一个能全屏显示、自动启动、带声音提示的倒计时器,不能依赖手动点击或切换幻灯片来触发。 用AppSource认证插件插入专业倒计时器 这是...

Excel如何快速填充上万行数据 填充序列的高级用法

Excel万行序列生成有五法:1.序列对话框精准填数字;2.ROW函数动态编号;3.Ctrl+Enter灌相同值;4.Ctrl+E快速填充识别模式;5.双击填充柄智能延伸。 要在Excel中一次性生成上万行有规律的序列数据,比如1到10000的编号、连续工作日、年份递增日期或带前缀的流水号,不能靠手动拖拽——光标抖动一次就可能多拉几百行,还容易卡死。必须用系统级填充机制绕过界面响应瓶颈。 用序列对...