这个方法又称Class Activation Map(CAM类激活映射),由于这是基于分类问题的一种可视化技术,并且只有将全连接层改为全局平均池化才能较好的保存图像的空间信息,这对于训练是不利的。2017年提出了Grad-CAM,可以在不改变网络结构的情况下进行初始化。
CAM
CAM论文
CAM的原理大致如上图所示,生成步骤如下:
- step1: 输入一张图进入CNN(可以是任何网络)中,最后一层卷积层得到的特征图即为图中下排的特征图;
- step2: 经过全局平均池化得到每层特征图相应权重 W i Wi Wi;
- step3: 经过一层softmax得到分类结果,查看图中Australian terrier对应的权值;
- step4: 将每层特征图与其相对应的权值相乘并求和即得到映射图;
- step5: 将生成的映射图resize到原图的大小,与原图相叠。
Q:为什么使用全局平均池化代替全连接层?
每一层卷积层的feature map认为仍然保留着图像的空间信息,而经过全连接层后,特征图转换为特征向量会丢失它的空间信息。所以CAM中采用全局平均池化层代替全连接层。
Q:为什么使用全局平均池化而不是最大池化?
基于average的CAM可以标出重要影响的所有区域,而基于max的CAM却只能标注出ROI区域的右下方的一个关键点。这个使得基于GMP的CAM在分类效果上与基于GAM的差不多,但是在定位问题上就要显得逊色一点。
Grad-CAM
Grad-CAM论文
其基本思路与CAM一致,也是通过得到特征图对应的权重,最后求一个加权和。它与CAM的主要区别在于求权重w的过程。
Grad-CAM另辟蹊径,用梯度的全局平均来计算权重。事实上,经过严格的数学推导,Grad-CAM与CAM计算出来的权重是等价的。
Grad-CAM生成步骤如下:
- step1: 输入一张图进入CNN(可以是任何网络)中,最后一层卷积层得到的特征图即为图中下排的特征图;
- step2: 求出第k个特征图对应类别c的权重为 α k c \alpha_k^c αkc,公式如下;
- α k c = 1 Z ∑ i ∑ j ∂ y c ∂ A i j k \alpha_k^c=\frac{1}{Z}\sum\limits_{i}\sum\limits_{j}\frac{\partial y^c}{\partial A_{ij}^k} αkc=Z1i∑j∑∂Aijk∂yc
- 其中,Z为特征图的像素个数, y c y^c yc是对应类别c的分数(在代码中一般用 l o g i t s logits logits表示,是输入softmax层之前的值), A i j k A_{ij}^k Aijk表示第k个特征图中, ( i , j ) (i,j) (i,j)位置处的像素值。
- step4: 求得类别对所有特征图的权重后,用 L L L求其加权和;
- L G r a d − C A M c = R e L U ( ∑ k α k c A k ) L_{Grad-CAM}^c=ReLU(\sum\limits_k\alpha_k^cA^k) LGrad−CAMc=ReLU(k∑αkcAk)
- step5: 将生成的映射图resize到原图的大小,与原图相叠。
注意这里和CAM的另一个区别是,Grad-CAM对最终的加权和加了一个ReLU,加这么一层ReLU的原因在于我们只关心对类别c有正影响的那些像素点,如果不加ReLU层,最终可能会带入一些属于其它类别的像素,从而影响解释的效果。使用Grad-CAM对分类结果进行解释的效果如下图所示:
除了直接生成热力图对分类结果进行解释,Grad-CAM还可以与其他经典的模型解释方法如导向反向传播相结合,得到更细致的解释。
参考文献:
- 使用matplotlib绘制热图(heatmap)
- keras可视化代码
- CAM(Class Activation Mapping)通俗篇
- 凭什么相信你,我的CNN模型?(篇一:CAM和Grad-CAM)