深度学习

理解和使用深度学习网络

深度学习可视化:CAM可视化

我希望你们现在已经听说了MATLAB有很好的可视化,这在深度学习中可以帮助发现神经网络内部发生了什么。
上一篇文章,我们讨论了通过神经网络学习的特征的可视化。今天,我想写另一个可视化,你可以在MATLAB中做深度学习,你不会找到通过阅读文档*。

凸轮可视化

这有助于回答这个问题:“我的网络是如何决定一张图片属于哪一类的?”使用类激活映射(CAM),您可以发现图像的哪个区域对网络预测的影响最大。我惊讶于这段代码是如此容易理解:只需要几行代码就可以深入了解网络。最终结果会像这样: 这可以显示图像的哪些区域反映了网络的预测。
为了让它更有趣,让我们用网络摄像头来“直播”。当然,你总是可以将图像输入到这些线条中,而不是通过网络摄像头。
首先,读入预先训练好的网络进行图像分类。SqueezeNet, GoogLeNet, ResNet-18都是不错的选择,因为它们速度相对较快。
网络=“squeezenet”;网= eval(网络);
然后我们打开网络摄像头。
凸轮=摄像头;预览(cam);

这是我运行的这个例子。

*要清楚的是,这些都是有文档记录的功能——我们不是要脱离网格!
获取输入大小、类名和我们想从中提取激活的层名。我们想要ReLU层跟随最后一个卷积层。 我考虑添加一个辅助函数来获取图层名称,但它将花费你2秒从表中获取名称:
网络名称 活化层的名字
googlenet “inception_5b-output”
squeezenet “relu_conv10”
resnet18 “res5b”
现在让我们在一个图像上运行这个。
我= imread(“peppers.png”);imResized = imresize (im, [inputSize(1),南]);imageActivations =激活(网,imResized, layerName);
特定职业的职业激活图是ReLU层的激活图,根据每个激活对职业最终得分的贡献进行加权。
权重来自该类网络的最终完全连接层。SqueezeNet没有最终的完全连接层,所以ReLU层的输出已经是类激活映射了。
scores = squeeze(mean(imageactivities,[1 2]));[~, classIds] = maxk(分数,3);classActivationMap = imageActivations (:,:, classIds (1));
如果你正在使用另一个网络(不是squeezenet),它看起来是这样的:
scores = squeeze(mean(imageactivities,[1 2]));[~, classIds] = maxk(分数,3);if netName ~= 'squeezenet' fcWeights = net.Layers(end-2)。权重;fcBias = net.Layers (end-2) .Bias;分数= fcWeights*分数+ fcBias;weightVector = shiftdim (fcWeights (classIds (1):), 1);classActivationMap = (imageActivations。* weightVector, 3)总和;结束
计算顶级类标签和最终标准化类得分。
成绩= exp(分数)/笔(exp(分数));maxScores =分数(classIds);标签=类(classIds);
并将结果形象化。
次要情节(1、2、1);imshow (im);次要情节(1、2、2);CAMshow (im, classActivationMap);title(string(labels) + ", " + string(maxScores));drawnow;
顶部预测的激活是可视化的。前三名的预测和信心都显示在故事的标题中。
现在你可以从静态图像切换到网络摄像头,只需要以下几行代码:
h =图(“单位”、“规范化”,“位置”,(。05 .05 .9 .8]);While句柄(h) % im = imread('pepper .png');<——remove这一行im = snapshot(cam);
在drawnow之后给循环加上“end”;你现在可以循环运行了。如果我失去了这些步骤中的任何一个,一个完整的文件的链接在这个页面的底部。
有趣的是,您可以对网络的任何类进行此操作。看看下面这张图片。我有一个被准确预测为咖啡杯的咖啡杯。你可以看到那些类的激活。但为什么它也被列为高度机密的iPod呢?
您可以切换类激活以可视化第二个最可能的类型,并可视化哪些特性触发了预测。
最后,你需要两个辅助函数来运行这个例子:
函数CAMshow(im,CAM) imSize = size(im);(凸轮凸轮= imresize imSize (1:2));凸轮= normalizeImage (CAM);凸轮(Cam < .2) = 0;提出=喷气(255)。* linspace (1255 0) ';%' CAM = ind2rgb(uint8(CAM*255),cmap)*255;combinedImage = double(rgb2gray(im))/2 + CAM;combinedImage = normalizeImage (combinedImage) * 255;imshow (uint8 (combinedImage));end函数N= normalizeImage(I)最小= min(I(:)); maximum = max(I(:)); N = (I-minimum)/(maximum-minimum); end
用右边蓝色的“获取MATLAB代码”链接获取整个代码。可视化快乐! 请在下方留言,或者在Twitter上关注我!

The MathWorks, Inc.版权所有
获取MATLAB代码


|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。