主要内容

使用类激活映射调查网络预测

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

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

您可以使用类激活映射来识别训练集中的偏差并提高模型精度。如果您发现网络基于错误功能的预测,那么您可以通过收集更好的数据来使网络更加强大。例如,假设您培训网络以区分猫和狗的图像。网络对培训集具有高精度,但在真实的示例中表现不佳。通过使用培训示例上的类激活映射,您发现网络基于图像中的猫和狗的预测,但是在背景上。然后,你意识到所有猫的图片都有红色背景,所有的狗图片都有绿色背景,并且它是网络在训练期间学到的背景的颜色。然后,您可以收集没有此偏置的新数据。

这个示例类激活映射显示输入图像的哪个区域对预测类贡献最大。红地区最多贡献。

加载佩带的网络和网络摄像头

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

netname =“squeezenet”;网= eval(网络);

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

Camera =网络摄像头;

提取网络的图像输入大小和输出类别。的activationLayerName辅助功能,在此示例结束时定义,返回图层的名称以从中提取激活。该层是跟随网络的最后一个卷积层的Relu层。

InputSize = Net.Layers(1).InputSize(1:2);classes = net.layers(结束).classes;LayerName = ActivationLayerName(NetName);

显示类激活地图

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

h =图('单位''标准化''位置',[0.05 0.05 0.9 0.8],“可见”'在');ishandle (h)

用网络摄像头拍张照片。调整图像的大小,使其最短边的长度(在本例中为图像高度)等于网络的图像输入大小。当你调整大小时,保持图像的宽高比。您还可以将图像调整为更大或更小的尺寸。放大图像可以提高最终类激活图的分辨率,但可能导致总体预测的准确性降低。

计算调整大小的图像在ReLU层的激活,ReLU层紧随网络的最后一个卷积层。

IM =快照(相机);IMRESIZED = IMRESIZE(IM,[INPEDSIZE(1),NAN]);ImageActivations =激活(NET,IMRESIZED,LAYRNAME);

特定类的类激活映射是遵循最终卷积层的Relu层的激活图,加权每个激活有助于该类的最终得分。那些权重等于该类的网络的最终完全连接层的权重。Screezenet没有最终完全连接的层。相反,遵循最后一个卷积层的Relu层的输出已经是类激活图。

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

分数=挤压(平均值(成膜(涂膜,[1 2]));如果netname〜=“squeezenet”fcWeights = net.Layers (end-2) .Weights;fcBias = net.Layers (end-2) .Bias;分数= fcWeights*分数+ fcBias;[~, classIds] = maxk(分数,3);weightVector = shiftdim (fcWeights (classIds (1):), 1);classActivationMap = (imageActivations。* weightVector, 3)总和;其他的[~, classIds] = maxk(分数,3);classActivationMap = imageActivations (:,:, classIds (1));结尾

计算顶级标签和最终规范化的类别分数。

成绩= exp(分数)/笔(exp(分数));maxScores =分数(classIds);标签=类(classIds);

绘制类激活映射。在第一个子图中显示原始图像。在第二个子图中,使用Camshow.帮助函数,在此示例结束时定义,以在原始图像的黑暗灰度版本的顶部显示类激活映射。使用预测的分数显示前三名预测标签。

subplot(1,2,1) imshow(im) subplot(1,2,2) CAMshow(im,classActivationMap) title(string(labels) +“,”+字符串(maxscores));drawn结尾

清除网络摄像头对象。

清除相机

例子地图

网络正确地将此图像中的对象正确标识为Loafer(一种鞋类)。右侧图像中的类激活映射显示了输入图像的每个区域对预测类的贡献浪子。红地区最多贡献。网络基于整个鞋子的分类,但最强的输入来自红色区域 - 即尖端和鞋的开口。

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

网络将咖啡杯的图像分类为扣。随着类激活图所示,网络错误分配图像,因为图像包含太多的混淆对象。网络检测并侧重于手表腕带,而不是咖啡杯。

辅助函数

CAMshow (im,凸轮)覆盖类激活映射cam在黑暗的灰度版本的图像上即时通讯。该函数将类激活映射的大小调整为大小即时通讯,将其标准化,从下面开始阈值化,并使用喷射Colormap。

函数CAMSHOW(IM,CAM)IMSIZE =尺寸(IM);CAM = IMRESIZE(CAM,IMSIZE(1:2));CAM = IrmerOzeImage(CAM);凸轮(凸轮<0.2)= 0;CMAP = JET(255)。* LINSPACE(0,1,255)';CAM = IND2RGB(UINT8(CAM * 255),CMAP)* 255;组合=双(RGB2Gray(IM))/ 2 + Cam;组合= rangerDimizImage(组合体)* 255;imshow(Uint8(组合));结尾函数n = IrmerOzeImage(i)最小= min(i(:));最大= max(i(:));n =(i-minume)/(最大最小);结尾函数layerName = activationLayerName(网络)如果netname ==.“squeezenet”layerName =“relu_conv10”eleesif.netname ==.“googlenet”layerName ='Inception_5b-output'eleesif.netname ==.“resnet18”layerName =“res5b_relu”eleesif.netname ==.“MobileNetv2”layerName =“out_relu”结尾结尾

参考

[1]周,Bolei,Aditya Khosla,Agata Lapedriza,Aude Oliva和Antonio Torralba。“学习歧视性本地化的深刻特征。”在计算机愿景和模式识别的IEEE会议的诉讼程序, 2921 - 2929页。2016.

也可以看看

||||

相关话题