学习打卡03可解释机器学习笔记之cam类激活热力图

风信子的猫Redamancy 风信子的猫Redamancy     2022-12-19     688

关键词:

可解释机器学习笔记之CAM类激活热力图

文章目录


首先非常感谢同济子豪兄拍摄的可解释机器学习公开课,并且免费分享,这门课程,包含人工智能可解释性、显著性分析领域的导论、算法综述、经典论文精读、代码实战、前沿讲座。由B站知名人工智能科普UP主“同济子豪兄”主讲。 课程主页: https://github.com/TommyZihao/zihao_course/blob/main/XAI 一起打开AI的黑盒子,洞悉AI的脑回路和注意力,解释它、了解它、改进它,进而信赖它。知其然,也知其所以然。这里给出链接,倡导大家一起学习, 别忘了给子豪兄点个关注哦。

学习GitHub 内容链接:
https://github.com/TommyZihao/zihao_course/tree/main/XAI

B站视频合集链接:
https://space.bilibili.com/1900783/channel/collectiondetail?sid=713364

CAM介绍

一直以来,深度神经网络的可解释性都被大家诟病,训练一个神经网络被调侃为“炼丹”。所得的模型也像一个“黑盒”一样,给它一个输入,然后得到结果,却不知道模型是如何得出结论的,究竟学习到了什么知识。如果能将其训练或者推理过程可视化,那么可以对其更加深入的理解,目前深度神经网络可视化可以分为:

  • 可视化卷积核;

  • 可视化特征图;

  • 可视化激活热力图,也就是不同位置像素点对得出结果的影响程度

图 神经网络可视化汇总

其中,可视化卷积核 (a) 的方法最早出现,早在 2012 年的 AlexNet 就借助它来帮助解释 CNN 中卷积核的作用。

可视化特征图 (b) 方法出自 2014 年的《Visualizing and Understanding Convolutional Networks》一文,也就是上一期的学习的ZFNet的方法,这种方法通过反卷积和反池化对特征图进行了可视化,对于浅层网络的可视化效果良好。

可视化类激活热力图(Class Activation Map, CAM),也就是本文的主角,提出自 2015 年,它能够更进一步地可视化神经网络在预测某一类别时,具体关注了图像的哪些像素。在此基础上,近年来也一直有改进的方法被提出,比如Grad-CAM,ScoreCAM等等

image from woopets(activation maps created with a pretrained Resnet-18)

简单总结:

  1. 对深度学习实现可解释性分析、显著性分析

  2. 可扩展性强,后续衍生出各种基于CAM的算法

  3. 每张图片、每个类别,都能生成CAM热力图

  4. 弱监督定位:图像分类模型解决定位问题

  5. 潜在的“注意力机制"

  6. 使得Machine Teaching成为可能

CAM算法原理

首先我们可以看到,他的过程实际上就是一个新的CNN网络,从输入图像,到CNN网络,再到一个全局平均池化GAP。从最后一个GAP中我们可以得到512个平均值,得到512个feature之后,最后的线性层实际上就是对得到的512个feature让神经网络去学习哪个的权重更大,最后得到最后的预测结果。

GAP全局平均池化

在常见的卷积神经网络中,全连接层之前的卷积层负责对图像进行特征提取,在获取特征后,传统的方法是接上全连接层之后再进行激活分类,而GAP的思路是使用GAP来替代该全连接层(即使用池化层的方式来降维),更重要的一点是保留了前面各个卷积层和池化层提取到的空间信息\\语义信息,所以在实际应用中效果提升也较为明显!最早是在 Network In Network 中提出的。

这个全局平均池化,其实是对512x14x14的feature map进行做平均,这样就得到了512个平均值。实际上,GAP直接从 feature map 的通道信息下手,比如我们现在的分类有N种,那么最后一层的卷积输出的 feature map 就只有N个通道,然后对这个 feature map 进行全局池化操作,获得长度为N的向量,这就相当于直接赋予了每个通道类别的意义。

用GAP代替线性层是很有意义的,比如在VGG中,线性层的参数几乎占据所有参数的90%,所以进行替换是很有必要的;除此之外,我们会看到ResNet也有全局池化层。因为线性层不是起主要作用的,但是却占据了很多的参数,在ZFNet中也已经探究过了最后一层了,所以替换为GAP层既能减少参数,也不会太对模型造成影响。

