分体滑板
PyTorch中的hook机制
雨棚信号灯
(给⼤家分享⼀篇知乎上的博⽂,⾥⾯的内容⼗分全⾯和详细,结合代码由浅⼊深讲解 PyTorch 中 hook 的⽤法:半⼩时学会 PyTorch Hook。)
中的钩⼦定义:
钩⼦编程(hooking),也称作"挂钩",是计算机程序设计术语,指通过拦截软件模块间的函数调⽤、消息传递、事件传递来修改或扩展操作系统、应⽤程序或其它软件组件的⾏为的各种技术。处理被拦截的函数调⽤、事件、消息的代码,被称为钩⼦(hook)。 Hook 是 PyTorch 中⼀个⼗分有⽤的特性,通过 hook 我们可以不必改变⽹络输⼊输出的结构,⽅便地获取、改变⽹络中间层变量的值和梯度。常⽤于可视化神经⽹络中间层的 feature、gradient,从⽽诊断神经⽹络中可能出现的问题,分析⽹络有效性。 PyTorch 中注册 hook 的三种⽅式:
hook_fn签名:hook_fn(grad) -> Tensor or None
作⽤:反向传播时,可获取中间变量的梯度。
电动加油泵
移动门hook_fn签名:hook_fn(module, input, output) -> None or modified output
作⽤:前向传播时,可获取中间层模块的输⼊/输出的数值。
彩钢板安装工程scr-035
hook_fn签名:hook_fn(module, grad_input, grad_output) -> Tensor or None
作⽤:反向传播时,可获取中间层模块的输⼊/输出的梯度。
第⼀个是 register_hook,是针对 Variable 对象的,后⾯的两个:register_forward_hook 和 register_backward_hook 是针对 nn.Module 这个对象的。注册钩⼦的三个函数都返回⼀个句柄(handle),调⽤ ve() 可以移除该 hook。
下⼀篇⽂章介绍 CAM(Class Activation Mapping,类别激活映射图/类别热⼒图/显著性图) 技术,并结合 hook+CAM 进⾏可视化演⽰。