点击进入专栏:
《人工智能专栏》 Python与Python | 机器学习 | 深度学习 | 目标检测 | YOLOv5及其改进 | YOLOv8及其改进 | 关键知识点 | 各种工具教程
文章目录
- 前言
-
- 如何在不改变模型结构的基础上获取特征图、梯度等信息呢?
- register_hook_一
- register_hook_二
- register_forward_hook`和`register_backward_hook
-
- register_forward_hook_二
- register_backward_hook_二
- 注意事项
- forward_register_forward_pre_hook
-
- 示例
- 可视化特征图
- 1. 机器学习
- 2. 深度学习与目标检测
- 3. YOLOv5
- 4. YOLOv5改进
- 5. YOLOv8及其改进
- 6. Python与PyTorch
- 7. 工具
- 8. 小知识点
- 9. 杂记
前言
为了更深入地理解神经网络模型,有时候我们需要观察它训练得到的卷积核、特征图或者梯度等信息,这在CNN可视化研究中经常用到。其中,卷积核最易获取,将模型参数保存即可得到;特征图是中间变量,所对应的图像处理完即会被系统清除,否则将严重占用内存;梯度跟特征图类似,除了叶子结点外,其它中间变量的梯度都被会内存释放,因而不能直接获取。
最容易想到的获取方法就是改变模型结构,在forward的最后不但返回模型的预测输出,还返回所需要的特征图等信息。
如何在不改变模型结构的基础上获取特征图、梯度等信息呢?
Pytorch的hook编程可以在不改变网络结构的基础上有效获取、改变模型中间变量以及梯度等信息。
hook可以提取或改变Tensor的梯度,也可以获取nn.Module的输出和梯度(这里不能改变)。因此有4个hook函数用于实现以上功能: