知识点回顾
- 回调函数
- lambda函数
- hook函数的模块钩子和张量钩子
- Grad-CAM的示例
一、回调函数示例
# 训练过程中的回调函数
class Callback:
def on_train_begin(self):
print("训练开始")
def on_epoch_end(self, epoch, logs=None):
print(f"Epoch {epoch} 完成")
# 使用示例
callback = Callback()
callback.on_train_begin()
for epoch in range(10):
# ...训练代码...
callback.on_epoch_end(epoch)
二、lambda函数示例
# 简单lambda
add = lambda x, y: x + y
# 在PyTorch中的使用
data = torch.randn(10)
processed = list(map(lambda x: x*2, data)) # 每个元素乘以2
三、hook函数示例
# 模块钩子
model = nn.Sequential(nn.Linear(10,5), nn.ReLU())
def module_hook(module, input, output):
print(f"{module.__class__.__name__} 输出形状: {output.shape}")
model[0].register_forward_hook(module_hook)
# 张量钩子
x = torch.randn(3, requires_grad=True)
x.register_hook(lambda grad: grad * 0.5) # 梯度修改
四、Grad-CAM示例
class GradCAM:
def __init__(self, model, target_layer):
self.model = model
self.gradients = None
self.activations = None
target_layer.register_forward_hook(self.save_activations)
target_layer.register_backward_hook(self.save_gradients)
def save_activations(self, module, input, output):
self.activations = output.detach()
def save_gradients(self, module, grad_input, grad_output):
self.gradients = grad_output[0].detach()
def __call__(self, x, class_idx=None):
# ...前向/反向传播逻辑...
cam = torch.relu(torch.sum(self.activations * weights, dim=1))
return cam
关键点说明:
-
回调函数常用于训练过程监控
-
lambda适合简单操作,复杂逻辑建议用普通函数
-
模块钩子获取中间输出,张量钩子修改梯度
-
Grad-CAM通过hook获取梯度和激活值生成热力图