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

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

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

加载预先训练好的网络和数据

加载预训练SqueezeNet网络。

网= squeezenet;

阅读和显示一个图像。保存其大小以备将来使用。

IM = imread(“face.jpg”);imshow (im)

imgSize =尺寸(IM);imgSize = imgSize(1:2);

查看网络架构

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

analyzeNetwork(净)

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

第一卷积层的显示的激活

通过观察这在卷积区域层激活的图像上,并与在原始图像中的对应区域比较,调查功能。卷积神经网络的每一层由许多被称为2-d阵列渠道。将映像通过网络传递,并检查输出激活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幅图像,每个通道在层中一个。

I = imtile(mat2gray(ACT1),'GridSize'[8 8]);imshow(I)

研究特定通道的激活

控件中通道的输出CONV1层。白色像素代表了较强的正激活和黑色像素表现出较强的负激活。即大多灰色甲信道不输入图像上为强激活。在一个信道的激活的像素的位置对应于原始图像中的同一位置。在一个信道的一些位置处的白色像素表示该信道是在该位置处强烈激活。

调整在信道22中的激活为具有大小为原始图像相同,并显示激活。

act1ch22 = ACT1(:,:,:,22);act1ch22 = mat2gray(act1ch22);act1ch22 = imresize(act1ch22,imgSize);I = imtile({IM,act1ch22});imshow(I)

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

找到最强的激活通道

您也可以尝试通过编程方式调查与大型激活渠道寻找有趣的频道。查找使用最大激活通道马克斯功能,调整大小和显示激活。

[包括maxValue,maxValueIndex] = MAX(最大(MAX(ACT1)));act1chMax = ACT1(:,:,:,maxValueIndex);act1chMax = mat2gray(act1chMax);act1chMax = imresize(act1chMax,imgSize);I = imtile({IM,act1chMax});imshow(I)

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

调查更深的层次

大多数卷积神经网络学会在第一卷积层中检测诸如颜色和边缘等特征。在更深的卷积层中,网络学会了检测更复杂的特征。后来的层通过结合早期层的特征来建立它们的特征。调查FIRE6-squeeze1x1层中的相同的方式CONV1层。计算,重塑,并显示在网格中激活。

act6 =激活(网,即时通讯,'FIRE6-squeeze1x1');深圳=大小(act6);[sz(1) sz(2) 1 sz(3)]);I = imtile(imresize(mat2gray(act6),[64 64]),'GridSize'8 [6]);imshow(I)

有太多的图片需要详细研究,所以集中在一些更有趣的图片上。显示最强的激活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(I)

许多频道包含有光亮和黑暗的激活区域。这些都是积极和消极的激活,分别。然而,只有正被激活因为整流线性单元(RELU)的使用下面的FIRE6-squeeze1x1层。调查只有正激活,重新分析,以可视化的的激活FIRE6-relu_squeeze1x1层。

act6relu =激活(净,即时通讯,“fire6-relu_squeeze1x1”);SZ =尺寸(act6relu);act6relu =重塑(act6relu,[SZ(1)SZ(2)1 SZ(3)]);I = imtile(imresize(mat2gray(act6relu(:,:,:,[14 47])),imgSize));imshow(I)

相对于激活的FIRE6-squeeze1x1层,激活的FIRE6-relu_squeeze1x1清晰地定位图像中具有明显面部特征的区域。

测试通道是否识别眼睛

检查14、47频道是否有FIRE6-relu_squeeze1x1层激活眼睛。用一只闭着的眼睛输入一个新图像到网络上,并将结果激活与原图像激活进行比较。

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

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

act6Closed =激活(净,imClosed,“fire6-relu_squeeze1x1”);深圳=大小(act6Closed);act6Closed =重塑(act6Closed,深圳(1),深圳(2),1,深圳(3)));

绘制的图像,并激活一个人物。

channelsClosed = 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激活个人的眼睛,并在一定程度上也嘴周围的区域。

网络从来没有被告知要了解眼里,却了解到,眼睛是一个非常有用的功能图像的类之间进行区分。以前的机器学习方法经常是人工设计的功能特定的问题,但这些深卷积网络可以学到有用的功能本身。例如,学习识别眼睛可以帮助豹和豹纹地毯之间的网络区别。

也可以看看

||

相关的话题