聪明伶俐的松鼠 · 日本版漫画禁忌女孩 - 抖音· 1 年前 · |
开心的斑马 · 任正非:让听得见炮声的人做决策_华为· 1 年前 · |
爱看球的哑铃 · 地铁13号线拆分,13A线这站即将进场施工_ ...· 1 年前 · |
豪爽的牛肉面 · 蓝光播放机太贵,买不起? 真的不至于 - 知乎· 1 年前 · |
本次分享接在 机器学习可解释性(一) —— 累积局部效应图(ALE) 的后面显得跨度有些大。由于最近正在学习相关的算法,因此希望在此将学习的结果在此展示出来。后续还会看时间分享 Lime, DeepLift 以及 shap 的一系列算法。
类激活映射(Class Activation Mapping,CAM 方法在现在看来可能存在着各种问题,但是其作为该类显著性图算法的“开山之作”,其思想影响了后续诸多方法的产生。本文将在CAM的基础上,介绍的GradCAM, GradCAM++, LayerCAM。
笔者只是简单实验了这几种算法,并根据自己的理解整理出来,在博客中存在的谬误还请指正。
在正式介绍算法实现之前,首先感性认识一下这类算法。 CAM 以及在此基础上衍生出来的 GradCAM, GradCAM++ 等等都是属于 显著性图 可解释性算法,因此这类算法只能应用在图像的问题上,或者说是专门为**卷积神经网络(CNN)**设计的一类可解释性算法。
该类算法利用神经网络的特征图(feature map)得到原图各个部分的重要性,具体来说就是为特征图赋予不同的权重来获得显著性图。
i , j 处的值。各类算法的主要区别体现在算法权重的获取上,其余部分的差异在后文中讲解。
这类算法在实现的过程中需要用到梯度的计算,因此如果使用pytorch实现,需要借助 pytorch hook机制 。
该算法发表在*“Learning Deep Features for Discriminative Localization”*中。
下图是论文中展示的图像。
在 CAM 中,作者认为全局平均池化层具有局部定位能力,将卷积网络后的原本的 池化层和全连接层 改为 全局平均池化 和 全连接层(这里全连接层神经元数和模型类别数相同) ,重新训练训练模型获得权重,将深层特征图加权求和获得显著性图,为卷积神经网络的可解释性提供了全新的思路。
以CAM为基础,为了不需要修改模型结构,根据是否使用梯度计算权重发展出两个类别,使用梯度的方法如GradCAM、GradCAM++、LayerCAM等,而不使用梯度的算法有诸如AblationCAM和ScoreCAM。本文主要介绍使用梯度的算法。
该算法发表在 “Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization” 中。
为了不需要修改模型结构,GradCAM算法巧妙地利用梯度计算权重,得到的显著性图表达式为:
该算法发表在 “Grad-CAM++: Improved Visual Explanations for Deep Convolutional Networks” 中。
GradCAM算法尽管为类激活映射算法提供了全新的思路,但是观察计算公式可以发现,如果某张特征图用来定位图片中的“小目标”,那么该特征图的权重将会很小。为了提高算法的 多目标定位能力 ,GradCAM++利用高维梯度计算权重。
显著性图表达式仍然如公式(2)所示,权重表达式为:
w_{c}^{k}=\sum_{i,j}{\alpha _{i,j}^{k,c}\cdot \mathrm{Re}lu\left( \frac{\partial y^c}{\partial A_{i,j}^{k}} \right)} \tag{4}
w
c
k
=
i
,
j
∑
α
i
,
j
k
,
c
⋅
R
e
l
u
(
∂
A
i
,
j
k
∂
y
c
)
(
4
)
也就是说特征图的权重经过再次加权求和得到,
\alpha _{i,j}^{k,c}=\frac{\frac{\partial ^2y^c}{\left( \partial A_{i,j}^{k,c} \right) ^2}}{2\frac{\partial ^2y^c}{\left( \partial A_{i,j}^{k,c} \right) ^2}+\sum_{a,b}{A_{a,b}^{k}\left\{ \frac{\partial ^3y^c}{\left( \partial A_{i,j}^{k,c} \right) ^3} \right\}}} \tag{5}
α
i
,
j
k
,
c
=
2
(
∂
A
i
,
j
k
,
c
)
2
∂
2
y
c
+
∑
a
,
b
A
a
,
b
k
{
(
∂
A
i
,
j
k
,
c
)
3
∂
3
y
c
}
(
∂
A
i
,
j
k
,
c
)
2
∂
2
y
c
(
5
)
看到这里可能有小伙伴会好奇一阶偏导数可以通过hook机制实现,但是应该如何实现二阶或者三阶导数呢?
扒了两种完整的Github仓库,发现实现过程运用了一种近似的方法,使用一阶导数的平方近似二阶导数,使用一阶导数的三次方近似三阶导数。
该算法发表在 “LayerCAM: Exploring Hierarchical Class Activation Maps for Localization” 中。
CAM类算法理论上是可以部署在卷积神经网络任何一个卷积层上的,然而上述的GradCAM和GradCAM++均在最深层的特征图上取得最好的效果。但是因为深层特征图较小,不够细粒度,为了充分 利用浅层的特征图 ,该算法提供了 像素级的权重 ,而不是像之前算法的那种特征图级的权重。
显著性图的计算公式如公式(6)
w_{i,j}^{k,c}=\mathrm{Re}lu\left( \frac{\partial y^c}{\partial A_{i,j}^{k}} \right) \tag{7}
w
i
,
j
k
,
c
=
R
e
l
u
(
∂
A
i
,
j
k
∂
y
c
)
(
7
)
具体实现过程还经过一些归一化处理,使LayerCAM得到的显著性图控制在[0,1]范围内。
代码根据 frgfm/torch-cam: Class activation maps for your PyTorch models 实现;
更一般的实现方法还可以参考 jacobgil/pytorch-grad-cam
包括 异常检测 和 目标检测 两方面的实现;
这里仅展示结果,算法的详细实现展示在 我的Github项目 项目。
这里对CutPaste异常检测算法(发表在*“CutPaste: Self-Supervised Learning for Anomaly Detection and Localization”*)部署可解释性算法。
数据集: MvTec-AD
待解释算法: CutPaste ,本质是其中的 ResNet 网络
使用最深层部署各算法,结果如下:
数据集: ILSVRC2012
待解释算法: Vgg 网络
使用最深层部署各算法,结果如下:
上文中提到了四种可解释性算法,但是事实上CAM类的算法远不止这些,还有很多变种(如上面提到的不需要梯度的方法)和优化方法(包括去噪方法或提供细粒度解释的Guilded算法);
上述介绍的实验本质上都是部署在一个分类网络的框架上,事实上只要能合理地设计分数,也就是上文的 类激活映射(Class Activation Mapping,CAM)方法作为一类显著图算法的“开山之作”,其思想影响了后续诸多方法的产生。本文将在CAM的基础上,介绍的GradCAM, GradCAM++, LayerCAM的实现原理及相关实验。 Grad- CA M:https://arxiv.org/pdf/1610.02391v1.pdf Grad- CA M++:https://arxiv.org/abs/1710.11063 最近看了网上很多关于这三篇解读的文章,但是对于一个“ CA M新人“来说,还是遇到了很多疑惑。 下面总结几点: 1. CA M能让我们对CN... CVRP 2015,原文链接:http://arxiv.org/abs/1512.04150 官方开源代码:http://cnnlo ca lization.csail.mit.edu/ 本文总结: 1、池化(最大池化,平均池化,全局平均池化【GAP】)的作用:正则化(防止过拟合,降低维度,保留主要特征的同时减少计算量,减少了参数数量) 2、使用GAP来代替FC,优点是最小化参数数量的同时保持高性能 目前在可视化方面,我们已经掌握了许多不同的技术。本文将介绍在卷积神经网络(CNN)中,针对图像的某些部位可视化从而做出判断的不同技术。 类 激活 映射 ( CA M)是一种生成热力图的技术,用于突出图像的 类 的特定区域。 热力图效用 下面是一个典型的热力图: 图片来源:https://github.com/jacobgil/pytorch-grad- ca m 这张图片中...
聪明伶俐的松鼠 · 日本版漫画禁忌女孩 - 抖音 1 年前 |
开心的斑马 · 任正非:让听得见炮声的人做决策_华为 1 年前 |
豪爽的牛肉面 · 蓝光播放机太贵,买不起? 真的不至于 - 知乎 1 年前 |