首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >可视化卷积神经网络的激活图

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

作者头像
裴来凡
发布2026-04-02 14:38:51
发布2026-04-02 14:38:51
1220
举报

步骤1:加载预训练的网络和数据

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

代码语言:javascript
复制
net = squeezenet;

读取并显示图像。

代码语言:javascript
复制
im = imread('Lena.png');
imshow(im)
imgSize = size(im);
imgSize = imgSize(1:2);

步骤2:查看网络架构

分析该网络。

代码语言:javascript
复制
analyzeNetwork(net)

步骤3:显示第一个卷积层的激活

观察卷积层中的哪些区域在图像上激活,并将其与原始图像中的相应区域进行比较,以研究特征。

代码语言:javascript
复制
act1 = activations(net,im,'conv1');

激活以三维数组的形式返回,其中第三个维度对 conv1 层上的通道进行索引。

代码语言:javascript
复制
sz = size(act1);
act1 = reshape(act1,[sz(1) sz(2) 1 sz(3)]);

显示激活。

代码语言:javascript
复制
I = imtile(mat2gray(act1),'GridSize',[8 8]);
imshow(I)

步骤4:调查特定通道中的激活。

激活网格中的每个图块都是 conv1 层中某个通道的输出。

代码语言:javascript
复制
act1ch22 = act1(:,:,:,22);
act1ch22 = mat2gray(act1ch22);
act1ch22 = imresize(act1ch22,imgSize);
I = imtile({im,act1ch22});
imshow(I)

步骤5:查找最强的激活通道

通过编程方式调查具有大量激活值的通道来尝试查找感兴趣的通道。

代码语言:javascript
复制
[maxValue,maxValueIndex] = max(max(max(act1)));
act1chMax = act1(:,:,:,maxValueIndex);
act1chMax = mat2gray(act1chMax);
act1chMax = imresize(act1chMax,imgSize);

I = imtile({im,act1chMax});
imshow(I)

步骤6:调查更深的层

大多数卷积神经网络在第一个卷积层中学习检测颜色和边缘等特征。

代码语言:javascript
复制
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)

关注一些更有趣的图像。

代码语言:javascript
复制
[maxValue6,maxValueIndex6] = max(max(max(act6)));
act6chMax = act6(:,:,:,maxValueIndex6);
imshow(imresize(mat2gray(act6chMax),imgSize))

在所有通道的网格中,可能有通道针对眼睛激活。

代码语言:javascript
复制
I = imtile(imresize(mat2gray(act6(:,:,:,[14 47])),imgSize));
imshow(I)

许多通道包含同时存在浅色和深色的激活区域。

代码语言:javascript
复制
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)

步骤7:测试通道是否识别眼睛

读取并显示两眼一睁一闭的图像,并计算 fire6-relu_squeeze1x1 层的激活。

代码语言:javascript
复制
imClosed = imread('Lena-eye-closed.png');
imshow(imClosed)
代码语言:javascript
复制
act6Closed = activations(net,imClosed,'fire6-relu_squeeze1x1');
sz = size(act6Closed);
act6Closed = reshape(act6Closed,[sz(1),sz(2),1,sz(3)]);

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

代码语言:javascript
复制
channelsClosed = 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,channelsClosed*255));
imshow(I)
title('Input Image, Channel 14, Channel 47');

链接:https://ww2.mathworks.cn/help/deeplearning/ug/visualize-activations-of-a-convolutional-neural-network.html?s_tid=srchtitle_site_search_5_%25E5%25A4%258D%25E6%259D%2582%25E7%25BD%2591%25E7%25BB%259C

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档