Grad-CAM简介

Posted 太阳花的小绿豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Grad-CAM简介相关的知识,希望对你有一定的参考价值。

论文名称:Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization
论文下载地址:https://arxiv.org/abs/1610.02391
推荐代码(Pytorch):https://github.com/jacobgil/pytorch-grad-cam
bilibili视频讲解:https://b23.tv/1kccjmb


文章目录


0 前言

对于常用的深度学习网络(例如CNN),普遍认为是个黑盒可解释性并不强(至少现在是这么认为的),它为什么会这么预测,它关注的点在哪里,我们并不知道。很多科研人员想方设法地去探究其内在的联系,也有很多相关的论文。今天本文简单聊一聊Grad-CAM,这并不是一篇新的文章,但很有参考意义。通过Grad-CAM我们能够绘制出如下的热力图(对应给定类别,网络到底关注哪些区域)。Grad-CAM(Gradient-weighted Class Activation Mapping)是CAM(Class Activation Mapping)的升级版(论文3.1节中给出了详细的证明),Grad-CAM相比与CAM更具一般性。CAM比较致命的问题是需要修改网络结构并且重新训练,而Grad-CAM完美避开了这些问题。本文不对CAM进行讲解,有兴趣的小伙伴自行了解。


刚刚提到Grad-CAM能够帮我们分析网络对于某个类别的关注区域,那么我们通过网络关注的区域能够反过来分析网络是否学习到正确的特征或者信息。在论文6.3章节中举了个非常有意思的例子,作者训练了一个二分类网络,Nurse和Doctor。如下图所示,第一列是预测时输入的原图,第二列是Biased model(具有偏见的模型)通过Grad-CAM绘制的热力图。第三列是Unbiased model(不具偏见的模型)通过Grad-CAM绘制的热力图。通过对比发现,Biased model对于Nurse(护士)这个类别关注的是人的性别,可能模型认为Nurse都是女性,很明显这是带有偏见的。比如第二行第二列这个图,明明是个女Doctor(医生),但Biased model却认为她是Nurse(因为模型关注到这是个女性)。而Unbiased model关注的是Nurse和Doctor使用的工作器具以及服装,明显这更合理。


1 Grad-CAM介绍以及实验

1.1 理论介绍

作者的想法还是比较简单的,参见下图。这里我们简单看下Image Classification任务,首先网络进行正向传播,得到特征层 A A A(一般指的是最后一个卷积层的输出)和网络预测值 y y y(注意,这里指的是softmax激活之前的数值)。假设我们想看下网络针对Tiger Cat这个类别的感兴趣区域,假设网络针对Tiger Cat类别的预测值为 y c y^c yc。接着对 y c y^c yc进行反向传播,能够得到反传回特征层 A A A的梯度信息 A ˊ \\acuteA Aˊ。通过计算得到针对特征层 A A A每个通道的重要程度,然后进行加权求和通过 R e L U ReLU ReLU就行了,最终得到的结果即是Grad-CAM。

至于为什么要这么做,我这里讲下我个人的观点(若有不对请指出)。首先得到的特征层 A A A是网络对原图进行特征提取得到的结果,越往后的特征层抽象程度越高,语义信息越丰富,而且利用CNN抽取得到的特征图是能够保留空间信息的(Transformer同样)。所以Grad-CAM在CNN中一般 A A A都指的是最后一个卷积层的输出(参考下图实验,越往后的特征层效果越好)。当然特征层 A A A包含了所有我们感兴趣目标的语义信息,但具体哪些语义信息对应哪个类别我们并不清楚。接着通过对类别 c c c的预测值 y c y^c yc进行反向传播,得到反传回特征层 A A A的梯度信息 A ˊ \\acuteA Aˊ,那么 A ˊ \\acuteA Aˊ就是 y c y^c yc A A A求得的偏导,换句话说, A ˊ \\acuteA Aˊ代表 A A A中每个元素对 y c y^c yc的贡献,贡献越大网络就认为越重要。然后对 A ˊ \\acuteA Aˊ w , h w, h w,h上求均值就能得到针对 A A A每个通道的重要程度(这里是对于类别 c c c而言的)。最后进行简单的加权求和在通过 R e L U ReLU ReLU就能得到文中所说的Grad-CAM。

