目录
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)是模型可视化的两个经典方法。
反卷积和导向反向传播的基础都是反向传播,对输入求导。三者唯一的区别在于反向传播过程中经过ReLU层时对梯度的不同处理策略。
可视化结果,导向反向传播(guided backpropagation)好于反卷积(deconvnet)
这两种经典方法都用feature map反向传播梯度,对类别不敏感,没有类别区分性(上图中猫,狗的特征都有);两个方法的区别是对传回去的梯度处理策略不一样。
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的可视化结果也说明,模型的分类依据,也是关注到了区分特征。
在Grad-CAM里,特征图权重是Yc反向传播的梯度信息作为权重。
Grad-CAM++ 提升 精准定位和同类物体多目标的问题。
改进的地方也是计算特征图权重的不同。对Grad-CAM里的wkc进行改进。
给梯度再求了一次导,得到α作为不同梯度的权重,就是不同位置梯度的贡献。
α的推导,对Yc求两次导。
计算在一次反向传播过程中完成,计算量和Grad-CAM相当。但在精准定位和同类多目标问题上提升很大,尤其是同类多目标。
同类多目标效果提升明显。
自己实现的二分类语义分割任务上的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(以及代码实现)
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