1.33、激活可视化卷积神经网络(matalb)

1、激活可视化卷积神经网络原理及流程

激活可视化(Activation Visualization)指的是通过可视化神经网络中激活函数的输出,来理解神经网络是如何学习并提取特征的过程。在卷积神经网络(CNN)中,我们可以通过可视化激活来观察每个卷积层的特征图,从而更好地理解网络学到的特征。

以下是在MATLAB中激活可视化卷积神经网络的基本原理及流程:

  1. 加载预训练的CNN模型:首先,需要加载预训练好的CNN模型,比如VGG、ResNet等。MATLAB提供了工具箱(如Deep Learning Toolbox)来支持加载和使用这些预训练模型。

  2. 选择要可视化的卷积层:在加载模型后,选择要可视化的具体卷积层。一般来说,选择靠近输出层的卷积层效果比较好,因为这些层更抽象地表示了输入图像的特征。

  3. 提取特征图:通过将输入图像传递给加载的CNN模型,并获取所选卷积层的输出特征图。在MATLAB中可以使用提供的函数来实现这一步骤。

  4. 可视化激活:最后,可以通过将提取的特征图进行可视化,如绘制热图(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);

视图效果

ade53548521740d2a5ab573592ba8519.png

4、查看网络架构

1)说明

卷积层使用可学习的参数执行卷积。网络学习识别有用的特征,通常每个通道对应一个特征。观察到第一个卷积层有 64 个通道。

图像输入层指定输入大小,可以在将图像通过网络之前调整图像大小,

2)实现代码

analyzeNetwork(net)

3)视图效果

c5fca8ee07a14a9d9bb28b657e903483.png

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)视图效果

 a32ac66755524d66a85bb0b84e15716c.png

6、调查特定通道中的激活

1)说明

激活网格中的每个图块都是 conv1 层中某个通道的输出。白色像素表示强的正激活,黑色像素表示强的负激活。主要为灰色的通道未对输入图像进行强烈激活。通道激活中的像素位置对应于原始图像中的相同位置。通道中某个位置的白色像素表示该通道在该位置强激活。

调整通道 22 中的激活大小以使其与原始图像具有相同的大小,并显示激活。

2)代码

act1ch22 = act1(:,:,:,22);
act1ch22 = mat2gray(act1ch22);
act1ch22 = imresize(act1ch22,imgSize);I = imtile({im,act1ch22});
imshow(I)

3)视图效果

 9addff80ce2143398138ee6c447e9125.png

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)视图效果

fc2ff8ca60ea4fefa892bfa6df5151fd.png

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)视图效果

9a599dccad5f4f3dba68dae58bf39856.png

5)显示 fire6-squeeze1x1 层中最强的激活

代码

[maxValue6,maxValueIndex6] = max(max(max(act6)));
act6chMax = act6(:,:,:,maxValueIndex6);
imshow(imresize(mat2gray(act6chMax),imgSize))

视图效果 

a7a6ab444d354b42a3b7666e0de1705d.png

6)调查通道 14 和 47

代码

I = imtile(imresize(mat2gray(act6(:,:,:,[14 47])),imgSize));
imshow(I)

视图效果

3952d218f7cd45c3b5006683001d1c57.png

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)

视图效果

dd4e8227b5214c3c9a0811d6fd63a1bb.png

9、总结