关于Grad-CAM总结下来就是下面这个公式:
L G r a d − C A M c = R e L U ( ∑ k α k c A k ) ( 1 ) L_\\rm Grad-CAM^c=ReLU(\\sum_k\\alpha _k^cA^k) \\quad \\quad (1) LGradCAMc=ReLU(kαkcAk)(1)
其中:

  • A A A代表某个特征层,在论文中一般指的是最后一个卷积层输出的特征层
  • k k k代表特征层 A A A中第k个通道(channel)
  • c c c代表类别 c c c
  • A k A^k Ak代表特征层A中通道k的数据
  • α k c \\alpha_k^c αkc代表针对 A k A^k Ak的权重

关于 α k c \\alpha_k^c αkc的计算公式如下:
α k c = 1 Z ∑ i ∑ j ∂ y c ∂ A i j k ( 2 ) \\alpha_k^c = \\frac1Z\\sum_i\\sum_j \\frac\\partial y^c\\partial A_ij^k \\quad \\quad (2) αkc=Z1ijAijkyc(2)
其中:

  • y c y^c yc代表网络针对类别 c c c预测的分数(score),注意这里没有通过softmax激活
  • A i j k A_ij^k Aijk代表特征层 A A A在通道 k k k中,坐标为 i j ij ij位置处的数据
  • Z Z Z等于特征层的宽度 × \\times ×高度

通过计算公式(2)可知 α k c \\alpha_k^c αkc就是通过预测类别 c c c的预测分数 y c y^c yc进行反向传播,然后利用反传到特征层 A A A上的梯度信息计算特征层 A A A每个通道 k k k的重要程度。接着通过 α \\alpha α对特征层 A A A每个通道的数据进行加权求和,最后通过 R e L U ReLU ReLU激活函数得到Grad-CAM(论文中说使用ReLU是为了过滤掉Negative pixles,而Negative pixles很可能是归属于其他类别的pixles)。当然一般还要通过一些后处理,插值等方法与原图叠加得到最终的可视化结果。


光说公式没意思,这里举个例子,下图中CNN Extractor代表CNN特征提取器,GAP代表Global Average Pooling,FC代表全连接层:

假设网络正向传播得到的特征层 A A A如图所示(这里为了方便只画了两个channel,数据都是随便写的不必深究),针对类别Cat的预测值进行反向传播得到针对特征层 A A A的梯度信息 A ˊ \\acuteA Aˊ(关于梯度是如何计算的,可以参考本文1.2和1.3的内容),接着利用上述提到的公式(2)计算针对特征层 A A A每个通道的权重,就是求 A ˊ \\acuteA Aˊ每个通道的均值。
α k c = 1 Z ∑ i ∑ j ∂ y c ∂ A i j k ( 2 ) \\alpha_k^c = \\frac1Z\\sum_i\\sum_j \\frac\\partial y^c\\partial A_ij^k \\quad \\quad (2) αkc=Z1ijAijkyc(2)

那么有:
α C a t = ( α 1 C a t α 2 C a t ) = ( 1 3 − 2 3 ) \\alpha^\\rm Cat = \\beginpmatrix \\alpha^\\rm Cat_1 \\\\ \\\\ \\alpha^\\rm Cat_2 \\endpmatrix = \\beginpmatrix \\frac13 \\\\ \\\\ -\\frac23 \\endpmatrix αCat=学习打卡04可解释机器学习笔记之Grad-CAM

学习打卡04可解释机器学习笔记之Grad-CAM

“卷积可视化”:Grad-CAM

grad-cam cam 和热力图,基于keras的实现

grad-cam用于3D分割网络的代码修改——以及特征层非常规输出的解决方法

Grad-CAM 可视化:无效参数错误:您必须使用 dtype 浮点数和形状 [x] 为占位符张量“X”提供一个值