主要内容

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

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

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

负载Pretrained网络

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

网= googlenet;

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

inputSize = net.Layers (1) .InputSize (1:2);类= net.Layers . class(结束);

图像的分类

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

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

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

[YPred,分数]=(净,img)进行分类;YPred
YPred =分类金毛猎犬

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

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

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

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

激活可视化

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

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

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

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

白色像素代表强烈的正激活,黑色像素代表强烈的负激活。可以看到,网络正在学习底层特征,如边缘和纹理。第一个频道突出了狗的眼睛和鼻子,可能是因为它们独特的边缘和颜色。

调查更深的层次。

img actDeep =激活(净,“inception_5b-output”);深圳=大小(actDeep)
深圳=1×31024 7
actDeep =重塑(actDeep,[sz(1) sz(2) 1 sz(3)]);

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

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

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

要进一步研究网络行为,可以使用更复杂的可视化方法。

Grad-CAM

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

gradcamMap = gradCAM(网,img, YPred);

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

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

使用plotMaps金宝app支持函数,列在本示例的末尾,用于比较grado - cam映射。

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

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

闭塞的敏感性

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

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

occlusionMap = occlusionSensitivity(网,img, YPred);

为了用更高的分辨率检查遮挡的结果,使用MaskSize选项。一个更小的值会产生更高分辨率的地图,但需要更长的计算时间,并使用更多内存。一个更小的MaskSize价值产生更多细节,但可能导致更混乱的结果。为了得到最好的结果从闭塞敏感性,你必须仔细地选择正确的值MaskSize选项。

YPred occlusionMapDetail = occlusionSensitivity(净,img,“步”10“MaskSize”15);

使用plotMaps功能来比较不同咬合敏感性的结果。

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

低分辨率的地图显示了与grado - cam相似的结果,突出显示了狗的耳朵和眼睛。高分辨率图表明,耳朵在分类中是最重要的。更高分辨率的地图也表明,狗背上的皮毛对分类决策有贡献。

石灰

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

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

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

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

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

梯度归因

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

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

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

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

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

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

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

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

深梦形象

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

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

渠道= topIdx;learnableLayer =“loss3-classifier”;dreamImage = deepDreamImage(净、learnableLayer频道,“详细”、假);

增加金字塔层的数量和每个金字塔层的迭代可以产生更详细的图像,但需要额外的计算。生成详细的深层梦境图像。

dreamImageDetailed = deepDreamImage(净、learnableLayer频道,...“详细”假的,“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(我))+“\换行(高分辨率)”);结束

深层梦境图像显示了网络如何想象这三个类中的每一个。尽管这些图像非常抽象,但您可以看到每个顶级类的关键特性。它还展示了网络是如何区分金毛和拉布拉多猎犬的。

金宝app支持功能

替代层功能

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

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

绘制地图

情节两个地图,map1map2,用于输入图像img.使用α设置地图的透明度。使用时指定要使用的颜色映射提出

函数图subplot(1,3,1) imshow(img) subplot(1,3,2) imshow(img) hold显示亮度图像(map1“AlphaData”,alpha) colormap(cmap) title(title1) hold次要情节(1、3、3)imshow (img)显示亮度图像(map2“AlphaData”,alpha) colormap(cmap) title(title2) hold结束

梯度归因地图

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

函数map = gradientAttribution(net,img,YPred,softmaxName,method) lgraph = layerGraph(net);lgraph = removeLayers (lgraph lgraph.Layers(结束). name);dlnet = dlnetwork (lgraph);%若要使用自动分色,请将图像转换为点阵。dlImg = dlarray(单(img),“SSC”);如果方法= =“autodiff”%使用dlfeval和gradientMap函数计算导数。的gradientMap函数将图像通过网络向前传递以获得类的分数%,并包含对dlgradient的调用,以评估分数的梯度%到映像。dydI = dlfeval (@gradientMap dlnet、dlImg softmaxName, YPred);结束如果方法= =“guided-backprop”%使用自定义层CustomBackpropReluLayer(作为支持文件附加)金宝app%,并与自动区分一起使用。customRelu = CustomBackpropReluLayer ();%设置每个CustomBackpropReluLayer的BackpropMode属性为"guided-backprop"。customRelu。BackpropMode =“guided-backprop”%使用支持函数rep金宝applaceLayersofType替换网络中所有的reluLayer实例% CustomBackpropReluLayer的实例。lgraphGB = replaceLayersOfType (lgraph,...“nnet.cnn.layer.ReLULayer”, customRelu);%将包含CustomBackpropReluLayers的层图转换为dlnetwork。dlnetGB = dlnetwork (lgraphGB);dydI = dlfeval (@gradientMap dlnetGB、dlImg softmaxName, YPred);结束%对通道维上每个像素的绝对值求和,然后重新缩放%在0和1之间。地图=总和(abs (extractdata (dydI)), 3);地图=重新调节(地图);结束

渐变映射

计算一个类得分相对于一个或多个输入图像的梯度。

函数dlImgs = drlarray (0 (size(dlImgs))));i=1:size(dlImgs,4) i= dlImgs(:,:,:,i);成绩=预测(dlnet,我,“输出”, {softmaxName});classScore =分数(classIdx);dydI(::,:,我)= dlgradient (classScore,我);结束结束

参考文献

[1] Zhou, Bolei, Aditya Khosla, Agata Lapedriza, Aude Oliva, Antonio Torralba。“学习深度特征用于鉴别定位”。在计算机视觉与模式识别。美国,拉斯维加斯: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。

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

[4] 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。

另请参阅

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

相关的话题