主要内容

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

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

该示例需要深度学习工具箱™和图像处理工具箱™。

加载预训练的网络和数据

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

网= squeezenet;

阅读并显示图像。保存其尺寸以供将来使用。

我= imread ('face.jpg');imshow (im)

imgSize =大小(im);imgSize = imgSize (1:2);

查看网络体系结构

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

analyzeNetwork(净)

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

显示第一卷积层的激活

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

act1 =激活(网,即时通讯,“conv1”);

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

深圳=大小(act1);[sz(1) sz(2) 1 sz(3)]);

现在您可以显示激活。每个激活可以接受任何值,所以使用规范化输出mat2gray.所有激活都按比例缩放,使最小激活值为0,最大激活值为1。在一个8 × 8的网格上显示64个图像,每个图像对应层中的每个通道。

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

研究特定通道的激活

激活网格中的每个图块都是频道的输出conv1层。白色像素代表强烈的正激活,黑色像素代表强烈的负激活。一个通道大部分是灰色的,在输入图像上没有强烈的激活。通道激活时像素的位置对应于原始图像中的相同位置。在通道的某个位置的白色像素表示该通道在该位置被强烈激活。

调整通道22激活的大小,以具有与原始图像相同的大小,并显示激活。

act1ch22 = 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 =激活(网,即时通讯,“fire6-squeeze1x1”);深圳=大小(act6);Act6 =重塑(Act6,[sz(1) sz(2) 1 sz(3)]);I = imtile(imresize(mat2gray(act6),[64 64]),“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 =激活(网,即时通讯,“fire6-relu_squeeze1x1”);深圳=大小(act6relu);Act6relu =重塑(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)

imClosed act6Closed =激活(净,“fire6-relu_squeeze1x1”);深圳=大小(act6Closed);act6Closed =重塑(act6Closed,深圳(1),深圳(2),1,深圳(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(猫(4 im channelsOpen * 255、imClosed channelsClosed * 255));imshow (I)标题(“输入图像,14频道,47频道”);

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

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

另请参阅

||

相关话题