GAP简单总结

  • 取代全连接层,避免使用全连接层导致参数量爆炸

  • 全局平均池化 (GAP) 减少参数量、防止过拟合

  • 而且每个GAP平均值,间接代表了卷积层最后一层输出的每个channel

GAP VS GMP

这里面作者讲了一下GAP和GMP,那为什么不用GMP呢,实际上GAP对关键区域范围内的特征都有影响,但在GMP中,非最大值的特征不影响模型分类性能,虽然GAP和GMP分类性能接近,但定位性能不同,所以最后还是选择了GAP。

CAM算法的缺点及改进

CAM算法确实很不错,但是他也存在一部分的缺点

1.必须得有GAP层,否则得修改模型结构后重新训练

2.只能分析最后一层卷积层输出,无法分析中间层

所以在后续的Grad-CAM中,针对这两个问题就进行了改进,利用求梯度的方法,这样就不需要对模型重新训练,并且也可以对每一层卷积层都能进行分析,得到最后的激活图,后续会对Grad-GAM进行学习。

CAM简单概括即为:修改网络全连接为GAP形式,利用GAP层与全连接的权重作为特征融合权重,对特征图进行线性融合获取CAM。

CAM可视化

通过线性分类权重,间接反映了类别对通道(channel)的关注程度,最后一层卷积层既保留了语义信息,又保留了位置信息。将某一类的线性分类权重与最后一层卷积层进行对应相乘,可得到该类的CAM类激活热力图。

假设 f k ( x , y ) f_k(x, y) fk(x,y) 表示最后一层卷积层输出的feature map中第 k k k 个channel上坐标为 ( x , y ) (x, y) (x,y) 的值,将 F k F^k Fk 记为全局平均池化GAP值,即:
F k = ∑ x , y f k ( x , y ) F^k=\\sum_x, y f_k(x, y) Fk=x,yfk(x,y)
对于某一类 c c c , softmax层的输入值记为 S c S_c Sc ,即:
S c = ∑ k w k c F k S_c=\\sum_k w_k^c F_k Sc=kwkcFk
其中, w k c w_k^c wkc 表示第 k k k 个channel的类 c c c 的权重。最后softmax层的输出值记为 P c P_c Pc ,即
P c = exp ⁡ ( S c ) ∑ c exp ⁡ ( S c ) P_c=\\frac\\exp \\left(S_c\\right)\\sum_c \\exp \\left(S_c\\right) Pc=cexp(Sc)exp(Sc)
M c M_c Mc 为类 c c c 的CAM值,记为:
M c ( x , y ) = ∑ k w k c f k ( x , y ) M_c(x, y)=\\sum_k w_k^c f_k(x, y) Mc(x,y)=kwkcfk(x,y)
S c = ∑ x , y M c ( x , y ) S_c=\\sum_x, y M_c(x, y) Sc=x,yMc(x,y)

所以最后其实是得到最后的 M c M_c Mc,按照权重,最后进行上采样回原图的shape,最后就可以得到我们的类激活热力图。

同张图,不同类别

除此之外,由于因为CAM基于分类,所以被激活的区域是根据分类决定的,即同一个特征图,只更新不同的权重。所以即使我们使用同一张input,就像下面这个例子,这一同一张图,查看不同的类别

示例图片的地面真值是圆顶。五张类激活映射分别是前五名预测类别和得分。我们可以看到如果输出是宫殿,网络关注的是整块区域的。如果输出是圆顶,网络只是关注宫殿顶部。

不同图,同个类别

我们还可以查看,不同图,同个类别的可视化,从中我们会发现,实际上抓取的信息都是类别的主要特征,比如狗主要的是头的特征等的,这些也可以体现出CAM的重要意义

CAM弱监督定位

所谓的弱监督定位,实际上是用图像分类标注训练定位、检测、分割。

在早期的方法中,有一些比如可使用图像遮挡测试进行定位,可使用重叠图块进行预测,但是这些工作需要多次前向预测,并且是非端到端的;也可使用全局最大池化,导致只能获得边缘点,而非物体范围。

