1.33、激活可视化卷积神经网络(matalb)
1、激活可视化卷积神经网络原理及流程
激活可视化(Activation Visualization)指的是通过可视化神经网络中激活函数的输出,来理解神经网络是如何学习并提取特征的过程。在卷积神经网络(CNN)中,我们可以通过可视化激活来观察每个卷积层的特征图,从而更好地理解网络学到的特征。
以下是在MATLAB中激活可视化卷积神经网络的基本原理及流程:
-
加载预训练的CNN模型:首先,需要加载预训练好的CNN模型,比如VGG、ResNet等。MATLAB提供了工具箱(如Deep Learning Toolbox)来支持加载和使用这些预训练模型。
-
选择要可视化的卷积层:在加载模型后,选择要可视化的具体卷积层。一般来说,选择靠近输出层的卷积层效果比较好,因为这些层更抽象地表示了输入图像的特征。
-
提取特征图:通过将输入图像传递给加载的CNN模型,并获取所选卷积层的输出特征图。在MATLAB中可以使用提供的函数来实现这一步骤。
-
可视化激活:最后,可以通过将提取的特征图进行可视化,如绘制热图(heatmap)来展示每个特征图的激活程度。这可以帮助我们看到网络是如何在不同层次上学习到不同的特征,并理解其工作原理。
总的来说,激活可视化是一种强大的工具,可以帮助我们理解卷积神经网络的内部工作机制,以及网络是如何对输入数据进行处理和特征提取的。在MATLAB中,使用预训练模型和相应的工具函数可以相对容易地实现这一过程。
2、激活可视化卷积神经网络说明
1)方案
将图像馈送到卷积神经网络并显示网络的不同层的激活
2)实现
通过将激活区域与原始图像进行比较,检查激活并发现网络学习的特征。发现较浅层中的通道学习颜色和边缘等简单特征,而较深层中的通道学习复杂特征。
3、加载预训练的网络和数
1)加载预训练的网络和数据
代码
net = squeezenet;
2)读取并显示图像,保存图像大小
代码
im = imread('C:\Users\16023\Desktop\激活可视化卷积神经网络\CT1.png'); imshow(im) imgSize = size(im); imgSize = imgSize(1:2);
视图效果
4、查看网络架构
1)说明
卷积层使用可学习的参数执行卷积。网络学习识别有用的特征,通常每个通道对应一个特征。观察到第一个卷积层有 64 个通道。
图像输入层指定输入大小,可以在将图像通过网络之前调整图像大小,
2)实现代码
analyzeNetwork(net)
3)视图效果
5、显示第一个卷积层的激活
1)说明1
观察卷积层中的哪些区域在图像上激活,并将其与原始图像中的相应区域进行比较,以研究特征。卷积神经网络的每层由许多称为通道的二维数组组成。用图像对网络进行一轮训练,并检查 conv1 层的输出激活。
2)实现代码
act1 = activations(net,im,'conv1');
3) 说明2
激活以三维数组的形式返回,其中第三个维度对 conv1 层上的通道进行索引。要使用 imtile 函数显示这些激活,请将数组重构为四维。imtile 的输入中的第三个维度表示图像颜色。将第三个维度的大小设置为 1,因为激活没有颜色。第四个维度对通道进行索引。
4)实现代码
sz = size(act1); act1 = reshape(act1,[sz(1) sz(2) 1 sz(3)]);
5)显示激活
说明:每个激活都可能采用任何值,因此请使用 mat2gray 归一化输出。缩放所有激活值,以使最小激活值为 0,最大激活值为 1。在 8×8 网格上显示 64 个图像,层中的每个通道对应一个图像。
6)实现代码
I = imtile(mat2gray(act1),'GridSize',[8 8]); imshow(I)
7)视图效果
6、调查特定通道中的激活
1)说明
激活网格中的每个图块都是 conv1 层中某个通道的输出。白色像素表示强的正激活,黑色像素表示强的负激活。主要为灰色的通道未对输入图像进行强烈激活。通道激活中的像素位置对应于原始图像中的相同位置。通道中某个位置的白色像素表示该通道在该位置强激活。
调整通道 22 中的激活大小以使其与原始图像具有相同的大小,并显示激活。
2)代码
act1ch22 = act1(:,:,:,22); act1ch22 = mat2gray(act1ch22); act1ch22 = imresize(act1ch22,imgSize); I = imtile({im,act1ch22}); imshow(I)
3)视图效果
7、查找最强的激活通道
1)说明
使用 max 函数查找具有最多激活值的通道,调整大小并显示这些激活值
2)代码
[maxValue,maxValueIndex] = max(max(max(act1))); act1chMax = act1(:,:,:,maxValueIndex); act1chMax = mat2gray(act1chMax); act1chMax = imresize(act1chMax,imgSize); I = imtile({im,act1chMax}); imshow(I)
3)视图效果
8、调查更深的层
1)说明
多数卷积神经网络在第一个卷积层中学习检测颜色和边缘等特征。在更深的卷积层中,网络学习检测更复杂的特征。较深的层通过组合较浅层的特征来构建其特征。
2)调查 fire6-squeeze1x1 层
以调查 conv1 层的方式调查 fire6-squeeze1x1 层。计算、重构并在网格中显示激活。
3)代码
act6 = activations(net,im,'fire6-squeeze1x1'); sz = size(act6); act6 = reshape(act6,[sz(1) sz(2) 1 sz(3)]); I = imtile(imresize(mat2gray(act6),[64 64]),'GridSize',[6 8]); imshow(I)
4)视图效果
5)显示 fire6-squeeze1x1 层中最强的激活
代码
[maxValue6,maxValueIndex6] = max(max(max(act6))); act6chMax = act6(:,:,:,maxValueIndex6); imshow(imresize(mat2gray(act6chMax),imgSize))
视图效果
6)调查通道 14 和 47
代码
I = imtile(imresize(mat2gray(act6(:,:,:,[14 47])),imgSize)); imshow(I)
视图效果
7) 可视化 fire6-relu_squeeze1x1 层的激活
代码
act6relu = activations(net,im,'fire6-relu_squeeze1x1'); sz = size(act6relu); act6relu = reshape(act6relu,[sz(1) sz(2) 1 sz(3)]); I = imtile(imresize(mat2gray(act6relu(:,:,:,[14 47])),imgSize)); imshow(I)
视图效果
9、总结
激活可视化是一种重要的技术,可以帮助我们理解卷积神经网络(CNN)中每个卷积层学到的特征,并揭示网络对输入数据的处理方式。在MATLAB中,可以通过以下步骤实现激活可视化:
-
加载预训练的CNN模型:使用MATLAB的Deep Learning Toolbox加载预训练好的CNN模型,比如VGG、ResNet等。
-
选择要可视化的卷积层:选择CNN模型中的某个卷积层,通常选择靠近输出层的卷积层以观察更抽象的特征。
-
提取特征图:通过将输入图像传入 CNN 模型并获取选择的卷积层的输出特征图。
-
可视化激活:对提取的特征图进行可视化,例如生成热图(heatmap)展示每个特征图的激活程度。
激活可视化可以帮助我们更好地理解神经网络的工作原理,识别网络中学到的关键特征,优化网络结构和调整超参数。通过MATLAB提供的功能和工具,可以相对容易地进行激活可视化的实现,从而加深对 CNN 内部工作方式的理解,并进一步改进和优化模型效果。
9、源代码
代码
%% 激活可视化卷积神经网络 %将图像馈送到卷积神经网络并显示网络的不同层的激活 %通过将激活区域与原始图像进行比较,检查激活并发现网络学习的特征。发现较浅层中的通道学习颜色和边缘等简单特征,而较深层中的通道学习眼睛等复杂特征。 %% 加载预训练的网络和数据 %加载预训练的网络和数据 net = squeezenet; %读取并显示图像,保存图像大小, im = imread('C:\Users\16023\Desktop\激活可视化卷积神经网络\CT1.png'); imshow(im) imgSize = size(im); imgSize = imgSize(1:2); %% 查看网络架构 %卷积层使用可学习的参数执行卷积。网络学习识别有用的特征,通常每个通道对应一个特征。观察到第一个卷积层有 64 个通道。 %图像输入层指定输入大小,可以在将图像通过网络之前调整图像大小, analyzeNetwork(net) %% 显示第一个卷积层的激活 %观察卷积层中的哪些区域在图像上激活,并将其与原始图像中的相应区域进行比较,以研究特征。卷积神经网络的每层由许多称为通道的二维数组组成。用图像对网络进行一轮训练,并检查 conv1 层的输出激活。 act1 = activations(net,im,'conv1'); %激活以三维数组的形式返回,其中第三个维度对 conv1 层上的通道进行索引。要使用 imtile 函数显示这些激活,请将数组重构为四维。imtile 的输入中的第三个维度表示图像颜色。将第三个维度的大小设置为 1,因为激活没有颜色。第四个维度对通道进行索引。 sz = size(act1); act1 = reshape(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) %% 查找最强的激活通道 %使用 max 函数查找具有最多激活值的通道,调整大小并显示这些激活值。 [maxValue,maxValueIndex] = max(max(max(act1))); act1chMax = act1(:,:,:,maxValueIndex); act1chMax = mat2gray(act1chMax); act1chMax = imresize(act1chMax,imgSize); I = imtile({im,act1chMax}); imshow(I) %% 调查更深的层 %多数卷积神经网络在第一个卷积层中学习检测颜色和边缘等特征。在更深的卷积层中,网络学习检测更复杂的特征。较深的层通过组合较浅层的特征来构建其特征。 %以调查 conv1 层的方式调查 fire6-squeeze1x1 层。计算、重构并在网格中显示激活。 act6 = activations(net,im,'fire6-squeeze1x1'); sz = size(act6); act6 = reshape(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) %可视化 fire6-relu_squeeze1x1 层的激活 act6relu = activations(net,im,'fire6-relu_squeeze1x1'); sz = size(act6relu); act6relu = reshape(act6relu,[sz(1) sz(2) 1 sz(3)]); I = imtile(imresize(mat2gray(act6relu(:,:,:,[14 47])),imgSize)); imshow(I)
工程文件
https://download.csdn.net/download/XU157303764/89496035