当前位置: 首页 > ds >正文

Python Day42

Task: Grad-CAM与Hook函数
1.回调函数
2.lambda函数
3.hook函数的模块钩子和张量钩子
4.Grad-CAM的示例

1. 回调函数

  • 定义:回调函数是作为参数传入到其他函数中的函数,在特定事件发生时被调用。
  • 特点
    • 便于扩展和自定义程序行为。
    • 常用于训练过程中的监控、日志记录、模型保存等场景。
  • 示例
    def callback_function():print("Epoch completed!")# 传递回调函数
    trainer.train(callback=callback_function)
    

2. lambda函数

  • 定义:匿名函数,也叫lambda表达式,用于快速定义简单函数。
  • 语法
    lambda 参数: 表达式
    
  • 示例
    square = lambda x: x ** 2
    print(square(5))  # 输出25
    
  • 用途:简洁地定义短小函数,常用于回调、数据处理等场景。

3. Hook函数的模块钩子和张量钩子

  • Hook函数的作用:用来“钩住”模型内部的中间变量或梯度,从而监控或修改它们。

  • 模块钩子(Module Hooks)

    • 用途:挂载在模型的子模块(如卷积层、线性层)上,捕获或修改输出或梯度。
    • 注册方法
      handle = layer.register_forward_hook(hook_fn)
      
    • 例子
      def hook_fn(module, input, output):print(output.shape)handle = model.layer1[0].register_forward_hook(hook_fn)
      
    • 移除钩子
      handle.remove()
      
  • 张量钩子(Tensor Hooks)

    • 用途:挂载在特定的Tensor上,用于捕获梯度信息。
    • 注册方法
      tensor.register_hook(hook_fn)
      
    • 应用场景:常用于Grad-CAM中,捕获目标层的梯度信息。

4. Grad-CAM的示例

  • 目标:通过反向传播得到特定类别的梯度,结合层的激活值,生成热力图,直观展现模型关注区域。

  • 基本流程

    1. 前向传播,获取目标类别的输出。
    2. 反向传播,计算目标类别对应的梯度。
    3. 使用Hook捕获目标层的激活特征(前向输出)和梯度(反向传播梯度)。
    4. 计算加权和(平均梯度作为权重)以生成热力图。
    5. 叠加热力图到原始图像上。
  • 代码示例(简化版)

    import torch
    import torch.nn.functional as F
    import torchvision.models as models
    import cv2
    import numpy as npmodel = models.resnet50(pretrained=True)
    model.eval()# 定义目标层(例如最后的卷积层)
    target_layer = model.layer4[-1]activations = None
    gradients = None# 定义前向钩子
    def forward_hook(module, input, output):global activationsactivations = output# 定义反向钩子
    def backward_hook(module, grad_input, grad_output):global gradientsgradients = grad_output[0]# 注册钩子
    handle_fw = target_layer.register_forward_hook(forward_hook)
    handle_bw = target_layer.register_backward_hook(backward_hook)# 输入图片(预处理)
    input_img = preprocess_image('path_to_image.jpg')# 前向传播
    output = model(input_img)# 目标类别(例如类别索引)
    class_idx = torch.argmax(output)
    # 反向传播
    model.zero_grad()
    one_hot = torch.zeros_like(output)
    one_hot[0][class_idx] = 1
    output.backward(gradient=one_hot)# 获取权重
    weights = torch.mean(gradients, dim=(2, 3), keepdim=True)
    # 计算Grad-CAM
    cam = torch.sum(weights * activations, dim=1).squeeze()# 后处理,绘制热力图
    heatmap = cam.detach().cpu().numpy()
    heatmap = np.maximum(heatmap, 0)
    heatmap /= np.max(heatmap)# 叠加到原图
    # ...# 移除钩子
    handle_fw.remove()
    handle_bw.remove()
    

备注

  • Hook函数在实现Grad-CAM中非常关键,能够方便地捕获中间层的特征与梯度。
  • 使用正确的钩子注册和移除非常重要,避免内存泄漏。
  • Grad-CAM适用于模型可解释性,帮助理解模型做出决策的依据。
http://www.xdnf.cn/news/10960.html

相关文章:

  • 定时通知群内值班人功能
  • POJO,DTO,VO和Model
  • 深入解读 MCP(Model Context Protocol):大模型时代的“操作系统协议”
  • js-day7
  • 快速了解GO+ElasticSearch
  • Impromptu VLA:用于驾驶视觉-语言-动作模型的开放权重和开放数据
  • Mac 芯片系列 安装cocoapod 教程
  • 机器学习——SVM
  • 前端基础之《Vue(18)—路由知识点》
  • 【操作系统原理08】文件管理
  • git管理github上的repository
  • 深入解析ReactJS中JSX的底层工作原理
  • OpenCV CUDA模块特征检测------角点检测的接口createMinEigenValCorner()
  • React 项目初始化与搭建指南
  • 算法/机理模型演示平台搭建(二)——算法接口部署(FastApi)
  • 算法训练第七天
  • Web后端快速入门(Maven)
  • TDengine 的 AI 应用实战——运维异常检测
  • Ubuntu22.04安装MinkowskiEngine
  • 灵活运用 NextJS 服务端组件与客户端组件
  • vue-14(使用 ‘router.push‘ 和 ‘router.replace‘ 进行编程导航)
  • Walle-Web:打造轻量级高效的DevOps自动化部署平台
  • Vue混入
  • 种草平台:重新定义购物的乐趣革命
  • 北京大学肖臻老师《区块链技术与应用》公开课:07-BTC-挖矿难度
  • 基于LEAP模型在能源环境发展、碳排放建模预测及分析中实践应用
  • 论文分类打榜赛Baseline:ms-swift微调InternLM实践
  • 常用工具推荐---QQ截图功能、iLovePDF与Pandoc
  • 云服务器部署Gin+gorm 项目 demo
  • python调用硅基流动的视觉语言模型