主要内容

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

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

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

加载预训练的网络和数据

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

网= squeezenet;

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

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

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

查看网络体系结构

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

analyzeNetwork(净)

Image Input层指定输入大小。您可以在将图像传递给网络之前调整其大小,但是网络也可以处理更大的图像。如果你给网络提供更大的图像,激活也会变大。然而,由于该网络训练的是227 * 227大小的图像,它没有训练来识别比这个尺寸更大的物体或特征。

显示第一个卷积层的激活

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

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

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

深圳=大小(act1);Act1 =重塑(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(act6relu(:,:,:,[14 47])),imgSize));imshow(我)

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

测试通道是否可以识别眼睛

检查通道14和47fire6-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在眼睛上的激活,在某种程度上也在嘴的周围区域被激活。

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

另请参阅

||

相关的话题