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

热力图:网络到底学了个啥?

1 热力图作用

将传统机器学习的方法与深度学习做对比,深度学习方法的显著特点就是不用再人工设计特征,特征提取的过程由网络通过训练自动完成。然而深度学习的方法不仅非常依赖于海量的标记数据,并且至今其至今都有一个令人诟病的缺点:

那就是可解释性不足。

早些年的深度学习的文章可能只要有创新并且能够在公开数据集涨点,就能发出非常不错的论文,比如CVPR这种顶级的论文。

但是现如今发论文也是越来越卷,并且一味刷SOTA来发论文并不可靠,现在的论文审稿人评价一篇论文的好坏也不再局限于精度,更多的是看模型是否轻量,并且还要求你讲清楚你的模型为什么针对这个任务能够work。

而热力图就是模型可解释性的一大应用。它能够清晰的展现出模型究竟是依靠哪些特征来对样本做出诸如分类、检测和分割等任务,从而证明模型并不是瞎猫碰上死耗子,在胡乱猜测。

因此如果大家是在校学生,准备发论文,正在发愁工作量不充足,或者模型的可解释性不强,不知道怎么讲好论文的故事,不妨从热力图下手,来针对模型学习到的特征,一探究竟。

从上面图就可以看出来,在进行图像分类的时候,热力图的焦点集中于最关键的部分。比如在识别狗的时候,热力图在狗的部分,暖色调非常深,在识别猫的时候,热力图在猫的部分色调非常深。从中也可以窥探出为啥叫热力图,越关键的部分,图像的部分越“热”。

2 LeNet识别Mnist

下面我给出一个LeNet识别Mnist数据集,并且生成热力图的示范代码。

在将LeNet在Mnist上训练,并且生成对应的模型权重文件之后,我们在该权重文件基础上,对测试图像进行识别,并且在识别之后生成热力图,来观察模型究竟是集中于哪些图像特征来得到最终的识别结果的,从而使得我们的方法更加具有说服力。

具体步骤如下:

  • 捕获特征图

#注册钩子来捕获特征图 feature_maps = [] def hook_fn(module, input, output): feature_maps.append(output.detach()) #注册到最后一个卷积层 hook = net.conv2.register_forward_hook(hook_fn)

其中钩子机制 :其实是使用 PyTorch 的 register_forward_hook 方法在模型的特定层(这里是最后一个卷积层 conv2 )注册一个回调函数,当模型进行前向传播时,钩子函数会捕获该层的输出特征图并存储起来。

并且我们选择最后一个卷积层 ,是因为最后一个卷积层的特征图包含了最抽象、最具判别力的特征,能更好地反映模型的关注点。

  • 特征图处理

#获取最后一个卷积层的特征图 last_conv_features = feature_maps[-1] #计算特征图的平均值作为热力图 heatmap = torch.mean(last_conv_features, dim=1).squeeze()

主要做通道平均 :对捕获的特征图沿通道维度取平均值,得到单通道的热力图。每个通道的特征图对应不同的视觉模式,因此通道平均值能综合反映所有通道的激活情况。

  • 归一化热力图

#将热力图调整到与输入图片相同的尺寸(28x28) heatmap = torch.nn.functional.interpolate( heatmap.unsqueeze(0).unsqueeze(0), size=(28, 28), mode='bilinear', align_corners=False ) heatmap = heatmap.squeeze().cpu().numpy() heatmap = (heatmap - np.min(heatmap)) / (np.max(heatmap) - np.min(heatmap))

具体使用方法:

python test.py --image 4.png --heatmap

比如我们测试的图片是:

最终得到结果:

可以看模型的确是将注意力集中于数字的特征上。

以上方法的核心原理主要在于卷积层对输入图像在特征提取时,针对激活值高的部分会形成可视化映射,从蓝到红表示激活值的高低,再将热力图叠加在原始图像上。

那么为什么这种方法有效呢?

  • 由卷积神经网络的性质决定 :卷积层可以通过局部感受野和权值共享,能够捕获图像中的局部特征。

  • 采用最后一层卷积层 :最后一个卷积层的特征图包含了最抽象、最具判别力的特征。

  • 通道平均的作用 :不同通道学习不同的特征,平均操作可以综合所有通道的信息,得到的信息更加全面。

