CNN模型解释性(可视化)及实现 ---- Guided-backpropagation, Deconvolution, CAM, Grad-CAM,Grad-CAM++

CNN模型解释性(可视化)及实现

---- Guided-backpropagation, Deconvolution, CAM, Grad-CAM,Grad-CAM++

目录

CNN模型解释性(可视化)及实现

---- Guided-backpropagation, Deconvolution, CAM, Grad-CAM,Grad-CAM++

1. 反卷积和导向反向传播

2. CAM(Class active mapping)和Grad-CAM

3. Grad-CAM++

4.代码实现

5. 学习资料参考链接:


反向卷积(Deconvolution)和导向反向卷积(Guided-backpropagation)是模型可视化的两个经典方法。

1. 反卷积和导向反向传播

反卷积和导向反向传播的基础都是反向传播,对输入求导。三者唯一的区别在于反向传播过程中经过ReLU层时对梯度的不同处理策略。

可视化结果,导向反向传播(guided backpropagation)好于反卷积(deconvnet)

这两种经典方法都用feature map反向传播梯度,对类别不敏感,没有类别区分性(上图中猫,狗的特征都有);两个方法的区别是对传回去的梯度处理策略不一样。

 

2. CAM(Class active mapping)和Grad-CAM

CAM: Class active map 类**图

CNN最后一层含有丰富的,高度抽象的语义特征,人类难以理解。

对一个深层的卷积神经网络而言,通过多次卷积和池化以后,它的最后一层卷积层包含了最丰富的空间和语义信息,再往下就是全连接层和softmax层了,其中所包含的信息都是人类难以理解的,很难以可视化的方式展示出来。所以说,要让卷积神经网络的对其分类结果给出一个合理解释,必须要充分利用好最后一个卷积层。

CAM就是在最后一层卷积层上进行的。

CAM用GAP+MLP代替了原网络结构中最后一层分类器(一般为MLP)。

特征图经过GAP后得到均值,引入GAP充分利用了空间信息。

假设Feature map An,有n张特征图(n维特征图),GAP后面的全连接层有n个神经元。对于每个类别C,每个特征图i(i∈n)都有对应的权重wic。

有的网络中没有全连接层(e.g. FCN),GAP+MLP的结构会修改了原网络的结构,想要得到权重信息需要重新训练模型。

Grad-CAM是CAM的通用形式,解决了这个问题。

Grad-CAM

它和CAM的区别是在对特征图进行加权时,求权重的这一步wkc。CAM在GAP后增加一个MLP作为特征图的加权输出层,会修改模型结构。

 

在CAM里: 是通过全连接层实现。

在Grad-CAM:

论文中通过数学推导证明,反向求的梯度等效于CAM中的增加的MLP的权重。

增加Relu,抛弃小于0的输出,只关注于类别有关的区域。

CNN的可视化结果也说明,模型的分类依据,也是关注到了区分特征。

3. Grad-CAM++

在Grad-CAM里,特征图权重是Yc反向传播的梯度信息作为权重。

Grad-CAM++ 提升 精准定位和同类物体多目标的问题。

       改进的地方也是计算特征图权重的不同。对Grad-CAM里的wkc进行改进。

给梯度再求了一次导,得到α作为不同梯度的权重,就是不同位置梯度的贡献

α的推导,对Yc求两次导。

计算在一次反向传播过程中完成,计算量和Grad-CAM相当。但在精准定位和同类多目标问题上提升很大,尤其是同类多目标。

同类多目标效果提升明显。

 

4.代码实现

自己实现的二分类语义分割任务上的Grad-CAM基于:

Pytorch: https://github.com/jacobgil/pytorch-grad-cam

(包含grad-cam,guided backpropagation,grad-cam+guided backpropagation)

分类任务可直接用这个代码,注意部署在自己模型的位置,模型的输入输出。

分割任务,删掉代码中的onehot编码部分,对模型预测输出的mask做softmax后使用0.5的阈值,将mask转为0,1。作为反向传播的依据。 (argmax也可以)

 

以下链接有grad-cam ++的:

https://blog.csdn.net/cdknight_happy/article/details/108792065

模型解释 -- Guided-Backpropagation、CAM、Grad-CAM、Grad-CAM++ 及 pyTorch Hook(以及代码实现)

 

5. 学习资料参考链接:

http://ddrv.cn/a/145213

反卷积,导向反向传播,CAM, Grad-CAM讲的挺清楚。

https://blog.csdn.net/weixin_44638957/article/details/98674726

Grad-CAM这篇讲的比较清楚,pytorch1.0.1代码(没有guided backpropagation)

https://zhuanlan.zhihu.com/p/75054200

Hook 是 PyTorch 中一个十分有用的特性。利用它,我们可以不必改变网络输入输出的结构,方便地获取、改变网络中间层变量的值和梯度。

 

https://zhuanlan.zhihu.com/p/75054200

半小时学会Pytorch hook

Grad-CAM++论文解读

https://cugtyt.github.io/blog/papers/2018/0913