主要内容

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

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

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

加载预训练网络和数据

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

净=挤压净;

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

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

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

查看网络体系结构

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

分析网络(net)

图像输入层指定输入大小。您可以在通过网络之前调整图像大小,但网络也可以处理较大的图像。如果向网络提供较大的图像,激活也会变大。但是,由于网络是在大小为227×227的图像上训练的,因此没有训练它识别对象或专长比那个尺寸大。

显示第一卷积层的激活

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

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

激活以三维数组的形式返回,第三维索引在conv1层。使用imtile函数,将数组重塑为4-D。输入的第三个维度imtile表示图像颜色。将第三个维度的大小设置为1,因为激活没有颜色。第四个维度索引通道。

sz=尺寸(act1);act1=重塑(act1,[sz(1)sz(2)1sz(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”); sz=尺寸(act6);act6=重塑(act6,[sz(1)sz(2)1sz(3)];I=imtile(imresize(mat2gray(act6),[64]),“GridSize”,[6 8]); 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(:,:,:,,,[14 47])),imgSize);imshow(I)

许多通道包含有激活区域,有光明的,也有黑暗的。这些分别是积极和消极的激活。然而,由于跟随的整流线性单元(ReLU),只能使用正激活fire6-squeeze1x1层。为了只调查积极的激活,重复分析以形象化的激活fire6-relu_squeeze1x1层。

act6relu =激活(网,即时通讯,“fire6-relu_挤压1x1”);深圳=大小(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(“面部闭上眼睛。jpg”);imshow (imClosed)

imClosed act6Closed =激活(净,“fire6-relu_挤压1x1”); sz=尺寸(ACT6闭合);act6Closed=重塑(act6Closed[sz(1),sz(2),1,sz(3)]);

在一个图形中绘制图像和激活。

channelsClosed=repmat(imresize(mat2gray)(act6Closed(:,:,:,:,[14 47]),imgSize,[1 1 3]);channelsOpen=repmat(imresize(mat2gray(act6relu(:,:,:,:,,,[14 47]),imgSize,[1 13]);I=imtile(cat(4,im channelsOpen*255,imClosed,channelsClosed*255));imshow(I)标题('输入图像,通道14,通道47');

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

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

另请参阅

||

相关话题