3 其他热力图绘制方法

此外其实还有其他热力图的绘制方法,包括GradCAM、HiResCAM、ScoreCAM、GradCAMPlusPlus、AblationCAM、XGradCAM、LayerCAM、FullGrad、EigenCAM、ShapleyCAM 和 FinerCAM等。大家可以参考一下链接:

https://gitcode.com/gh_mirrors/py/pytorch-grad-cam

此代码库给出的例子非常全面,包括支持分类、目标检测、语义分割、嵌入相似度等。

如视觉方面:

语义检测和分割:

3D医学语义分割:

大家可以下载代码可以试试,代码的运行方法很简单:

python cam.py --image-path ./dog.png --method gradcam --output-dir ./

亲测可用,大家可以试一试。

完整代码大家可以关注gzh:阿龙AI日记,回复项目代码,找到压缩包:LeNet_mnist.zip和pytyorch-grad-cam-master.zip。

http://www.jsqmd.com/news/371687/

相关文章:

  • FreeRTOS计数信号量原理与STM32实战
  • 2026,智能体按效果付费在多行业走出第一步
  • 告别低效繁琐!降AI率工具 千笔AI VS PaperRed,专科生专属利器!
  • Java计算机毕设之基于springboot的某校大学学生就业信息平台高校学生就业信息推送系统(完整前后端代码+说明文档+LW,调试定制等)
  • 救命神器!千笔ai写作,专科生论文写作救星
  • 【计算机毕业设计案例】基于springboot的五金门窗店铺管理系统(程序+文档+讲解+定制)
  • 吐血推荐!8个AI论文写作软件深度测评,专科生毕业论文+开题报告必备工具
  • 揭秘AI专著撰写工具:功能特点全解析,助你快速产出高质量专著
  • 【计算机毕业设计案例】基于springboot的煤矿安全风险监测与管理系统 煤矿事故管理系统(程序+文档+讲解+定制)
  • 计算机Java毕设实战-基于springboot的煤矿事故管理系统煤矿事故应急管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 给孩子补钙可以喝什么品牌的牛奶?这些牛奶用实力助力科学补钙 - Top品牌推荐
  • 【课程设计/毕业设计】基于Vue和springboot框架的线上五金销售系统基于springboot的五金门窗店铺管理系统【附源码、数据库、万字文档】
  • 【计算机基础】-12-为什么不能用全局变量替代mutex,进行临界资源的保护?请举例说明,哪种情况勉强可以?
  • 2026年停车位划线公司权威推荐:路面划线/厂区划线/厂区道路划线/地面划线/市政道路划线/热熔标线/交通划线/选择指南 - 优质品牌商家
  • Java计算机毕设之基于springboot的五金门窗店铺管理系统基于Vue和springboot框架的线上五金销售系统(完整前后端代码+说明文档+LW,调试定制等)
  • 2026年楼道座椅式电梯公司权威推荐:美罗蒂克座椅电梯、美罗蒂克电梯、老人上楼简易电梯、老人简易电梯选择指南 - 优质品牌商家
  • AI时代的内容新范式:doubaoAD探索生成式引擎下的品牌可见路径 - 品牌2025
  • Java计算机毕设之基于Spring Boot的煤矿安全隐患排查与治理系统基于springboot的煤矿事故管理系统(完整前后端代码+说明文档+LW,调试定制等)
  • 【毕业设计】基于springboot的煤矿事故管理系统(源码+文档+远程调试,全bao定制等)
  • Java毕设项目推荐-基于springboot的煤矿安全管理信息系统煤矿事故管理系统【附源码+文档,调试定制服务】
  • 【毕业设计】基于springboot的五金门窗店铺管理系统(源码+文档+远程调试,全bao定制等)
  • 聚焦豆包生态,doubaoAD以GEO策略助力企业提升AI问答中的专业可见性 - 品牌2025
  • 驱动人生国际版Driver
  • 【Linux】fd_重定向本质
  • 4:Web基础漏洞利用深度剖析
  • 在仿真优化项目里的数据库选型,OpenTeleDB的Xstore存储引擎应用
  • 基于模块化设计的可定制化推理系统框架
  • OpenLoong项目是什么?
  • 能源之星X(笔记本省电)
  • 前端开发:点击事件使用 @click.prevent 的场景总结