但是提出了CAM之后,这个方法可以使用GAP全局平均池化后进行绘制CAM热力图,并进行物体定位,只需要取连通图的20%的区域画出框,就可以得到结果。

直观上来说,CAM表示出了神经网络较为关注的区域,并且确定了类别,所以我们就可以认为,神经网络关注的区域按理来说,应该是类别的区域,在下图,我们也可以看到出来的他的表现,可以看出来,表现的还是比较好的,论文中认为IOU的阈值为0.5,最后的准确率大概能达到41%以上,比随机框的0.5%好很多。

用语义特征编码进行分类

由于我们的GAP层后,学习到了一部分有用的特征,所以在这个时候,我们就可以取出这一部分语义特征,对语义特征进行分类,其实简单来说,就是把训练好的模型的GAP层的输出,放到SVM线性层进行分类,判断是否能学到知识,其实我觉得这个和线性层是类似的,是相同的。除此之外,作者还在很多数据集上进行了测试,都得到了不错的结果,也侧面说明,实际上GAP从中还是学习到了很多的知识的。

CAM各种有意思的应用

CAM还可以利用在很多有意思的区域,这里面列了几种,还是非常有意思有意义的,也侧面展示了CAM是非常非常有用的,让我也个人感觉是非常make sense的。

发现场景中有意义的物体

我们可以用CAM可以看到场景中的一些物体,我们可以看到CAM关注的区域,实际上就是,对于场景有重要意义的位置。

定位比较抽象的概念

还可以通过一个短语训练一个网络,通过检测文字的信息,这样可以得出图像和短语中有意义判断的区域

弱监督文字检测

还可以进行文字检测,进行文字检测,我们可以看到CAM图关注的还是文字的区域

VQA任务

我们还可以做VQA任务,我们可以对得到结果在图像中表现出来,比如brown是哪一部分,在图像中也会展示出来。

显著性分析的意义

在学习过程中,我发现很有意思的一个东西,就是从Machine Learning到Machine Teaching,在视频中讲解了一个博士做的一个工作的结果,在一定的训练和学习的时候,AI已经能够达到远超人类的能力了,这个时候,AI已经可以可以教一些工人去学习,告诉他们哪一部分是比较重要的了,去teach和帮助人类去学习了。

包括还有一篇比较有意思的论文,Making a Bird AI Expert Work for You and Me,AI已经可以教你去识别各种鸟类了,他可以帮助你成为专家,教你去学习

其实听到这一部分,我觉得很有意思,实际上AlphaGo不就是在做这样的事情么,包括腾讯的绝艺机器人成为国家的陪练,这时候AI已经超过了人类的,他可以反过来去教人类怎么下围棋,怎么跳出一个已有的框,得到更好的结果。

但是,有些人说的也对,这有什么意义呢,如果AI已经表现的很好,那我们的钻研可能就变成了没什么意义了,有些人苦练围棋三十载,准备一鸣惊人的时候,AI已经双手插兜,找不到对手了,那他可能苦练的意义就不大了,这也是一种悲哀。不过在某一方面,AI在学习,我们人也在学习,科技的进步一定是有意义的,一定会对我们的生活带来好处。

总结和思考

  • 为什么要对深度学习模型做可解释性分析和显著性分析?
  • CAM有哪些应用场景?
  • CAM方法,与基于梯度和反向传播的显著性分析方法,有什么区别?
  • 原始的CAM方法有什么缺点?后续有哪些算法做了什么样的改进?
  • 论文中,如何用CAM热力图实现物体的定位?这种定位方法的巧妙之处是什么?
  • 如何理解CAM的“弱监督定位” ?
  • 哪些经典的图像分类网络中用到了GAP层?
  • GAP层在普通卷积神经网络中的作用是什么?
  • GAP层在CAM中的作用是什么?
  • 原生CAM仅用于图像分类,针对目标检测、图像分割、关键点检测等涉及位置坐标的Dense Prediction任务,如何进行可解释性分析和显著性分析?
  • CAM方法有哪些缺点?如何改进?

对于CAM中的弱监督的物体定位,其实是用图像分类标注训练定位、检测、分割,可使用图像遮挡测试进行定位,可使用重叠图块进行预测,这些工作需要多次前向预测,并且是非端到端的;也可使用全局最大池化,导致只能获得边缘点,而非物体范围。可以使用GAP方式进行绘制CAM热力图,并进行物体定位,只需要取连通图的20%的区域画出框,就可以得到结果。

