目录
[1. 回调函数 (Callback Function)](#1. 回调函数 (Callback Function))
[2. lambda 函数](#2. lambda 函数)
[3. Hook 函数:模块钩子与张量钩子](#3. Hook 函数:模块钩子与张量钩子)
[4. Grad-CAM 的示例](#4. Grad-CAM 的示例)
1. 回调函数 (Callback Function)
回调函数是一种编程模式,简单来说就是"待会儿再调用的函数"。
-
定义 :你把函数
A作为参数传给函数B,当函数B完成了某些任务或触发了某个条件时,它会反过来调用函数A。 -
通俗比喻:你去商店买东西,现在没货,你留下电话号码(注册回调函数)。等货到了(触发条件),营业员拨打你的电话通知你(调用回调)。
-
用途:常用于异步操作、GUI 事件处理、或者像 PyTorch 这种深度学习框架中的训练监控(比如每训练一个 epoch 回调一次保存模型)。
2. lambda 函数
lambda 函数也称为匿名函数。
-
定义 :它是一种不需要显式定义函数名(即不用
def)的简短函数。在 Python 中,语法为:lambda 参数: 表达式。 -
特点:
-
只能有一行表达式。
-
会自动返回该表达式的结果。
-
-
示例:
python# 普通函数 def square(x): return x**2 # 等价的 lambda 函数 square_lambda = lambda x: x**2 -
用途 :通常用于需要一个临时小函数但不想正式定义的场景,比如作为
map()、filter()的参数,或者在 PyTorch 钩子中快速定义简单的逻辑。
3. Hook 函数:模块钩子与张量钩子
Hook(钩子)是 PyTorch 中用于拦截并获取/修改中间层信息的强大工具。它不需要修改模型的前向传播逻辑就能操作梯度或输出。
张量钩子 (Tensor Hook)
-
作用对象:特定的张量(Tensor),通常是计算图中的中间梯度。
-
注册方法 :
tensor.register_hook(hook_fn)。 -
触发时机:在反向传播(Backward)过程中,该张量的梯度被计算出来时立即调用。
-
用途:拦截、修改或打印特定张量的梯度。
模块钩子 (Module Hook)
-
作用对象 :神经网络的层(如
nn.Conv2d或nn.Linear)。 -
注册方法:
-
module.register_forward_hook(hook_fn):获取该层在前向传播时的输入和输出。 -
module.register_full_backward_hook(hook_fn):获取该层在反向传播时的输入梯度和输出梯度。
-
-
用途:提取特征图(Feature Map)用于可视化、分析每一层的权重梯度等。
4. Grad-CAM 的示例
Grad-CAM(梯度加权类激活映射)是 Hook 函数最经典的应用场景之一,用于分析卷积神经网络(CNN)"看"到了图像的哪个部分才做出的分类决定。
核心逻辑流程:
-
注册 Forward Hook :在指定的卷积层(通常是最后一层)注册钩子,提取该层的前向特征图 (Feature Maps)。
-
注册 Backward Hook :在该层注册钩子,获取该层在反向传播时的梯度 (Gradients)。
-
计算权重:对梯度的每个通道求平均值,作为每个特征图的重要性权重。
-
生成热力图:将权重与特征图加权相加,经过 ReLU 处理后缩放到原始图像大小。
-
叠加显示:将生成的"热力图"叠加在原始图片上。
-
原始图像:你要识别的物体(如一只狗)。
-
Grad-CAM 热力图:一张颜色斑斓的图,红色代表模型做出判断最依赖的区域。
-
叠加热力图:你会看到红色区域正好覆盖在图像中物体的关键特征上(比如狗的头部或身躯),从而解释了模型的决策逻辑。