Heatmap

article/2025/10/30 23:35:42

前言

目前所说的模型可视化或者模型可解释说到是对某一类别具有可解释性,直接画出来特征图并不能说明模型学到了某种特征,对一个深层的卷积神经网络而言,通过多次卷积和池化以后,它的最后一层卷积层包含了最丰富的空间和语义信息,再往下就是全连接层和softmax层了,其中所包含的信息都是人类难以理解的,很难以可视化的方式展示出来。所以说,要让卷积神经网络的对其分类结果给出一个合理解释,必须要充分利用好最后一个卷积层。

CAM结构的热力图

2016 年《Learning Deep Features for Discriminative Localization》提出的 CAM (Class Activation Mapping,类激活映射) 算法,能够可视化卷积神经网络的特征图,并映射到原始图像中得到不同区域的重要性。CAM 利用了全局平均池化 GAP (Global Average Pooling) 和最后一层 softmax 的参数将特征图线性加权起来,从而获得模型对于不同类别重点关注的区域。
在这里插入图片描述
作者发现 CNN 网络虽然在训练时可能未提供对象的位置,但是仍然具有很强的定位特征能力,上图是 CAM 运行的效果,可以看到对于刷牙这一类,CNN 能有效地定位到牙刷,而对于锯树,CNN 能有效定位到电锯。