激活可视化是一种重要的技术,可以帮助我们理解卷积神经网络(CNN)中每个卷积层学到的特征,并揭示网络对输入数据的处理方式。在MATLAB中,可以通过以下步骤实现激活可视化:

  1. 加载预训练的CNN模型:使用MATLAB的Deep Learning Toolbox加载预训练好的CNN模型,比如VGG、ResNet等。

  2. 选择要可视化的卷积层:选择CNN模型中的某个卷积层,通常选择靠近输出层的卷积层以观察更抽象的特征。

  3. 提取特征图:通过将输入图像传入 CNN 模型并获取选择的卷积层的输出特征图。

  4. 可视化激活:对提取的特征图进行可视化,例如生成热图(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/871808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强,大项目不适应tomcat做为转发动态的中间件(k8s集群,pytnon rubby),小项目会使用(内部使用的)动静分离 默认配置不适合生产环境&…

MySQl高级篇 -索引优化篇

索引 InnoDB采用了一个B数来存储索引,使得在千万级数据量的一个情况下,树的高度可以控制在3层以内,而层高代表磁盘IO的一个次数,因此基于索引查找可以减少磁盘IO的次数 MySQL的索引是在存储引擎层实现的,不同的存储引…

头歌资源库(31)象棋中马遍历棋盘的问题

一、 问题描述 二、算法思想 这是一个典型的深度优先搜索问题。 首先,我们创建一个mn的棋盘,并初始化所有的点为未访问状态。 然后,我们从(0, 0)位置开始进行深度优先搜索。 在每一步中,我们先标记当前位置为已访问&#xff0…

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只,内容变化已多单一的fragment,变成连续的,特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动,到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久,网上的方法基本上都试过了,终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

基于Python+Django+MySQL+Echarts的租房数据可视化分析系统

租房数据可视化 DjangoMySQLEcharts 基于PythonDjangoMySQLEcharts的租房数据可视化分析系统 Echarts 信息存储在数据库中 不含爬虫代码,或爬虫代码已失效 不支持登录注册 简介 基于DjangoMySQLEcharts的租房数据可视化系统通过连接数据库获取数据&#xff0c…

【格密码基础】旋转格的性质

目录 一. 回顾ZSVP问题 二. 基于ZSVP问题的密码系统 三. 格基旋转与Gram矩阵 四. 补充矩阵QR分解 4.1 矩阵分解 4.2 举例 前序文章请参考: 【格密码基础】详解ZSVP问题-CSDN博客 一. 回顾ZSVP问题 根据之前的讨论我们知道解决ZSVP问题的计算复杂度为&#x…

一款IM即时通讯聊天系统源码,包含app和后台源码

一款IM即时通讯聊天系统源码 聊天APP 附APP,后端是基于spring boot开发的。 这是一款独立服务器部署的即时通讯解决方案,可以帮助你快速拥有一套自己的移动社交、 企业办公、多功能业务产品。可以 独立部署!加密通道!牢牢掌握通…

您需要了解的欧盟网络弹性法案

了解CRA包含的内容以及如何遵守。 什么是CRA? 《网络弹性法案》(CRA)是即将出台的欧盟法规,旨在确保在欧盟销售的所有数字产品和服务(如连接到互联网的软件和硬件)都采用强大的网络安全措施。 该法案要求…

【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序【图文讲解】

欢迎来到CILMY23的博客 🏆本篇主题为:【数据结构与算法】选择排序篇----详解直接插入排序和哈希排序 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux…

Chrome浏览器的Profile数据内容简介

前文简介了Chrome存储的账密/Cookie数据:一段代码读取Chrome存储的所有账号密码和Cookie 本文再扩展介绍一下Chrome存储的其它一些隐私数据。 注:因为业务需要,简单调研了一些基本内容和存储路径,没有深入去研究,有啥…

新160个crackme - 002-abexcm5

运行分析 猜测需要输入正确序列号 PE分析 32位,ASM程序,无壳 静态分析 ida shift F12 ,发现字符串定位主函数 分析主函数 lstrcat:拼接字符串 lstrcmpiA:比较字符串 动态调试 serial输入123456调试 发现序列号…

Codeforces Round 957 (Div. 3)(A~D题)

A. Only Pluses 思路: 优先增加最小的数&#xff0c;它们的乘积会是最优,假如只有两个数a和b&#xff0c;b>a&#xff0c;那么a 1&#xff0c;就增加一份b。如果b 1&#xff0c;只能增加1份a。因为 b > a&#xff0c;所以增加小的数是最优的。 代码: #include<bi…

Spring Boot集成groovy快速入门Demo

1.什么是groovy&#xff1f; Groovy 是构建在 JVM 上的一个轻量级却强大的动态语言&#xff0c;它结合了 Python、Ruby 和 Smalltalk 的许多强大的特性。 Groovy 就是用 Java 写的&#xff0c;Groovy 语法与 Java 语法类似&#xff0c;Groovy 代码能够与 Java 代码很好地结合&…

STM32MP135裸机编程:定时器内核时钟频率计算方法

0 工具准备 STM32MP13xx参考手册 1 定时器内核时钟频率计算方法 1.1 定时器分组 STM32MP135的定时器按照时钟源不同分成了三组&#xff0c;如下&#xff1a; APB1: APB2: APB6&#xff1a; 1.2 定时器内核时钟频率计算方法 APB1DIV是APB1的分频系数&#xff0c;APB2DIV、…

python双下划线怎么打

连续按键盘上的“shift_”键两次即可&#xff0c;不同编辑器可能显示会不太一样。像图1中那样没连起来也是对的&#xff0c;没有语法错误。

基于python豆瓣电影爬虫数据可视化分析推荐系统(完整系统源码+数据库+详细文档+论文+详细部署教程)

文章目录 基于python豆瓣电影爬虫数据可视化分析推荐系统&#xff08;完整系统源码数据库详细文档论文详细部署教程&#xff09;一、 选题背景二、研究目的三、开发技术介绍1、Django框架2、LDA3、机器学习推荐算法4、大数据爬虫5、大数据Echarts可视化 四、系统设计思想五、部…

C++ | Leetcode C++题解之第235题二叉搜索树的最近公共祖先

题目&#xff1a; 题解&#xff1a; class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {TreeNode* ancestor root;while (true) {if (p->val < ancestor->val && q->val < ancestor->val) {anc…

贪心算法案例

1.买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…

代码随想录算法训练营第31天|LeetCode 56. 合并区间、738.单调递增的数字、968.监控二叉树

1. LeetCode 56. 合并区间 题目链接&#xff1a;https://leetcode.cn/problems/merge-intervals/description/ 文章链接&#xff1a;https://programmercarl.com/0056.合并区间.html 视频链接&#xff1a;https://www.bilibili.com/video/BV1wx4y157nD 思路&#xff1a; 本题关…