主要内容

使用深度学习可视化技术探索网络预测

这个例子展示了如何使用深度学习可视化技术来研究网络预测。

深度学习网络通常被描述为“黑盒”,因为网络做出某种决定的原因并不总是显而易见的。您可以使用可解释性技术将网络行为转换为人们可以解释的输出。这个可解释的输出可以回答关于网络预测的问题。这个例子主要关注可视化方法,这是一种可解释性技术,它使用网络正在“观察”的可视化表示来解释网络预测。

负荷预训练网络

加载一个预先训练好的图像分类网络。对于这个示例,使用GoogLeNet,这是一个预先训练好的网络,可以将图像分类为1000个对象类别,例如键盘、鼠标、铅笔和许多动物。

Net = googlenet;

找到网络的输入大小和类标签。

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

图像的分类

加载一个包含金毛猎犬图片的测试图像。

Img = imread(“sherlock.jpg”);img = imresize(img,inputSize);图imshow (img)

使用预训练的网络对图像进行分类。

[YPred,scores] = category (net,img);YPred
YPred =分类金毛猎犬

该网络正确地将图像分类为金毛猎犬。找出三个得分最高的课程。

[~,topIdx] = maxk(scores,3);topScores = scores(topIdx)';topClasses =类(topIdx);表(topClasses topScores)
ans =3×2表topClasses topScores __________________ _________金毛0.55419拉布拉多犬0.39633库瓦兹0.02544

得分前三名的都是狗的品种。该网络为与真正的金毛犬类具有相似特征的类输出更高的分数。

您可以使用可视化技术来理解为什么网络将这张图像分类为金毛猎犬。

激活可视化

理解网络行为最简单的方法之一是可视化每一层的激活。大多数卷积神经网络学会在第一个卷积层中检测颜色和边缘等特征。在更深的卷积层中,网络学会检测更复杂的特征,比如眼睛。通过网络传递图像并检查输出激活conv2-relu_3x3_reduce层。

Act =激活(净,img,“conv2-relu_3x3_reduce”);Sz =大小(行为);行为=重塑(行为,[sz(1) sz(2) 1 sz(3)]);

显示该层的前12个通道的激活。

I = imtile(mat2gray(act(:,:,:,1:12)));图imshow(我)

白色像素代表强烈的正面激活,黑色像素代表强烈的负面激活。你可以看到网络正在学习低级别的特征,比如边缘和纹理。第一个通道突出了狗的眼睛和鼻子,可能是由于它们独特的边缘和颜色。

调查更深层次。

actDeep =激活(net,img,“inception_5b-output”);sz = size(actDeep)
深圳=1×37 7 1024
actDeep =重塑(actDeep,[sz(1) sz(2) 1 sz(3)]);

这一层有1024个通道。每个通道都有一个图像。详细调查每一张图片是不切实际的。相反,您可以通过考虑激活最强的通道来深入了解网络行为。

