主要内容

使用类激活映射研究网络预测

这个例子展示了如何使用类激活映射(CAM)来研究和解释用于图像分类的深度卷积神经网络的预测。

深度学习网络通常被认为是“黑匣子”,无法确定网络学习了什么,或者网络输入的哪一部分负责网络预测。当这些模型失败并给出错误的预测时,它们往往会在没有任何警告或解释的情况下惊人地失败。类激活映射[1]是一种可以用来获得卷积神经网络预测的可视化解释的技术。不正确的、看似不合理的预测往往有合理的解释。使用类激活映射,您可以检查输入图像的特定部分是否“混淆”了网络并导致其做出错误的预测。

您可以使用类激活映射来识别训练集中的偏差,并提高模型精度。如果发现网络基于错误的功能进行预测,则可以通过收集更好的数据使网络更加健壮。例如,假设您训练一个网络来区分猫和狗的图像。该网络在训练集上具有较高的准确性,但在实际示例中表现不佳。通过在训练示例上使用类激活映射,您会发现网络的预测不是基于图像中的猫和狗,而是基于背景。然后,您会意识到,您所有的猫图片都有红色背景,所有的狗图片都有绿色背景,而这正是网络在训练期间学习到的背景颜色。然后,您可以收集没有这种偏差的新数据。

此示例类激活映射显示输入图像的哪些区域对预测类贡献最大老鼠.红色区域贡献最大。

加载预训练网络和网络摄像头

加载预训练卷积神经网络用于图像分类。SqueezeNet、GoogLeNet、ResNet-18和MobileNet-v2是相对快速的网络。SqueezeNet是最快的网络,其类激活图的分辨率是其他网络的四倍。不能对在网络末端具有多个完全连接层的网络(如AlexNet、VGG-16和VGG-19)使用类激活映射。

网络=“挤压网”; net=eval(网络名);

创建一个网络摄像头对象并连接到网络摄像头。

摄像头=网络摄像头;

提取网络的图像输入大小和输出类。这个激活层名称本例末尾定义的helper函数返回要从中提取激活的层的名称。该层是网络最后一个卷积层之后的ReLU层。

inputSize=净层(1)。inputSize(1:2);classes=净层(end).classes;layerName=激活layerName(网络名称);

显示类激活映射

创建一个图形并在循环中执行类激活映射。要终止循环的执行,请关闭图形。

h=数字(“单位”,“正常化”,“位置”,[0.05 0.05 0.9 0.8],“可见的”,“开”);虽然伊山德尔(h)

使用网络摄像头拍摄快照。调整图像大小,使其最短边的长度(在本例中为图像高度)等于网络的图像输入大小。调整大小时,保留图像的纵横比。也可以将图像大小调整为更大或更小的大小。使图像变大会增加最终类激活贴图的分辨率,但会导致整体预测不太准确。

计算网络最后一个卷积层之后的ReLU层中调整大小的图像的激活。

我=快照(相机);imresize = imresize(im,[inputSize(1), NaN]);imageActivations =激活(网,imResized, layerName);

特定类的类激活图是最终卷积层之后的ReLU层的激活图,通过每个激活对该类的最终分数的贡献程度进行加权。这些权重等于该类网络的最终完全连接层的权重。SqueezeNet没有最终完全连接层连接层。相反,在最后一个卷积层之后的ReLU层的输出已经是类激活映射。

您可以为任何输出类生成类激活映射。例如,如果网络进行了不正确的分类,则可以比较真实类和预测类的类激活映射。对于本例,为得分最高的预测类生成类激活映射。

分数=挤压(平均值(图像激活[12]);如果网名~=“挤压网”fcWeights=净层数(end-2)。权重;fcBias=净层(end-2)。偏差;分数=fcWeights*分数+fcBias;[~,classIds]=maxk(分数3);权重向量=shiftdim(fcWeights(ClassID(1),:),-1);classActivationMap=sum(imageActivations.*权重向量,3);其他的[~,classIds]=maxk(分数3);classActivationMap=imageActivations(:,:,ClassID(1));终止

计算顶级班级标签和最终标准化班级分数。

分数=经验(分数)/总和(经验(分数));maxScores=分数(ClassID);标签=类别(ClassID);

绘制类激活图。在第一个子图中显示原始图像。在第二个子图中,使用卡姆秀在本例末尾定义的helper函数,用于在原始图像的变暗灰度版本上显示类激活贴图。显示前三个预测标签及其预测分数。

子批次(1,2,1)imshow(im)子批次(1,2,2)CAMshow(im,classActivationMap)标题(字符串(标签)+", "+字符串(maxScores));刷新屏幕终止

清除网络摄像头对象。

清晰的照相机

示例地图

网络正确地将图像中的物体识别为loafer(一种鞋)。右侧图像中的类激活映射显示了输入图像的每个区域对预测类的贡献游手好闲的。红色区域贡献最大。该网络基于整个鞋进行分类,但最强的输入来自红色区域,即鞋尖和开口。

网络将此图像分类为鼠标。如类激活图所示,预测不仅基于图像中的鼠标,还基于键盘。由于训练集可能在键盘旁边有许多鼠标图像,该网络预测,包含键盘的图像更可能包含鼠标。

该网络将这张咖啡杯图像归类为一个扣。如类激活图所示,网络错误分类图像,因为图像包含太多混淆对象。网络检测并关注手表腕带,而不是咖啡杯。

辅助函数

卡姆Show(im,CAM)覆盖类激活映射凸轮在一个变暗的,灰度版本的图像感应电动机。该函数将类激活映射的大小调整为感应电动机,对其进行规范化,从下面设置阈值,并使用喷气式飞机彩色地图。

作用CAMshow(im,CAM)imSize=尺寸(im);CAM=imresize(CAM,imSize(1:2));CAM=标准化图像(CAM);凸轮(凸轮<0.2)=0;cmap=jet(255)。*linspace(0,1255)';CAM=ind2rgb(uint8(CAM*255),cmap)*255;组合图像=双(rgb2gray(im))/2+CAM;组合图像=标准化图像(组合图像)*255;imshow(uint8(组合图像));终止作用N=正常化年龄(I)最小值=最小值(I(:);最大值=最大值(I(:);N=(I-最小值)/(最大-最小值);终止作用layerName=激活layerName(网络名称)如果网名==“挤压网”层名称=“relu_conv10”;埃尔塞夫网名==“谷歌网”层名称=“初期5b-产出”;埃尔塞夫网名==“resnet18”层名称=“res5b_relu”;埃尔塞夫网名==“MobileNet V2”层名称=“出去”;终止终止

参考文献

[1] 周、博雷、阿迪蒂亚·科斯拉、阿加塔·拉佩德里扎、奥德·奥利瓦和安东尼奥·托拉尔巴。“学习区分性本地化的深层特征”,摘自IEEE计算机视觉和模式识别会议记录,第2921-2929页。2016

另见

||||

相关的话题