使用CAM解密卷积神经网络

code:https://github.com/philipperemy/tensorflow-class-activation-mapping
paper:https://arxiv.org/abs/1512.04150

文章目录

  • 前言
  • 网络架构
  • 简单的工作
  • 实现和结果
  • 结论

前言

无论是金融领域的股票价格预测,还是计算机视觉领域的目标检测和分割等复杂任务,机器学习在各个领域的应用都在迅猛发展。人工智能革命已经席卷了所有领域,在某些领域,机器学习算法的表现甚至超过了人类水平。例如,ImageNet挑战是每年组织等各种计算机视觉任务的图像分类、目标检测、图像定位等,每年的错误率表现最好的算法继续下降,2017年,38个比赛的队伍中有29大于95%的准确率。据报道,在大规模ImageNet数据集上,人类最高的5个分类错误率为5.1%,而最先进的CNN的准确率约为3.57%。

随着机器学习系统性能的不断提高,系统的可解释性逐渐下降。与基本的机器学习算法如线性回归、K近邻、决策树等相比,这种趋势在由数百万参数和数百层组成的深度学习算法中表现得更为明显。这些算法就像黑匣子一样,从用户那里获取输入,并给出超出预期的输出,但却没有提供导致这种输出的因果信息的直觉。这些算法可能适用于以准确性为主要要求的任务,如Kaggle竞赛,数据科学家不必向各种利益相关者解释和解释结果。但在结果可解释性非常重要的应用中,黑盒性质会导致各种障碍。例如,如果一些图像识别系统在图像和训练来检测肿瘤在精度方面表现很好验证和测试集。但当你将结果呈现给利益相关者,他们的问题是模型学习了哪些部分图像或输出的主要原因是什么,你最可能的答案是“我不知道”,无论多么完美的模型,利益相关者不会接受它,因为人的生命岌岌可危。

随着机器学习特别是深度学习领域研究的不断深入,人们正在为解决可解释性问题,达到可解释性人工智能阶段做出各种努力。

CNN的各种可视化技术已经被发现,其中之一是类别激活映射( Class Activation Maps , CAM)。

本文引入的类别激活映射或CAM,利用cnn中的全局平均池化方法学习深度特征进行判别定位。一个特定类别的类别激活映射表明了CNN用来识别类别的判别区域。

网络架构

该论文的作者使用了类似googleNet和Network in Network的网络架构。该网络主要由大量的卷积层组成,就在最终输出层之前,我们进行了全局平均池化。这样获得的特性被馈送到具有softmax激活并产生所需输出的全连接层。我们可以通过将输出层的权值投影到上一个卷积层得到的卷积特征映射上来识别图像区域的重要性。这种技术称为类别激活映射。

使用CAM解密卷积神经网络_第1张图片
全局平均池化层(GAP,Global Average Pooling layer)优于Oquab等人使用的全球最大池化层(GMP,Global MaxPooling Layer),因为GAP层有助于识别对象的完整范围,而GMP层只识别一个区别部分。这是因为在GAP中,我们对所有的激活进行平均,这有助于找到所有的区别区域,而GMP层只考虑最区别的区域。

最后一个卷积层中每个单元的特征图的空间平均由间隙层产生,然后对间隙层加权求和,得到最终的输出。同样,我们生成最后一个卷积层的加权和来获得我们的类激活映射。

简单的工作

定义架构之后,让我们看看如何工作来生成类激活映射。让我们考虑一个包含一个对象的图像,我们已经训练了我们的网络。softmax层输出模型所训练的各种类的概率。通过使用所有概率的Argmax,我们找到最可能出现在图像中的对象的类。最后一层对应于该类的权值被提取出来。提取最后一层卷积层的特征图。

使用CAM解密卷积神经网络_第2张图片
从最后一层提取权重,建立模型输出特征映射和最终预测类。
在这里插入图片描述
其中Feature表示从上一层得到的Feature Map, results表示每个类的类概率。

最后,计算最后一层提取的权值与特征图的点积,生成类激活映射。通过使用双线性插值对类激活图进行升级采样,并将其叠加在输入图像上,以显示CNN模型所关注的区域。

使用CAM解密卷积神经网络_第3张图片
该代码显示了在10张图像中迭代,对提取的预测类的特征映射进行上采样,并最终在特征映射和最终层权重之间执行点积。

实现和结果

最初,使用如下的模型架构,3个卷积层,每个层后面是max-pooling层,最后的卷积层,后面是GAP层,最后是softmax激活的输出层。
使用CAM解密卷积神经网络_第4张图片
使用CAM解密卷积神经网络_第5张图片
使用CAM解密卷积神经网络_第6张图片
上述模型在MNIST数据集上进行训练,在训练、验证和最终测试集上产生了约99%的准确性。

执行上述步骤,得到如下结果:
使用CAM解密卷积神经网络_第7张图片使用CAM解密卷积神经网络_第8张图片使用CAM解密卷积神经网络_第9张图片使用CAM解密卷积神经网络_第10张图片使用CAM解密卷积神经网络_第11张图片使用CAM解密卷积神经网络_第12张图片

原方法得到的输出是令人满意的,但由于每个卷积层之后的max-pooling层会丢失空间信息,因此不能完全清晰,因此仍然令人困惑。

为了解决这个问题,我对架构做了一些调整,删除了所有最大池化层,从而保留了有助于提高模型定位能力的空间信息。但是移除MaxPooling层后,由于feature map的尺寸很大,它也会使得训练时间增长。

第二部分使用了以下架构:

使用CAM解密卷积神经网络_第13张图片
使用CAM解密卷积神经网络_第14张图片
使用CAM解密卷积神经网络_第15张图片
第二种模型在训练、验证和最终测试集上的准确率为97%。
调整后的模型得到以下结果:
注意:在第二个模型中没有应用最大池化,因此在向前传递过程中没有减少维度。因此,我们不需要对上一个卷积层获得的feature map进行上采样。
使用CAM解密卷积神经网络_第16张图片使用CAM解密卷积神经网络_第17张图片使用CAM解密卷积神经网络_第18张图片使用CAM解密卷积神经网络_第19张图片使用CAM解密卷积神经网络_第20张图片使用CAM解密卷积神经网络_第21张图片

结论

类激活映射或CAMs是一个很好的方式,可以看到你的CNN模型在训练时看到了什么,并为开发者和利益相关者提供见解,这对模型的可用性和生命周期是非常关键的。通过摄像头的帮助开发人员可以看到哪些地区在图像模型看,可以用来检验模型偏差的原因,缺乏概括能力或其他原因,当固定可以使模型更加健壮和可部署在现实世界中。

随着计算机视觉和深度学习领域研究的不断深入,各种深度学习框架如Tensorflow、Pytorch等不断在其环境中添加新的包,以方便用户使用,并关注可解释性。Tensorflow在可解释模型领域迈出了很好的一步,它推出了一个名为tf的特殊包。解释使用哪些技术(如类激活映射等)为你实现和优化,你只需要导入库,创建它的对象,传递输入并在几秒钟内接收结果,而无需花费时间从头实现算法。

你可能感兴趣的:(图像分类,深度学习)