主要内容

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

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

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

加载预训练的网络和数据

加载预训练的SqueezeNet网络。

网=挤压网;

阅读并显示图像。保存大小以备将来使用。

Im = imread(“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 =大小(act1);Act1 =重塑(Act1,[sz(1) sz(2) 1 sz(3)]);

现在可以展示激活过程了。每个激活可以取任何值,因此使用mat2gray.所有激活都按比例缩放,使最小激活为0,最大激活为1。在8x8的网格上显示64张图像,每个通道对应一个图层。

I = 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 =激活(net,im,“fire6-squeeze1x1”);Sz = size(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 =激活(net,im,“fire6-relu_squeeze1x1”);Sz = size(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)

act6Closed =激活(net,imClosed,“fire6-relu_squeeze1x1”);sz = size(act6Closed);act6Closed =重塑(act6Closed,[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,channelsOpen*255,imClosed, channelsOpen*255));imshow (I)标题(输入图像,14号通道,47号通道);

你可以从14和47通道的激活中看到,每个人的眼睛都被激活了,在某种程度上,嘴巴周围的区域也被激活了。

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

另请参阅

||

相关的话题