但是 CNN 后面通常会接全连接层,作者认为全连接层会影响 CNN 的定位能力。因此提出了 CAM 算法,用全局平均池化 GAP 代替全连接层,从而保留模型的定位特征能力。全局平均池化 GAP 通常起到正则化的作用,防止训练时的过拟合,GAP 和其他池化方法的区别如下图所示,全局的池化方法就是把池化的范围扩大到整个特征图的尺寸。在这里插入图片描述
CAM借鉴了论文Network in Network(https://arxiv.org/abs/1312.4400)_中的思路,GAP,其实说白了就是求每张特征图所有像素的均值。GAP的优点在NIN的论文中说的很明确了:由于没有了全连接层,输入就不用固定大小了,因此可支持任意大小的输入;此外,引入GAP更充分的利用了空间信息,且没有了全连接层的各种参数,鲁棒性强,也不容易产生过拟合;还有很重要的一点是,在最后一层卷积层强制生成了和目标类别数量一致的特征图,经过GAP以后再通过softmax层得到结果,这样做就给每个特征图赋予了很明确的意义,也就是categories confidence maps(类别置信度图)。

CAM 模型示意图
在这里插入图片描述
在这里插入图片描述

最后一个卷积层后面采用了 GAP,GAP 后再利用 Softmax 层进行分类。图中最后一层卷积层的通道数为 n,因此 GAP 后得到的向量维度是 n,分别对应每个通道。

经过GAP之后与输出层的连接关系(暂不考虑softmax层),实质上也是就是个全连接层,只不过没有了偏置项,如图所示:
在这里插入图片描述
经过GAP之后,我们得到了最后一个卷积层每个特征图的均值,通过加权和得到输出(实际中是softmax层的输入)。需要注意的是,对每一个类别C,每个特征图k的均值都有一个对应的 w w w,记为 w k c w^c_k wkc。CAM的基本结构就是这样了,下面就是和普通的CNN模型一样训练就可以了。

如何得到一个用于解释分类结果的热力图呢?

比如说我们要解释为什么分类的结果是羊驼,我们把羊驼这个类别对应的所有 w k c w^c_k wkc取出来,即 w1, ……, wn 指 Softmax 层的权重,求出它们与自己对应的特征图的加权和即可。由于这个结果的大小和特征图是一致的,我们需要对它进行上采样(CAM 直接使用 resize 将特征图缩放到和原始图一样的大小),叠加到原图上去,如下所示。
在这里插入图片描述
这样,CAM以热力图的形式告诉了我们,模型是重点通过哪些像素确定这个图片是羊驼了。

Grad-CAM

《Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization》这篇文章主要介绍了一种梯度类加权激活映射(Gradient-weighted Class Activation Mapping,简写成Grad-CAM)方法。该方法可使用任意目标概念的梯度,然后将其流入最后的卷积层生成一个粗略的定位图,以此来突出图像中重要区域,该区域即为输出预测的依据。

前面看到CAM的解释效果已经很不错了,但是它有一个致命伤,就是它要求修改原模型的结构,导致需要重新训练该模型,这大大限制了它的使用场景。如果模型已经上线了,或着训练的成本非常高,我们几乎是不可能为了它重新训练的。于是乎,Grad-CAM横空出世,解决了这个问题。

Grad-CAM的基本思路和CAM是一致的,也是通过得到每对特征图对应的权重,最后求一个加权和。但是它与CAM的主要区别在于求权重 w k c w^c_k wkc的过程。CAM通过替换全连接层为GAP层,重新训练得到权重,而Grad-CAM另辟蹊径,用梯度的全局平均来计算权重。事实上,经过严格的数学推导,Grad-CAM与CAM计算出来的权重是等价的

计算Grad-CAM中第k个特征图对类别c的权重为 a k c a^c_k akc,:
在这里插入图片描述
其中,Z为特征图的像素个数, y c y^c yc是对应类别c的logits 分数值 (即是softmax层的输入值), A i k j A^k_ij Aikj表示第k个特征图中,(i,j)位置处的像素值。

计算热力图

求得类别c对所有特征图的权重后,求其加权和就可以得到热力图 / 分类定位图。再乘回原来的feature map。在这里插入图片描述

Grad-CAM的整体结构
在这里插入图片描述

其中ReLU函数起到保留对分类具有积极作用的像素值,抑制对分类具有消极作用的像素值,然后获得一个粗糙的热图。ReLU的原因在于我们只关心对类别c有正影响的那些像素点,如果不加ReLU层,最终可能会带入一些属于其它类别的像素,从而影响解释的效果。使用Grad-CAM对分类结果进行解释的效果如下图所示:在这里插入图片描述
Grad-CAM优势

  • ①适用于具有全连接层的卷积神经网络(如VGG)
  • ②适用于具有结构化输出的卷积神经网络(如字幕)
    ③适用于具有多模态输入任务的卷积神经网络(如视觉问答)

Grad-CAM与其他方法的比较

Grad-CAM是CAM(Class Activation Mapping)的一般化

CAM只适用于在预测之前对卷积映射进行全局平均池化的特定卷积神经网路架构(即conv feature maps -> global average pooling -> softmax layer),在某些任务上(如图片分类),此架构与一般网络相比精度可能较低,或者根本不适用于任何其他任务(如字幕或视觉问答)。对于适用CAM的网络架构,其预测原理如下:
在这里插入图片描述

参考:
https://mp.weixin.qq.com/s/4Tq43DEaUk_rtLubcztyNw
https://www.weixiuzhan.cn/news/show-30055.html
https://www.zhihu.com/question/274926848/answer/473562723

Grad-CAM++

暂无


http://chatgpt.dhexx.cn/article/E1t1u6S5.shtml

相关文章

R | 可视化 | 热图(Heatmap)

1 基础绘制 R绘制热图时&#xff0c;数据需要输入一个矩阵&#xff0c;可以用as.matrix()把它转换成矩阵。这里利用R自带的数据集绘制热图。 > # 数据 > data <- as.matrix(mtcars) > > # 绘制热图 > heatmap(data) OUTPUT: 热图的每一列是一个变量&…

科研作图-heatmap(一)

1.简介 在科研中有很多地方为了可解释给审稿人提供了热图,便于知道深度学习中到底是哪部分在起作用,或者是在机器学习中分析不同的特征之间是否存在相关性?存在多大的相关性;或者是直观的展示场景热力图…总之,用处很多,我正好现在也需要用,就先总结下:绘制HeatMap的库有很多,…

「C#」生成HeatMap(热度图)的实现

1、什么是Heatmap 其实不用多言&#xff0c;需要这个的人自然知道这是什么。基于一系列点生成的热度图&#xff0c;放张图感受一下&#xff1a; ma...大概就是这种样子。 2、生成&#xff08;计算&#xff09;原理 实现方式实际上是在每个点上叠加高斯矩阵。高斯矩阵就是在二…

关键点检测的heatmap介绍

开始学关键点检测的时候&#xff0c;到处找找不到heatmap的解释。现在大概有些懂了&#xff0c;干脆自己写一个。部分转载。 关键点定位任务两种做法&#xff1a;heatmap和fully connected回归&#xff08;Heapmap-based和Regression-Based&#xff09; heatmap得到一张类似热…

python绘制热度图(heatmap)

1、简单的代码 from matplotlib import pyplot as plt import seaborn as sns import numpy as np import pandas as pd#练习的数据&#xff1a; datanp.arange(25).reshape(5,5) datapd.DataFrame(data)#绘制热度图&#xff1a; plotsns.heatmap(data)plt.show() 查看效果&a…

热图(Heatmap)绘制(matplotlib与seaborn)

热图是数据统计中经常使用的一种数据表示方法&#xff0c;它能够直观地反映数据特征&#xff0c;查看数据总体情况&#xff0c;在诸多领域具有广泛应用。 一&#xff1a;matplotlib绘制方法 1.基础绘制 热图用以表示的是矩阵数据&#xff0c;例如相关阵、协差阵等方阵&#…

‘0’ 和 '\0'

48是0对应的ascii值。

KEIL/MDK编译优化optimization选项注意事项

KEIL编译器C语言编译选项优化等级说明 -Onum Specifies the level of optimization to be used when compiling source files. Syntax -Onum Where num is one of the following: 0 Minimum optimization. Turns off most optimizations. When debugging is enabled, this opt…

0,'\0','0'

#include <iostream> using namespace std; int main(void) { cout<<__FILE__<<\t<<__LINE__<<endl;cout<<"内 容:\t"<<"0"<<\t<<"\\\0\"<<\t<<"\0\"<<…

Odoo

狭路相逢 勇者胜 Odoo 是用于经营公司的最好的管理软件。 数百万用户使用我们的集成应用可以更好地开展工作 现在开始。免费的。 重新定义可扩展性 一个需求&#xff0c;一个应用程式。整合从来没有那么顺畅 促进销售量 客户关系管理POS销售 整合您的服务 项目工时表帮助…

0 、 '0' 、 0 、 ’\0’ 区别

转载自&#xff1a;https://blog.csdn.net/qnavy123/article/details/93901631 ① ‘0’ 代表 字符0 &#xff0c;对应ASCII码值为 0x30 (也就是十进制 48) ② ‘\0’ 代表 空字符(转义字符)【输出为空】 &#xff0c;对应ASCII码值为 0x00(也就是十进制 0)&#xff0c; …

Linux的内核编译用O0是编译不过的

最近在ATF的升级过程中遇到了一个编译问题&#xff0c;最后是通过编译优化解决的&#xff0c;然后一百度这个优化全是在Linux中的。于是就借着Linux编译优化来学学。 内容来自 宋宝华老师&#xff1a; 关于Linux编译优化几个必须掌握的姿势 1、编译选项和内核编译 首先我们都…

alert uuid does not exits. Dropping to a shell!

ALERT&#xff01;UUID does not exit. Dropping to a shell&#xff01; 服务器系统ubuntu16.04server&#xff0c;非自然断电后开机进入initramfs模式&#xff0c;服务器磁盘阵列是raid1和raid5。初步分析是硬盘坏道或掉盘&#xff0c;进入raid卡里看到硬盘一切正常&#xf…

跟着团子学SAP PS:如何查询PS模块中的user exits以及相关BAdIs SE80/SMOD/CNEX006/CNEX007/CNEX008

在PS很多标准字段或功能无法满足客户需求的时候往往需要通过SAP标准的user exits或者BAdI进行开发以满足业务需要&#xff0c;所以今天介绍下如何查询PS模块中的用户出口以及BAdIs&#xff1a; &#xff08;1&#xff09;查询PS模块中的user exits: 执行SE80&#xff0c;在菜…

EXT

ext的核心是store&#xff0c;存储数据用的。调试时可以先把store这块先屏蔽掉&#xff0c;先看页面的&#xff0c;页面出来了再调试store。这样会调试起来很快。 init: function () { var view this.getView(), // var store Global.getStore(app.store.L…

IDEA|class path resource XXX cannot be opened because it does not exits

IDEA|class path resource XXX cannot be opened because it does not exits 问题截图&#xff1a; 原因&#xff1a;没有设置好各个文件夹。我的理解是&#xff0c;当把文件夹设置好具体的功能才能被IDEA自动识别。 解决方法&#xff1a; 转发链接&#xff1a;https://bl…

User Exits和Customer Exits

一、Extension of SAP functionality SAP makes different possibilities available to extend SAP functionality in the R/3 without modifying the delivered R/3-Standard. Thus these extensions are further present also after a R/3-Release-Wechsel. User exit Fi…

sql查询中使用in和exits比较和区别

首先&#xff0c;查询中涉及到的两个表&#xff0c;一个user和一个order表&#xff0c;具体表的内容如下&#xff1a; user表&#xff1a; order表&#xff1a; in 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候&#xff0c;首先查询子查询的表&#xff0c;然后…

SQL语句中exits和in的区别

一 表展示 查询中涉及到的两个表&#xff0c;一个user和一个order表&#xff0c;具体表的内容如下&#xff1a; user表&#xff1a; order表&#xff1a; 二 in 演示 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候&#xff0c;首先查询子查询的表&#xff0c…

E. Exits in Excess

题意&#xff1a; 移除最多一半的边使得图没有环。 将所有边分成两部分&#xff0c; 第一部分为 u < v u < v u<v&#xff0c; 第二部分为 v > u v > u v>u&#xff0c; 将小的边集合删去即可。 AC代码&#xff1a; int n, m; vector<int> v1, v2…