与反向传播的显著性分析方法来比,实际上CAM生成是一个粗粒度的矩阵,而基于反向传播的方法实际上生成的比较细粒度的矩阵,在CAM的附件中有,他的方法实际上是求了对于每一个像素的梯度,所以是比较细粒度的,这两者是不同的,从下图我们也可以看到一些比较。

在论文中,实际上是通过对CAM热力图的连通性进行操作,取最大值的20%的区域进行画框,这样就可以完成定位,这样定位的巧妙之处在于,实际上不需要通过更多的任务,我们只通过有图像分类的数据集就可以实现物体的定位,非常巧妙。

在一些经典的图像分类网络中,我所知道的Inception和ResNet其实就用到了GAP层,这其实极大的减少了参数,也提高了网络的泛化性,是一个很好的尝试和改进。

读了这篇论文后,让我知道,CAM 可视化可以帮助我们理解模型原理,分析预测错误的原因。但是需要注意的是,CAM 的可视化只能解释模型在分类时关注的区域;除此之外,CAM使得弱监督学习发展成为可能,可以慢慢减少对人工标注的依赖,能降低网络训练的成本。通过可视化,就像往黑箱子里打了一个手电筒,让人们可以尝试去理解网络,是非常好的一篇论文。

参考阅读

学习打卡05可解释机器学习笔记之cam+captum代码实战(代码片段)

可解释机器学习笔记之CAM+Captum代码实战文章目录可解释机器学习笔记之CAM+Captum代码实战代码实战介绍torch-cam工具包可视化CAM类激活热力图预训练ImageNet-1000图像分类-单张图像视频以及摄像头预测pytorch-grad-cam工具包Grad-CAM热... 查看详情

学习打卡05可解释机器学习笔记之cam+captum代码实战(代码片段)

可解释机器学习笔记之CAM+Captum代码实战文章目录可解释机器学习笔记之CAM+Captum代码实战代码实战介绍torch-cam工具包可视化CAM类激活热力图预训练ImageNet-1000图像分类-单张图像视频以及摄像头预测pytorch-grad-cam工具包Grad-CAM热... 查看详情

学习打卡04可解释机器学习笔记之grad-cam

可解释机器学习笔记之Grad-CAM文章目录可解释机器学习笔记之Grad-CAMGrad-CAM介绍Grad-CAM是CAM的泛化形式Gard-CAM可视化结果Grad-CAM算法的优点Grad-CAM算法的缺点Grad-CAM变种Grad-CAM++Score-CAMLayer-CAM思考与总结参考阅读首先非常感谢同... 查看详情

学习打卡04可解释机器学习笔记之grad-cam

可解释机器学习笔记之Grad-CAM文章目录可解释机器学习笔记之Grad-CAMGrad-CAM介绍Grad-CAM是CAM的泛化形式Gard-CAM可视化结果Grad-CAM算法的优点Grad-CAM算法的缺点Grad-CAM变种Grad-CAM++Score-CAMLayer-CAM思考与总结参考阅读首先非常感谢同... 查看详情

学习打卡04可解释机器学习笔记之grad-cam

可解释机器学习笔记之Grad-CAM文章目录可解释机器学习笔记之Grad-CAMGrad-CAM介绍Grad-CAM是CAM的泛化形式Gard-CAM可视化结果Grad-CAM算法的优点Grad-CAM算法的缺点Grad-CAM变种Grad-CAM++Score-CAMLayer-CAM思考与总结参考阅读首先非常感谢同... 查看详情

学习打卡07可解释机器学习笔记之shape+lime代码实战(代码片段)

可解释机器学习笔记之Shape+Lime代码实战文章目录可解释机器学习笔记之Shape+Lime代码实战基于Shapley值的可解释性分析使用Pytorch对MNIST分类可解释性分析使用shap的DeepExplainer进行可视化使用Pytorch对预训练ImageNet图像分类可解... 查看详情

学习打卡07可解释机器学习笔记之shape+lime代码实战(代码片段)