[maxValue,maxValueIndex] = max(max(max(actDeep)));actDeepMax = actDeep(:,:,:,maxValueIndex);tiledlayout (“流”nexttile imshow(imresize(mat2gray(actDeepMax),inputSize))

最强的激活通道集中在狗的头部,这表明这一层正在挑选更复杂的特征。

为了进一步探索网络行为,您可以使用更复杂的可视化方法。

Grad-CAM

使用梯度加权类激活映射(Grad-CAM)探索网络预测。为了了解图像的哪些部分对分类最重要,Grad-CAM使用分类分数相对于网络确定的卷积特征的梯度。梯度较大的地方正是最终得分最依赖数据的地方。方法计算Grad-CAM映射gradCAM函数和预测类。

gradcamMap = gradCAM(net,img,YPred);

默认情况下,gradCAM函数从最后一个具有非单空间维度的ReLU层或最后一个收集ReLU层输出(如深度拼接或添加层)的层中提取特征映射。您可以通过指定特征层来计算网络中较早层的Grad-CAM映射。计算早期卷积层的Grad-CAM映射conv2-relu_3x3

gradcamMapShallow = gradCAM(net,img,YPred,“FeatureLayer”“conv2-relu_3x3”);

使用plotMaps金宝app本例末尾列出的支持函数,用于比较Grad-CAM地图。

图alpha = 0.5;提出=“喷气机”;plotMaps (img gradcamMap gradcamMapShallow,“深层”“浅层”、α提出)

网络最后一层的Grad-CAM地图突出显示了狗的头和耳朵,这表明耳朵和眼睛的形状对于将这只狗分类为金毛猎犬很重要。由早期图层生成的Grad-CAM地图突出了狗的边缘。这是因为网络中的早期层学习简单的特征,如颜色和边缘,而深层学习更复杂的特征,如耳朵或眼睛。

闭塞的敏感性

计算图像的遮挡灵敏度。遮挡灵敏度是一种简单的技术,用于测量网络对输入数据中小扰动的灵敏度。这种方法通过用闭塞掩模(通常是灰色方块)替换输入的小区域来干扰输入。掩码在图像上移动,测量给定类别的概率分数的变化。您可以使用此方法突出显示图像中对分类最重要的部分。你可以使用occlusionSensitivity

计算金毛犬类的遮挡敏感性图。

occlusionMap =闭塞敏感度(net,img,YPred);

若要以更高分辨率检查遮挡的结果,请使用MaskSize而且选项。一个更小的值产生更高分辨率的映射,但需要更长的时间来计算和使用更多的内存。一个更小的MaskSizeValue产生更多细节,但可能导致更嘈杂的结果。为了从遮挡灵敏度中获得最佳结果,必须仔细选择正确的值MaskSize而且选项。

闭塞mapdetail =闭塞敏感性(net,img,YPred,“步”10“MaskSize”15);

使用plotMaps函数来比较不同的遮挡灵敏度结果。

plotMaps (img occlusionMap occlusionMapDetail,...“闭塞敏感性”遮挡灵敏度\换行(高分辨率)、α提出)

分辨率较低的地图显示了与Grad-CAM相似的结果,突出显示了狗的耳朵和眼睛。高分辨率图显示耳朵对分类最重要。高分辨率的地图还表明,狗背上的皮毛有助于分类决策。

石灰

接下来,考虑局部可解释的模型未知解释(LIME)技术。LIME使用更简单、更可解释的模型(如回归树)来近似深度神经网络的分类行为。解释这个简单模型的决策可以深入了解神经网络的决策。简单模型用于确定输入数据特征的重要性,作为特征对深度神经网络重要性的代理。LIME技术使用了与遮挡灵敏度或Grad-CAM非常不同的底层机制。

使用imageLIME函数来查看深度网络分类决策中最重要的特征。计算前两个类别的LIME地图:金毛猎犬和拉布拉多猎犬。

limeMapClass1 = imageLIME(net,img,topClasses(1));limeMapClass2 = imageLIME(net,img,topClasses(2));titleClass1 =“石灰(”+ topClasses(1“)”;titleClass2 =“石灰(”+ topClasses(2“)”;plotMaps (img, limeMapClass1 limeMapClass2、titleClass1 titleClass2,α,提出)

地图显示了图像的哪些区域对分类是重要的。地图上的红色区域具有更高的重要性——缺少这些区域的图像在指定类别中得分较低。对于金毛犬类,该网络将重点放在狗的头部和耳朵上进行预测。对于拉布拉多寻回犬类,网络更关注狗的鼻子和眼睛,而不是耳朵。虽然这两张地图都突出了狗的前额,但对于网络来说,狗的耳朵和脖子表示金毛寻回犬,而狗的眼睛表示拉布拉多寻回犬。

LIME图与遮挡灵敏度和Grad-CAM图一致。比较不同可解释性技术的结果对于验证你的结论是很重要的。

梯度归因

梯度归因方法生成像素分辨率地图,显示哪些像素对网络分类决策最重要。这些方法计算类得分相对于输入像素的梯度。直观地,地图显示了哪些像素在改变时最影响类别分数。梯度归因方法生成的地图比梯度- cam或遮挡灵敏度的地图具有更高的分辨率,但往往噪音更大,因为训练有素的深度网络并不强烈依赖于特定像素的确切值。

使用gradientAttribution金宝app支持函数,在本例的末尾列出,用于计算金毛犬类的梯度属性映射。

softmaxName =“概率”;pixelMap = gradientAttribution(net,img,YPred,softmaxName,“autodiff”);

您可以通过修改ReLU层的向后传递来获得一个更清晰的梯度属性映射,这样梯度元素中小于零的元素和ReLU层的输入元素中小于零的元素都被设置为零。这种方法被称为引导反向传播。使用引导反向传播计算网络的梯度属性映射。

pixelGuidedBackpropMap = gradientAttribution(net,img,YPred,softmaxName,“guided-backprop”);

显示渐变属性映射使用自定义颜色映射255颜色的值0到白色和1为黑色。较暗的像素是对分类最重要的像素。

Alpha = 1;Cmap = [linspace(1,0,255)' linspace(1,0,255)' linspace(1,0,255)'];plotMaps (img pixelMap pixelGuidedBackpropMap,...“梯度归因”“引导反向传播”、α提出)

地图上最暗的部分是以狗为中心的部分。这张地图非常嘈杂,但它确实表明网络正在使用图像中的预期信息来执行分类。狗的像素对分类分数的影响比背景像素大得多。在引导反向传播图中,像素集中在狗的面部,特别是眼睛和鼻子。有趣的是,这种方法比低分辨率的可视化技术突出不同的区域。结果表明,在像素水平上,狗的鼻子和眼睛对于将图像分类为金毛猎犬很重要。

深梦影像

深度梦是一种特征可视化技术,它可以创建强烈激活网络层的图像。通过可视化这些图像,可以突出显示网络学习到的图像特征。这些图像对于理解和诊断网络行为是有用的。您可以通过可视化网络末端的层的特征来生成图像。与前面的方法不同,这种技术是全局的,它向您展示了网络的整体行为,而不仅仅是特定的输入图像。

要生成与给定类最相似的图像,请使用最后的全连接层loss3-classifier.为网络预测的测试图像的前三个类别生成深度梦境图像。集“详细”隐藏优化过程的详细信息。

通道= topIdx;learnableLayer =“loss3-classifier”;dreamImage = deepDreamImage(net,learnableLayer,channels,“详细”、假);

增加金字塔层的数量和每个金字塔层的迭代次数可以以额外的计算为代价生成更详细的图像。生成详细的深梦图像。

dreamImageDetailed = deepDreamImage(net,learnableLayer,channels,...“详细”假的,“NumIterations”, 100,“PyramidLevels”4);

比较前三个班级的深梦图像。

tiledlayout(2、3)i = 1:3 nexttile imshow(dreamImage(:,:,:,i));标题(string (topClasses (i)));结束i = 1:3 nexttile imshow(dreamImageDetailed(:,:,:,i));标题(string (topClasses(我))+"\newline(高分辨率)");结束

深度梦的图像显示了神经网络如何想象这三个类别中的每一个。尽管这些图像相当抽象,但您可以看到每个顶级类的关键特征。它还展示了网络如何区分黄金和拉布拉多寻回犬类。

若要探索使用应用程序交互式地应用这些方法,请参阅使用应用程序探索深层网络解释性GitHub®库。

金宝app支持功能

替换图层命令功能

replaceLayersOfType函数将指定类的所有层替换为新层的实例。新层具有与原始层相同的名称。

函数lgraph = replaceLayersOfType(lgraph,layerType,newLayer)替换layerGraph中指定类型的层% layerType带有newLayer的副本。i = 1:长度(lgraph.Layers)如果isa (lgraph.Layers(我),layerType)匹配新旧层之间的名称。layerName = lgraph.Layers(i).Name;newLayer。Name = layerName;lgraph = replaceLayer(lgraph,layerName,newLayer);结束结束结束

绘制地图

绘制两幅地图,map1而且map2,为输入图像img.使用α设置地图的透明度。指定要使用的颜色映射提出

函数plotMaps(img,map1,map2,title1,title2,alpha,cmap) figure subplot(1,3,1) imshow(img) subplot(1,3,2) imshow(img) hold显示亮度图像(map1“AlphaData”,alpha) colormap(cmap) title(title1)保持Subplot (1,3,3) imshow(img) hold住显示亮度图像(map2“AlphaData”,alpha) colormap(cmap) title(title2)保持结束

梯度归因图

计算梯度归因图。您必须指定softmax层。您可以使用引导反向传播计算基本映射,或更高分辨率的映射。

函数map = gradientAttribution(net,img,YPred,softmaxName,method) lgraph = layerGraph(net);lgraph = removeLayers(lgraph,lgraph. layers (end).Name);Dlnet = dlnetwork(lgraph);要使用自动区分,将图像转换为darray。dlImg = dlarray(single(img),“SSC”);如果方法= =“autodiff”使用dlfeval和gradientMap函数来计算导数。的gradientMap%函数将图像通过网络转发以获得类分数%,并包含对dlgradient的调用,以计算相对分数的梯度%到映像。dydI = dlfeval(@gradientMap,dlnet,dlImg,softmaxName,YPred);结束如果方法= =“guided-backprop”%使用自定义层CustomBackpropReluLayer(作为支持文件附加)金宝app%与非标准向后传递,并使用它与自动区分。customRelu = CustomBackpropReluLayer();设置每个custombackproprelullayer的BackpropMode属性为“guided-backprop”。customRelu。BackpropMode =“guided-backprop”使用支持函数repl金宝appaceLayersOfType替换网络中reluLayer的所有实例% CustomBackpropReluLayer实例。lgraphGB = replaceLayersOfType(lgraph,...“nnet.cnn.layer.ReLULayer”, customRelu);将包含CustomBackpropReluLayers的层图转换为dlnetwork。dlnetGB = dlnetwork(lgraphGB);dydI = dlfeval(@gradientMap,dlnetGB,dlImg,softmaxName,YPred);结束将每个像素沿通道维度的绝对值相加,然后重新缩放%在0到1之间。map = sum(abs(extractdata(dydI)),3);Map = rescale(Map);结束

渐变映射

计算关于一个或多个输入图像的类分数的梯度。

函数dydI = gradientMap(dlnet,dlImgs,softmaxName, classsidx) dydI = dlarray(零(大小(dlImgs)));i=1:size(dlImgs,4) i= dlImgs(:,:,:,i);分数= predict(dlnet,I,“输出”, {softmaxName});classScore = scores(classsidx);dydI(:,:,:,i) = dlgradient(classScore, i);结束结束

参考文献

[1] Zhou, Bolei, Aditya Khosla, Agata Lapedriza, Aude Oliva和Antonio Torralba。“学习用于判别定位的深度特征。”在2016年IEEE计算机视觉与模式识别会议论文集:2921-29。美国拉斯维加斯:IEEE, 2016。https://doi.org/10.1109/CVPR.2016.319。

[2] Selvaraju, Ramprasaath R., Michael Cogswell, Abhishek Das, Ramakrishna Vedantam, Devi Parikh和Dhruv Batra。“梯度- cam:基于梯度定位的深度网络视觉解释。”在2017年IEEE计算机视觉会议论文集: 618 - 626。威尼斯,意大利:IEEE, 2017。https://doi.org/10.1109/ICCV.2017.74。

Ribeiro, Marco Tulio, Sameer Singh和Carlos Guestrin。“‘我为什么要相信你?《解释任何分类器的预测》在第22届ACM SIGKDD知识发现和数据挖掘国际会议论文集(2016): 1135 - 1144。纽约,纽约州:计算机协会,2016。https://doi.org/10.1145/2939672.2939778。

Simonyan, Karen, Andrea Vedaldi和Andrew Zisserman。深度卷积网络:可视化图像分类模型和显著性图预印本,提交于2014年4月19日。https://arxiv.org/abs/1312.6034。

[5] TensorFlow。“用TensorFlow做深度梦”https://github.com/tensorflow/docs/blob/master/site/en/tutorials/generative/deepdream.ipynb。

另请参阅

||||(统计和机器学习工具箱)

相关的话题