主要内容

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

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

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

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

加载一个预先训练的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);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 = remodeling (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号通道在单个眼睛上都被激活了,在某种程度上也激活了嘴周围的区域。

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

另请参阅

||

相关的话题

Baidu
map