主要内容

使用遮挡理解网络预测

这个例子展示了如何使用遮挡敏感性映射来理解为什么深度神经网络会做出分类决策。遮挡灵敏度是一种简单的技术,用于理解图像的哪些部分对深度网络的分类最重要。您可以使用数据的小扰动来测量网络对数据不同区域遮挡的敏感性。使用遮挡灵敏度来获得对网络用于进行特定分类的图像特征的高级理解,并深入了解网络可能对图像错误分类的原因。

“深度学习工具箱”提供occlusionSensitivity函数用于计算接受图像输入的深度神经网络的遮挡灵敏度映射。的occlusionSensitivity函数通过用闭塞掩模(通常是灰色方块)替换输入的小区域来扰动输入。掩码在图像上移动,给定类的概率分数的变化是作为掩码位置的函数来测量的。您可以使用这种方法来突出显示图像的哪些部分对分类最重要:当图像的这一部分被遮挡时,预测类别的概率分数将急剧下降。

加载预训练的网络和图像

加载预先训练好的网络GoogLeNet,用于图像分类。

Net = googlenet;

提取图像的输入大小和网络的输出类别。

inputSize = net.Layers(1).InputSize(1:2);classes = net.Layers(end).Classes;

加载图像。这是一只名叫莱卡的狗。将图像大小调整为网络输入大小。

imglaikgrass = imread(“laika_grass.jpg”);imglaikgrass = imresize(imglaikgrass,inputSize);

对图像进行分类,并在图像标题中显示分类得分最高的三个类别。

[YPred,scores] = category (net, imglaikgrass);[~,topIdx] = maxk(scores, 3);topScores =分数(topIdx);topClasses =类(topIdx);imshow(imglaikgrass) titleString = compose(“% s (% .2f)”、topClasses topScores);标题(sprintf(加入(titleString,”;“)));

莱卡是贵宾犬和可卡犬的杂交品种。这个品种在GoogLeNet中不是一个类,所以网络对图像进行分类有一些困难。这个网络对它的预测——被预测的类别——不是很有信心迷你贵宾犬得分只有23%。得分第二高的类别也是贵宾犬的一种,这是一个合理的分类。该网络还将一个中等概率分配给西藏梗类。我们可以使用遮挡来了解图像的哪些部分导致网络建议这三个类别。

识别网络用于分类的图像区域

您可以使用遮挡来找出图像的哪些部分对分类是重要的。首先,看看预测的类迷你贵宾犬.图像的哪些部分表明这个类?使用遮挡灵敏度函数来映射部分图像被遮挡时分类分数的变化。

map = occlusionSensitivity(net, imglaikgrass,YPred);

显示莱卡的图像与遮挡灵敏度地图叠加。

imshow (imgLaikaGrass“InitialMagnification”150)持有显示亮度图像(地图,“AlphaData”, 0.5) colormap飞机colorbar标题(sprintf (遮挡敏感度(%s)...YPred))

遮挡图显示了图像的哪些部分对图像的分数有积极的贡献迷你贵宾犬类,以及哪些部分具有负贡献。地图上的红色区域有较高的价值,是证据迷你贵宾犬班级——当红色区域被遮挡时,得分为迷你贵宾犬会下降。在这张图片中,莱卡的头、背和耳朵提供了最有力的证据迷你贵宾犬类。

地图中值较低的蓝色区域是图像中导致得分增加的部分迷你贵宾犬当堵塞。通常,这些区域是另一类的证据,并可能使网络混淆。在这种情况下,莱卡的嘴和腿对整体得分有负贡献迷你贵宾犬

遮挡图强烈聚焦在图像中的狗身上,这表明GoogLeNet正在对图像中的正确对象进行分类。如果您的网络没有产生您期望的结果,闭塞图可以帮助您了解原因。例如,如果网络强烈关注图像的其他部分,这表明网络学习了错误的特征。

使用梯度类激活映射(Grad-CAM)技术也可以得到类似的结果。Grad-CAM使用分类分数相对于网络中最后一个卷积层的梯度,以了解图像的哪些部分对分类最重要。有关示例,请参见Grad-CAM揭示深度学习决策背后的原因

