主要内容

卷积神经网络的可视化激活

这个例子展示了如何将图像输入卷积神经网络,并显示网络不同层的激活情况。检查激活,并通过将激活区域与原始图像进行比较,发现网络学习了哪些特征。发现较早的层中的通道学习简单的特征,如颜色和边缘,而较深的层中的通道学习复杂的特征,如眼睛。以这种方式识别特征可以帮助您了解网络学习了什么。

这个例子需要深度学习工具箱™和图像处理工具箱™。

加载预训练网络和数据

加载一个预训练的SqueezeNet网络。

网=挤压网;

读并展示一张图片。保存其大小以备将来使用。

我=我“face.jpg”);imshow (im)

imgSize = size(im);imgSize = imgSize(1:2);

查看网络架构

分析网络,看看可以查看哪些层。卷积层使用可学习的参数进行卷积。网络学习识别有用的特征,通常每个通道有一个特征。观察到第一个卷积层有64个通道。

analyzeNetwork(净)

图像输入层指定输入大小。您可以在通过网络之前调整图像的大小,但是网络也可以处理更大的图像。如果给网络提供更大的图像,激活也会变得更大。然而,由于网络是在尺寸为227 * 227的图像上训练的,因此不能训练它识别大于该尺寸的物体或特征。

显示第一卷积层的激活

通过观察卷积层中哪些区域在图像上激活并与原始图像中的相应区域进行比较来研究特征。卷积神经网络的每一层由许多二维数组组成渠道。将图像通过网络传递,并检查的输出激活conv1层。

Act1 =活化度(net,im,“conv1”);

活动作为一个3-D数组返回,其中第三个维度索引的是通道conv1层。来显示这些激活imtile函数,将数组重塑为4-D。第三个维度的输入imtile表示图像颜色。将第三维度设置为大小为1,因为激活没有颜色。第四个维度对通道进行索引。

Sz = size(act1);Act1 =重塑(Act1,[sz(1) sz(2) 1 sz(3)]);

现在可以显示激活。每个激活可以取任意值,因此使用mat2gray。所有激活都被缩放,以便最小激活为0,最大值为1。在一个8 × 8的网格上显示64张图像,每个通道对应一个图层。

I = imtile(mat2gray(act1)),“GridSize”[8]);imshow(我)

研究特定通道的激活

激活网格中的每个图层都是通道的输出conv1层。白色像素表示强烈的正激活,黑色像素表示强烈的负激活。一个主要是灰色的通道在输入图像上不那么强烈地激活。激活通道中像素的位置对应于原始图像中的相同位置。通道中某一位置的白色像素表示该通道在该位置被强烈激活。

调整通道22中的激活大小,使其与原始图像大小相同,并显示激活。

act1 = act1(:,:,:,22);Act1ch22 = mat2gray(Act1ch22);act1ch22 = imresize(act1ch22,imgSize);I = imtile({im,act1ch22});imshow(我)

您可以看到该通道在红色像素上激活,因为通道中较白的像素对应于原始图像中的红色区域。

找到最强的激活通道

您还可以尝试通过编程方式调查具有大量激活的通道来查找有趣的通道。查找具有最大激活的频道马克斯函数,调整大小,并显示激活。

[maxValue,maxValueIndex] = max(max(max(act1));act1chMax = act1(:,:,:,maxValueIndex);act1chMax = mat2gray(act1chMax);act1chMax = imresize(act1chMax,imgSize);I = imtile({im,act1chMax});imshow(我)

与原始图像比较,注意到这个通道在边缘上激活。它在亮左/暗右边缘激活为正,在暗左/亮右边缘激活为负。

调查更深层次

大多数卷积神经网络在其第一个卷积层中学习检测颜色和边缘等特征。在更深的卷积层中,网络学习检测更复杂的特征。后一层通过结合前一层的特征来构建它们的特征。调查fire6-squeeze1x1图层的方法与conv1层。计算、重塑并在网格中显示激活。

Act6 =活化度(net,im,“fire6-squeeze1x1”);Sz = size(act6);Act6 =重塑(Act6,[sz(1) sz(2) 1 sz(3)]);I = imtile(imresize(mat2gray(act6),[6464]),“GridSize”8 [6]);imshow(我)

有太多的图像来研究细节,所以专注于一些更有趣的。显示最强的激活fire6-squeeze1x1层。

[maxValue6,maxValueIndex6] = max(max(max(act6));act6chMax = act6(:,:,:,maxValueIndex6);imshow (imresize (mat2gray (act6chMax) imgSize))

在这种情况下,最大激活通道对细节特征不像其他通道那样有趣,并且显示出强烈的负(暗)和正(光)激活。这个频道可能关注的是人脸。

在所有通道的网格中,有可能在眼睛上激活的通道。进一步调查14和47频道。

I = imtile (imresize (mat2gray (act6 (:,:,:, 47 [14])), imgSize));imshow(我)

许多通道都包含光明和黑暗的激活区域。它们分别是正激活和负激活。然而,只有正激活被使用,因为整流线性单元(ReLU)跟随fire6-squeeze1x1层。为了只研究正激活,重复分析以可视化的激活fire6-relu_squeeze1x1层。

Act6relu =激活(net,im,“fire6-relu_squeeze1x1”);Sz = size(act6relu);Act6relu = transform (Act6relu,[sz(1) sz(2) 1 sz(3)]);I = imtile(imresize(mat2gray(act6relu(:,:,:,[14 47])),imgSize));imshow(我)

与激活的fire6-squeeze1x1层,激活fire6-relu_squeeze1x1清晰地定位图像中具有强烈面部特征的区域。

测试通道是否识别眼睛

检查14和47通道的fire6-relu_squeeze1x1层激活眼睛。将一只闭着眼睛的新图像输入到网络中,并将结果激活与原始图像的激活进行比较。

闭上一只眼睛阅读并显示图像,计算眼睛的激活fire6-relu_squeeze1x1层。

imClosed = imread(“face-eye-closed.jpg”);imshow (imClosed)

act6Closed =激活(net,imClosed,“fire6-relu_squeeze1x1”);sz = size(act6Closed);act6close = transform (act6close,[sz(1),sz(2),1,sz(3)]);

在一个图中绘制图像和激活。

channelclosed = repmat(imresize(mat2gray(act6Closed(:,:,:,[14 47])),imgSize),[1 1 3]);channelsOpen = repmat(imresize(mat2gray(act6relu(:,:,:,[14 47])),imgSize),[1 1 3]);I = imtile(cat(4,im, imClosed, channelclosed *255));imshow (I)标题(“输入图像,通道14,通道47”);

你可以从激活中看到14号和47号通道在单个眼睛上都被激活,在某种程度上也在嘴周围被激活。

神经网络从未被告知要学习眼睛,但它已经了解到眼睛是区分图像类别的有用特征。以前的机器学习方法通常是针对特定问题手动设计特征,但这些深度卷积网络可以自己学习有用的特征。例如,学习识别眼睛可以帮助网络区分豹子和豹纹地毯。

另请参阅

||

相关的话题