Grad-CAM原理

这篇是我对哔哩哔哩up主 @霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享

只要大家一提到深度学习

缺乏一定的解释性

比如说在我们之前讲的分类网络当中

网络它为什么要这么预测

它针对每个类别所关注的点在哪里呢

Grad-CAM原理_第1张图片

在great cam这篇论文当中呢

就完美的解决了在cam这篇论文当中存在一些问题

在great cam当中

我们既不需要修改网络的结构

也不需要对网络做进一步的训练

Grad-CAM原理_第2张图片

举个非常有意思的一个例子

这里呢我们也来简单的聊一聊

那么首先呢作者训练了一个二分类网络

也就是针对护士以及医生这两个类别的

那对于这个带有偏见的模型呢

首先对于护士这个类别

你会发现他预测的是正确的

然后通过我们绘制热力图呢

你会发现其实它主要关注的区域是在人脸的这个区域

大家想想你通过人脸就能分辨出他是医生还是护士吗

其实我个人觉得仅仅通过人脸是很难区分出来的

然后接下来我们再看下面这个图

也就是它的正确标签应该是医生

但是我们这个带有偏见的模型呢

它预测的结果是护士 预测错误

这个不带偏见的模型

它是根据不同职业所使用的器械或者说工具

以及它的穿着来得出最终预测结果的

那么很明显

这相比于我们仅仅通过人脸来判断他的职业要更加的科学一些

那么再看一下这个图

这个带偏见的模型呢

它学到特征其实是有问题的

那么作者呢有进一步分析这个带偏见模型它所对应的训练的数据集

然后作者发现在这个数据集当中

护士这个类别绝大多数都是女性

所以这就导致了训练得到这个模型

它是带有偏见的

那么为了解决这个问题呢

作者就调整了一下训练数据当中不同职业男女之间的一个比例

那么调整均衡之后再去训练网络

就得到了这个不带偏见的模型

那么它的测试集的准确率由原来的%多

提升到了%多的明显效果是变好了的

所以我觉得作者举这个例子呢是值得我们大家去思考以及借鉴

Grad-CAM原理_第3张图片

cam的适用性非常强的

然后我们来看一下我刚刚提供的关于这个pytorch实现cam这个仓库

那么在这个仓库下呢

还提供了比如说像目标检测以及语义分割的一些使用方法

其实作者有给出对应的一个使用教程啊

那么这里我给出针对目标检测的语义分割的

还有针对使用像transformer模型

它的一个使用的案例

那么大家有兴趣的话可以自己去看一下

那接着我们再回到我们的ppt当中

我们现在就以图像分类这个任务为例啊

那么黑色这个箭头呢代表的是我们正向传播的一个过程

蓝色这个箭头呢代表的是梯度反传的一个过程

那比如说针对我们图像分类这个任务

假设我想看一下对于tiger cat这个类别

我们网络究竟关注的区域在哪

那么他就根据网络预测的tiger cat这个类别的数据进行一个反向传播

Grad-CAM原理_第4张图片

这里的数据是没有通过softmax激活的

我们就能得到针对这个特征层A的一个反向传播的梯度信息

Grad-CAM原理_第5张图片

比如说我把它标记为A'

Grad-CAM原理_第6张图片

然后呢作者对这里的a撇在它的每一个通道位置上去求一个均值

那么就得到我们这里的每一个w

那这里的w呢就是针对我们这个特征层a每一个通道的一个权重

然后接下来做的再进行一个加权求和

通过relu函数得到我们最终的great cam【还要通过relu?】

那这里呢我简单的讲一下我个人的一个看法

首先是关于得到这个特征层A是网络对原图进行特征提取得到的结果

那一般呢越往后的特征层它的抽象程度越高

语义信息呢也是越来越丰富

并且利用cnn过去得到这个特征层

它是能够保留空间信息的

那么在我们得到的最终的这个特征层A上呢

它对应的激活区域差不多也是在这个位置

所以说我们声音网络它是能够保留空间信息的

其实不光是cnn

包括我们最近常用的transformer模型也是一样的

那么在原论文的图当中呢

我们一般所说的这个特征成层A都是指的卷一层当中最后一个卷积层

它所输出的特征层

然后这里的A'是y(c)对A求得这个偏导

那么换句话说就是A'

它代表的是A中每个元素对我们最终这个y(c)结果一个贡献值

那么贡献越大就代表网络认为它有越重要

所以呢接下来我们对A'在每个通道上去取均值

就能得到针对特征层A每个通道的重要程度

然后我们再进行一个加权求和

以及通过relu函数就能得到我们这里的一个cam

那么这里呢我们用公式来进行表示的话

Grad-CAM原理_第7张图片Grad-CAM原理_第8张图片

那么接下来我们来举个例子

方便大家理解

Grad-CAM原理_第9张图片

对cat类别进行反向传播

Grad-CAM原理_第10张图片Grad-CAM原理_第11张图片

然后我们通过relu之后呢

就将那些小于零的数据全部给设置成零

就得到我们最终的great cam有输出了

那么讲呢肯定有人对这里的A'求解是抱有疑惑的

那如果你想了解这个A'怎么求解的话

你可以去看一下我写这个博文

(51条消息) Grad-CAM简介_gradcam_太阳花的小绿豆的博客-CSDN博客

当然在我们去实现的过程当中

其实我们不需要自己去计算

因为现有的新中学框架它都会自动帮我去计算

Grad-CAM原理_第12张图片

再对CAM进行resize变成原图大小

之后再将CAM转化成彩色形式(原CAM是单通道的非彩色)

然后将原图scale处理

将scale后的原图add已处理完的cam

将add后的结果再进行scale

即可得到覆盖了cam的输出图片

你可能感兴趣的:(类激活映射,CAM,计算机视觉,python)