遮挡灵敏度和Grad-CAM通常返回质量相似的结果,尽管它们以不同的方式工作。通常情况下,您可以更快地计算Grad-CAM映射,而不需要调整任何参数。然而,Grad-CAM地图通常具有比遮挡地图更低的空间分辨率,并且可能会遗漏细节。Grad-CAM的底层分辨率是最后一个卷积特征图的空间分辨率;在GoogleNet的例子中,这是7 * 7像素。要从遮挡灵敏度获得最佳结果,必须为MaskSize而且选项。这种调优提供了在不同长度尺度上检查输入特征的更大灵活性。

比较不同类别的证据

您可以使用遮挡来比较图像的哪些部分被网络识别为不同类别的证据。这在网络对分类没有信心并对几个类别给出类似分数的情况下很有用。

为前三个类分别计算一个遮挡映射。若要以更高分辨率检查遮挡的结果,请使用MaskSize而且选项。一个更小的导致更高分辨率的映射,但需要更长的计算时间和使用更多的内存。一个更小的MaskSize说明了更小的细节,但可能导致更嘈杂的结果。

topClasses =类(topIdx);topClassesMap = occlusionSensitivity(net, imglaikgrass, topClasses,...“步”10...“MaskSize”15);

把排名前三的课程的成绩画出来。

i=1:length(topIdx) figure imshow(imglaikgrass);持有显示亮度图像(topClassesMap(:,:我),“AlphaData”, 0.5);colormap飞机;classLabel = string(类(topIdx(i)));标题(sprintf (“% s”classLabel));结束

对于不同品种的狗来说,图像的不同部分对分类分数的影响是非常不同的。狗的背部有很强的影响力,有利于迷你贵宾犬而且玩具贵宾犬类,而口耳贡献西藏梗类。

调查错误分类问题

如果你的网络总是对某些类型的输入数据进行错误分类,你可以使用遮挡灵敏度来确定输入数据的特定特征是否会使网络混淆。从莱卡坐在草地上的遮挡图中,你可以预期,莱卡的图像更专注于她的面部,很可能被错误地归类为西藏梗.您可以使用Laika的另一个图像来验证这种情况。

imgLaikaSit = imresize(imread(“laika_sitting.jpg”), inputSize);[YPred,scores] = category (net,imgLaikaSit);[score,idx] = max(scores);YPred,分数
YPred =分类西藏梗
分数=0.5668

计算新图像的遮挡图。

map = occlusionSensitivity(net,imgLaikaSit,YPred);imshow (imgLaikaSit);持有;显示亮度图像(地图,“AlphaData”, 0.5);colormap飞机;标题(sprintf (“% s (% .2f)”...字符串(类(idx)),得分));

同样,该网络强烈地将狗的鼻子和嘴与西藏梗类。这突出了网络的一种可能的故障模式,因为它表明莱卡的面部图像将始终被错误地归类为西藏梗

你可以利用从occlusionSensitivity函数,以确保网络关注输入数据的正确特征。本例中出现分类问题的原因是GoogleNet的可用类不包括Laika这样的杂交狗。遮挡图说明了为什么网络被莱卡的这些图像所迷惑。重要的是要确保您使用的网络适合手头的任务。

在这个例子中,网络错误地将图像中对象的不同部分识别为不同的类。这个问题的一个解决方案是用更多的标记数据重新训练网络,这些数据涵盖了错误分类类别的更广泛的观察结果。例如,这里的网络可以使用从不同角度拍摄的莱卡的大量图像来重新训练,这样它就可以学会将莱卡的背部和正面与正确的类别联系起来。

参考文献

[1] Zeiler M.D, Fergus R.(2014)可视化和理解卷积网络。见:Fleet D., Pajdla T., Schiele B., Tuytelaars T.(编)计算机视觉- ECCV 2014。2014年大会。计算机科学课堂讲稿,卷8689。施普林格,可汗

另请参阅

|

相关的话题