此示例显示如何将图像馈送到卷积神经网络并显示网络的不同层的激活。检查激活并发现网络通过与原始图像的激活区域进行比较来学习网络。了解早期图层中的频道了解颜色和边缘等简单功能,而深层层的通道学习像眼睛这样的复杂功能。以这种方式识别功能可以帮助您了解网络已经了解的内容。
该示例需要深入学习工具箱™和图像处理工具箱™。
加载预制挤压罩网络。
net =挤压;
阅读并展示一张图片。保存其大小以备将来使用。
Im = imread(“face.jpg”);imshow(IM)
imgsize =尺寸(IM);Imgsize = Imgsize(1:2);
分析网络以查看您可以查看的一层。卷积层执行具有可学习参数的卷积。该网络学习识别有用的功能,通常每个通道具有一个功能。观察第一个卷积层有64个通道。
分析(净)
图像输入层指定输入大小。您可以在通过网络之前调整图像的大小,但网络也可以处理更大的图像。如果您提供网络较大的图像,则激活也变大。然而,由于网络在大小227-×227的图像上培训,因此没有训练以识别大于该尺寸的对象或特征。
通过观察卷积层中的哪个区域在图像上激活并与原始图像中的相应区域进行调查特征。卷积神经网络的每层包括许多2-D阵列渠道。通过网络传递图像并检查输出激活Conv1.
层。
ACT1 =激活(NET,IM,'conv1');
激活作为一个3-D数组返回,第三维对通道进行索引Conv1.
层。使用该激活来显示这些激活inmtile.
函数,将阵列重塑为4-d。输入中的第三个维度inmtile.
表示图像颜色。设置第三维度以具有大小1,因为激活没有颜色。第四维度索引通道。
sz =尺寸(ACT1);ACT1 = REHAPE(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(max(act1))));Act1chmax = Act1(::::,maxvalueIndex);Act1chmax = Mat2Gray(Act1chmax);ACT1CHMAX = IMRESIZE(ACT1CHMAX,IMGSIZE);i = imtile({Im,Act1chmax});imshow(i)
与原始图像进行比较,并注意此通道在边缘上激活。它在左/暗右边的灯光下积极地激活,并对暗左/右边缘负面。
大多数卷积神经网络学会学习在其第一个卷积层中检测颜色和边的特征。在更深的卷积层中,网络学会检测更复杂的功能。后来的图层通过组合较早的层的特征来构建它们的特征。调查Fire6-Squeeze1x1.
层与相同的方式Conv1.
层。计算,重新展示并显示网格中的激活。
ACT6 =激活(NET,IM,'Fire6-Squeeze1x1');sz =尺寸(ACT6);ACT6 = REHAPE(ACT6,[SZ(1)SZ(2)1 SZ(3)]);i = imtile(imresize(mat2gray(act6),[64 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 =激活(网络,IM,'Fire6-Relu_squeeze1x1');sz =尺寸(Act6Relu);ACT6RELU = REHAPE(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('面对眼睛关闭.jpg');imshow(Imclosed)
ACT6CLOSED =激活(网络,拟计,'Fire6-Relu_squeeze1x1');Sz =尺寸(ACT6CLOSED);ACT6CLOSED = REPAPE(ACT6缩合,[SZ(1),SZ(2),1,SZ(3)]);
在一个数字中绘制图像和激活。
ChannelsClosed = Repmat(Imresize(Mat2Gray(Act6Closer(:::,:[1444])),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在各个眼睛上激活,也可以在嘴巴周围的区域上进行某种程度。
网络从未被告知学习眼睛,但已经了解到眼睛是区分图像类别的有用功能。以前的机器学习方法通常是手动设计特色特有的问题,但这些深度卷积网络可以为自己学习有用的功能。例如,学习识别眼睛可以帮助网络区分豹子和豹纹打印地毯。