可解释机器学习笔记之Shape+Lime代码实战文章目录可解释机器学习笔记之Shape+Lime代码实战基于Shapley值的可解释性分析使用Pytorch对MNIST分类可解释性分析使用shap的DeepExplainer进行可视化使用Pytorch对预训练ImageNet图像分类可解... 查看详情

学习打卡02可解释机器学习笔记之zfnet

可解释机器学习笔记之ZFNet文章目录可解释机器学习笔记之ZFNetZFNet介绍ZFNet结构特征可视化可视化结构特征不变性特征演化遮挡性分析其他内容总结和思考首先非常感谢同济子豪兄拍摄的可解释机器学习公开课,并且免费分... 查看详情

学习打卡01可解释机器学习之导论

可解释机器学习之导论文章目录可解释机器学习之导论可解释学习为什么我们需要可解释机器学习前沿的AI方向可解释性好的机器学习算法深度学习的可解释性分析可视化卷积核遮挡Mask、缩放、平移、旋转找到能使某个神经元激... 查看详情

学习打卡07可解释机器学习笔记之shape+lime代码实战(代码片段)

可解释机器学习笔记之Shape+Lime代码实战文章目录可解释机器学习笔记之Shape+Lime代码实战基于Shapley值的可解释性分析使用Pytorch对MNIST分类可解释性分析使用shap的DeepExplainer进行可视化使用Pytorch对预训练ImageNet图像分类可解... 查看详情

学习打卡07可解释机器学习笔记之shape+lime代码实战(代码片段)

可解释机器学习笔记之Shape+Lime代码实战文章目录可解释机器学习笔记之Shape+Lime代码实战基于Shapley值的可解释性分析使用Pytorch对MNIST分类可解释性分析使用shap的DeepExplainer进行可视化使用Pytorch对预训练ImageNet图像分类可解... 查看详情

学习打卡02可解释机器学习笔记之zfnet

可解释机器学习笔记之ZFNet文章目录可解释机器学习笔记之ZFNetZFNet介绍ZFNet结构特征可视化可视化结构特征不变性特征演化遮挡性分析其他内容总结和思考首先非常感谢同济子豪兄拍摄的可解释机器学习公开课,并且免费分... 查看详情

计算机视觉可解释性——cam热力图的研读与复现(代码片段)

论文题目:LearningDeepFeaturesforDiscriminativeLocalization(ClassActivationMapping)论文地址:https://arxiv.org/pdf/1512.04150.pdf完整代码:https://github.com/metalbubble/CAM————————————————————— 查看详情

pytorch框架学习---hook函数和cam类激活图(代码片段)

本节简单总结Pytorch中hook函数,CAM算法生成注意力图【文中思维导图采用MindMaster软件】注意:对于真正运用CAM的代码,本人后续随着需要,再逐步更新。目录1.hook函数(1)定义(2)方法2.CAM(ClassActivationMap)类激活图(1)原始C... 查看详情

热力图可视化工具

...到结果,却不知道模型是如何得出结论的,究竟学习到了什么知识。如果能将其训练或者推理过程可视化,那么可以对其更加深入的理解,目前深度神经网络可视化可以分为:可视化卷积核;可视化特征图... 查看详情

一导论——可解释性机器学习(datawhale组队学习)

目录导言一、什么是可解释人工智能?二、学可解释机器学习有什么用?2.1学习可解释机器学习的原因2.2MachineTeaching:人工智能教人类学习2.3细粒度图像分类2.4前沿AI三、本身可解释性好的机器学习模型四、传统机器学习算法的可解... 查看详情

机器学习笔记:形象的解释神经网络激活函数的作用是什么?

...nbsp;忆臻原出处:https://zhuanlan.zhihu.com/p/25279356查阅资料和学习,大家对神经网络中激活函数的作用主要集中下面这个观点:激活函数是用来加入非线性因素的,解决线性模型所不能解决的问题。下面我分别从这个方面通过例子给... 查看详情

xai/ml:可解释人工智能xai/机器学习模型可解释性的简介意义常用方法(包括工具包)及其对比之详细攻略

XAI/ML:可解释人工智能XAI/机器学习模型可解释性的简介、意义、常用方法(包括工具包)及其对比之详细攻略目录可解释人工智能XAI/机器学习模型可解释性的简介、意义、常用方法(包括 查看详情