Grad-CAM 笔记

Global Average Pooling

为了提到CAM,首先要从这里说起。

Network in Network 这篇论文里,作者扔掉了分类任务中喜闻乐见的全连接层,转而替换为了一个全局的平均池化。

假设 Backbone 部分最终得到了一个 C×H×WC \times H \times W 的特征。记有 NN 类,NN 不必 和 CC 相等,全连接层有 N×(C×H×W)N \times (C \times H \times W) 个参数。第 ii 个标签的置信度是从这 C×H×WC \times H \times W 的所有数值得到的,每类最终汇聚得到一个 N×1N \times 1 的数组。

现在,GAP的做法是在前一步就生成一个 N×H×WN \times H \times W 的特征。而后直接对每一个 Channel 取在 H×WH \times W 上的平均值,最终得到一个 N×1N \times 1 的数组。

GAP直接对每一层生成一个置信度

在这种情况下,倒逼精品化特征图的每个通道都成为了对应到特定类别的置信。又由于卷积网络保留位置的特性,大可以认为这个置信度会成为一张很合理的图。

这种设计有一个很有趣的点,就是它不再关心输入图像的分辨率了。并且全连接层大量的参数被撤掉,对泛化有一定好处。不再展开。

回到 CAM

GAP 实现的分类网络最终也会通过一个 softmax 来得到最终的结果。

Learning Deep Features for Discriminative Localization 里,特征图没有直接一一对应到类的置信度上,而是又经过了一个全连接层。所以你能看到它给出的即将输入到 softmax 里的参数 ScS_c 长这个样子

Sc=kwkci,jfk(i,j)S_c = \sum_k w_k^c\sum_{i,j} f_k(i,j)

所以 CAM 最终是多个特征图的加权。

Grad-CAM

很显然,原始的 CAM 必须在 N×H×WN \times H \times W 特征[1]和 GAP 上才能使用。为了在以 CNN 为特征提取结构的任意网络上都能使用,基于梯度的 Grad-CAM 被提出。

不知道有没有必要提,Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization 算是证明了一下 Grad-CAM 是 CAM 的泛化。

Grad-CAM 的想法就是用梯度平均替换掉原公式中的 ww,因为在缺少 GAP 后无法直接获取。

(wkc)αkc=1Zi,jycAi,jk(w_k^c)\quad \alpha_k^c=\frac{1}{Z}\sum_{i,j} \frac{\partial y^c}{\partial A^k_{i,j}}

公式中的 c,kc,k 仍然指代类别和通道,AA 为想要求出激活图的特征图,ycy^c 则是置信度。虽然标准化会消除 softmax 的影响,但为了防止梯度消失的精度问题,建议使用 softmax 前的结果。

Grad-CAM++

有人认为这种整个通道取梯度平均作为 ww 的想法还不够意思(事实上它的效果也确实不太好),所以给出了一个与位置也相关的加权方法。

αi,jc,k=2yc(Ai,jk)222yc(Ai,jk)2+a,bAa,bk3yc(Ai,jk)3wkc=i,jαi,jc,kReLU(ycAi,jk)\begin{aligned} \alpha_{i,j}^{c,k} &= \frac{\frac{\partial^2y^c}{(\partial A_{i,j}^k)^2}}{2\frac{\partial^2y^c}{(\partial A_{i,j}^k)^2}+\sum_{a,b}A^k_{a,b}\frac{\partial^3y^c}{(\partial A_{i,j}^k)^3}} \\ w_k^c &= \sum_{i,j}\alpha_{i,j}^{c,k} \text{ReLU}(\frac{\partial y^c}{\partial A_{i,j}^k}) \end{aligned}

代码

Under construction…

参考

  1. 如果你乐意改的话,因为加入了额外的全连接层,实际上通道数现在已经不需要定死为 NN 了。但 GAP 还是必不可少的。

Grad-CAM 笔记
https://blog.chenc.me/2022/01/09/grad-class-activation-map/
作者
CC
发布于
2022年1月10日
许可协议