DAY48 Grad-CAM与Hook函数

目录

[1. 回调函数 (Callback Function)](#1. 回调函数 (Callback Function))

[2. lambda 函数](#2. lambda 函数)

[3. Hook 函数:模块钩子与张量钩子](#3. Hook 函数:模块钩子与张量钩子)

张量钩子 (Tensor Hook)

模块钩子 (Module 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.Conv2dnn.Linear)。

  • 注册方法

    • module.register_forward_hook(hook_fn):获取该层在前向传播时的输入和输出

    • module.register_full_backward_hook(hook_fn):获取该层在反向传播时的输入梯度和输出梯度

  • 用途:提取特征图(Feature Map)用于可视化、分析每一层的权重梯度等。

4. Grad-CAM 的示例

Grad-CAM(梯度加权类激活映射)是 Hook 函数最经典的应用场景之一,用于分析卷积神经网络(CNN)"看"到了图像的哪个部分才做出的分类决定。

核心逻辑流程:
  1. 注册 Forward Hook :在指定的卷积层(通常是最后一层)注册钩子,提取该层的前向特征图 (Feature Maps)

  2. 注册 Backward Hook :在该层注册钩子,获取该层在反向传播时的梯度 (Gradients)

  3. 计算权重:对梯度的每个通道求平均值,作为每个特征图的重要性权重。

  4. 生成热力图:将权重与特征图加权相加,经过 ReLU 处理后缩放到原始图像大小。

  5. 叠加显示:将生成的"热力图"叠加在原始图片上。

  • 原始图像:你要识别的物体(如一只狗)。

  • Grad-CAM 热力图:一张颜色斑斓的图,红色代表模型做出判断最依赖的区域。

  • 叠加热力图:你会看到红色区域正好覆盖在图像中物体的关键特征上(比如狗的头部或身躯),从而解释了模型的决策逻辑。

相关推荐
寻星探路4 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
ValhallaCoder7 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
八零后琐话8 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
青春不朽5129 小时前
Scrapy框架入门指南
python·scrapy
MZ_ZXD0019 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
全栈老石10 小时前
Python 异步生存手册:给被 JS async/await 宠坏的全栈工程师
后端·python
梨落秋霜10 小时前
Python入门篇【模块/包】
python
阔皮大师11 小时前
INote轻量文本编辑器
java·javascript·python·c#