深度学习 --- VGG16卷积核的可视化(JupyterNotebook实战)

news2024/9/22 13:38:34

VGG16卷积核的可视化

        在前一篇文章中,我对VGG16输入了一张图像,并实现了VGG16各层feature map的可视化。
深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)-CSDN博客文章浏览阅读615次,点赞13次,收藏15次。在VGG16模型中输入任意一张图片VGG16模型就能给出预测结果,但为什么会得到这个预测结果,通过观察每层的feature map或许有助于我们更好的理解模型。https://blog.csdn.net/daduzimama/article/details/140279255

        在这篇文章中,我会可视化各层学习到的卷积核(基于imagenet数据库预先训练好的),这是帮助我们进一步了解VGG16这个黑箱子的另一个角度。

1,通过tensorflow导入keras库

import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.applications.vgg16 import VGG16
from tensorflow.keras.applications.vgg16 import preprocess_input, decode_predictions


2,创建基于ImageNet预先训练好的VGG16模型

model_vgg16=VGG16(weights='imagenet',include_top=True)

#获取总层数
total_layer_num=len(model_vgg16.layers)
print(f"total num of layers={total_layer_num}")
model_vgg16.summary()

        该模型总共有23层,只在conv层有filter。 池化层(Pooling layer)的filter是预先设置好的,而不是通过训练数据学习得到的


3,获取已经训练好的各层卷积核

W=model_vgg16.get_weights()
W_size=len(W)
print(f"卷积核的总层数={W_size}")
for i in range(W_size):
    print("size of W",i,":",W[i].shape)

         单从模型本身来看包含conv的卷积层只有13个,但是log中给出的权重层共有32个,这是为什么呢?

        model给出的32权重列表是由于13个卷积层再加上两个全连接层和一个softmax分类器层,共16个。而每层所对应的bias也单独保存为一层,因此是16x2=32层。而在这篇文章中我们主要关注的重点是在前面的13个卷积核。


4,访问指定的卷积核

4,1 block1_conv1层的64个3x3x3的filter

W[0].shape

         卷积核的自身大小为3x3。因为,输入图像的通道数为3,所以,filter的尺寸为3x3x3。


4,2 访问block1_conv1层64个3x3x3的filter中的第0组filter中的第0个filter

# 获得block1_conv1层的第0组filter
block1_conv1_filter0=W[0][:,:,:,0]
print("size of block1_conv1_filter0 =",block1_conv1_filter0.shape)
print("filter0_filter0:\n",block1_conv1_filter0[0])
print("weight sum of filter =",np.sum(block1_conv1_filter0[0]))

        这里有一个问题,在传统的图像算法领域,比较常用卷积核的所有权重的和一般都是1。这是因为,在传统的图像处理算法中,例如平滑、锐化,等,为了确保经过卷积处理后的图像的亮度/能量不能发生变化。也就是要保证在传统算法中,卷积后的图像亮度不能比原始图像变得更亮或者更暗,因此,人们在设计卷积核的时候会刻意保证让设计出来的卷积核的和为1。

        但在这个例子中,卷积核的和是2.47大于1了。为什么会这样呢?

        VGG16中的所有卷积核都是通过学习得到的,更为详细的说是为了使损失函数最小通过反向传播算法自然而然的学习到的,而且卷积核在学习的时候并没有要求卷积核的和为1的这个约束。


4,3 绘制指定卷积核

plt.figure()
plt.imshow(block1_conv1_filter0[0])
plt.title("block1_conv1_filter0_filter0")


4,4 访问block1_conv1层所对应的偏置项

        有几个filter就对应几个偏置项,block1_conv1层总共有64个卷积核,因此,相应的有64个bias。

print(W[1].shape)
print("bias of block1_conv1:\n",W[1])
plt.figure()
plt.stem(W[1])


5,各层全部卷积核的可视化

5,1 可视化block1_conv1的前64个卷积核

        block1_conv1总共有64个卷积核,输入尺寸为224x224x3,每个卷积核的尺寸是3x3x3,输出的feature map是224x224x64。由于卷积核的通道数为3,imshow函数无法显示这一维度的图像,因此,下面所显示的64个卷积核都是通道0的图像。

n=8
lay=0

block1_conv1_filter0=W[lay][:,:,:,0]
print("size of block1_conv1_filter0 =",block1_conv1_filter0.shape)

fig,axes=plt.subplots(n,n,figsize=(15,15))
for i in range(n*n):
    filters=W[lay][:,:,0,i]#显示3个filter中的第一个
    axes[i//n,i%n].imshow(filters)


5,2 可视化block1_conv2的前64个卷积核

        block1_conv2总共有64个卷积核,输入尺寸为224x224x64,每个卷积核的尺寸是3x3x64,输出的feature map是224x224x64。由于卷积核总共有64个通道,imshow函数无法显示这一维度的图像,因此,下面所显示的卷积核都是通道0的图像。

n=8
lay=2

block1_conv2_filter0=W[lay][:,:,:,0]
print("size of block1_conv2_filter0 =",block1_conv2_filter0.shape)

fig,axes=plt.subplots(n,n,figsize=(15,15))
for i in range(n*n):
    filters=W[lay][:,:,0,i]#显示64个filter中的第一个
    axes[i//n,i%n].imshow(filters)


5,3 可视化block2_conv1的前64个卷积核

        block2_conv1总共有128个卷积核,输入尺寸为112x112x64,每个卷积核的尺寸是3x3x64,输出的feature map是112x112x128。由于卷积核总共有64个通道,imshow函数无法显示这一维度的图像,因此,下面所显示的卷积核都是通道0的图像。

n=8
lay=4

block2_conv1_filter0=W[lay][:,:,:,0]
print("size of block2_conv1_filter0 =",block2_conv1_filter0.shape)

fig,axes=plt.subplots(n,n,figsize=(15,15))
for i in range(n*n):
    filters=W[lay][:,:,0,i]#显示64个filter中的第一个
    axes[i//n,i%n].imshow(filters)


5,4 可视化block3_conv3的前64个卷积核

        block3_conv3总共有256个卷积核,输入尺寸为56x56x256,每个卷积核的尺寸是3x3x256,输出的feature map是56x56x256。由于卷积核总共有256个通道,imshow函数无法显示这一维度的图像,因此,下面所显示的卷积核都是通道0的图像。

n=8
lay=12

block3_conv3_filter0=W[lay][:,:,:,0]
print("size of block3_conv3_filter0 =",block3_conv3_filter0.shape)

fig,axes=plt.subplots(n,n,figsize=(15,15))
for i in range(n*n):
    filters=W[lay][:,:,0,i]#显示256个filter中的第一个
    axes[i//n,i%n].imshow(filters)


5,5 可视化block4_conv1的前64个卷积核

        block4_conv1总共有512个卷积核,输入尺寸为28x28x256,每个卷积核的尺寸是3x3x256,输出的feature map是28x28x512。由于卷积核总共有256个通道,imshow函数无法显示这一维度的图像,因此,下面所显示的卷积核都是通道0的图像。

n=8
lay=14

block4_conv1_filter0=W[lay][:,:,:,0]
print("size of block4_conv1_filter0 =",block4_conv1_filter0.shape)

fig,axes=plt.subplots(n,n,figsize=(15,15))
for i in range(n*n):
    filters=W[lay][:,:,0,i]#显示256个filter中的第一个
    axes[i//n,i%n].imshow(filters)


5,6 可视化block5_conv3的前64个卷积核

        block5_conv3总共有512个卷积核,输入尺寸为14x14x512,每个卷积核的尺寸是3x3x512,输出的feature map是14x14x512。由于卷积核总共有512个通道,imshow函数无法显示这一维度的图像,因此,下面所显示的卷积核都是通道0的图像。

n=8
lay=24

block5_conv3_filter0=W[lay][:,:,:,0]
print("size of block5_conv3_filter0 =",block5_conv3_filter0.shape)

fig,axes=plt.subplots(n,n,figsize=(15,15))
for i in range(n*n):
    filters=W[lay][:,:,0,i]#显示512个filter中的第一个
    axes[i//n,i%n].imshow(filters)


6,全连接层的可视化

        第一个全连接层fc1共有4096个神经元,每个神经元都与25088个输入相连。 也就是说如果该全连接层的数学模型为f=xW+b的话,x的维度是1x25088,W的维度应当是25088x4096。

fc1=W[26]
fc1.shape

        在fc1的4096组25088个权重中,用于计算第500个神经元的25088个权重系数为:

plt.figure()
plt.stem(fc1[:,500])

        对fc1而言,共有4096组权重,每组权重对应一个神经元,且有多少个神经元就对应多少个偏置项。

fc1_bias=W[27]
print(fc1_bias.shape)
plt.figure()
plt.stem(fc1_bias)


7,softmax层的可视化

sfmx=W[-2]
sfmx.shape

plt.figure()
plt.stem(sfmx[:,500])


(全文完) 

--- 作者,松下J27

参考文献(鸣谢): 

1,代码实战-VGG16卷积核权重可视化_哔哩哔哩_bilibili

2,Stanford University CS231n: Deep Learning for Computer Vision

3,可视化卷积神经网络_哔哩哔哩_bilibili

(配图与本文无关)

古诗词赏析:

《池州翠微亭》

宋---岳飞

经年尘土满征衣,特特寻芳上翠微。
好水好山看不足,马蹄催趁月明归。

版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27 

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

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

相关文章

123-域防火墙入站出站规则不出网隧道上线组策略对象同步

参考:【内网安全】 域防火墙&入站出站规则&不出网隧道上线&组策略对象同步_对公司的邮件服务器建立防火墙规则 入站出战-CSDN博客 单机-防火墙-限制端口出入站 熟悉常见主机配置不出网的方式 1、入站&出站&连接安全 2、域&专用&公网…

【采集软件】用Python开发的小红薯详情批量采集工具,含笔记正文、转评赞藏等

一、背景介绍 1.1 爬取目标 用python开发的爬虫采集软件,可自动按笔记链接抓取笔记的详情数据。 为什么有了源码还开发界面软件呢?方便不懂编程代码的小白用户使用,无需安装python,无需改代码,双击打开即用&#xff…

本地部署docker文档

由于访问 https://docs.docker.com/ 文档慢,直接本地部署官方文档 如果不想执行以下操作,也可以直接使用官方文档仓库地址提供的 Dockerfile 和 compose.yaml 进行操作 以下操作环境为Windows系统,根据 Dockerfile 相关操作来生成 html 页面…

二叉树【1】

操作 新建节点(new) 新建一个值为v的节点,左右孩子NULL 查找 void查找函数 { 递归边界:NULL,然后退出 (return;) 查找左子树 查找柚子树 } 插入 void 插入函数 {…

Vue表单元素绑定:v-model 指令

Vue 指令系列文章: 《Vue插值:双大括号标签、v-text、v-html、v-bind 指令》 《Vue指令:v-cloak、v-once、v-pre 指令》 《Vue条件判断:v-if、v-else、v-else-if、v-show 指令》 《Vue循环遍历:v-for 指令》 《Vue事件…

NPM:配置阿里镜像库

1、配置阿里云镜像源 #查看当前使用的镜像地址命令 npm config get registry#设置阿里镜像源 npm config set registry http://registry.npmmirror.com 这里要注意下,之前的源镜像地址 https://registry.npm.taobao.org/ 已经不能用了,这里要更改为新地…

80页PPT数据中台应用技术实施方案

本文资料完整版81页PPT,下载完整PPT资料,知识星球APP搜索【智慧方案文库】,下载“数据中台”合集资料,以及8800份解决方案 数据中台设计的方法 (1)基于面向服务的架构方法(SOA) 基于面向服务的架构方法 …

spring整合redis

1.导入依赖 <!-- spring-data-redis 依赖--> <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.7.18</version> </dependency> <dependency><…

旧衣回收小程序系统,为市场发展提供新模式

随着绿色生活的兴起&#xff0c;回收成为了大众生活的新选择&#xff0c;其中旧衣物回收更是深入人心&#xff01;通过旧衣物回收&#xff0c;大众不仅可以减少浪费&#xff0c;也能够进行资源在利用。目前&#xff0c;在科技的支持下&#xff0c;旧衣物回收正以一种新的方式进…

机械学习—零基础学习日志(如何理解概率论6)

随机变量的数字特征——期望与方差 以小明的成绩为例&#xff0c;如图所示。 这里其实涉及到&#xff0c;数学期望的概念。 对应的数值&#xff0c;乘以概率&#xff0c;相加以后就得到了数学期望。 随机变量的数学期望与方差 、 来个练习题&#xff1a; 解析&#xff1a; …

自制多肉查询工具

背景&#xff1a; 复习python qt、网页解析的常用操作 准备&#xff1a; 多肉信息网站涉及python的第三方库&#xff1a; lxmlPyQt5 实现效果&#xff1a; 功能&#xff1a; 随机读取&#xff1a;从本地加载已存储的多肉信息数据更新&#xff1a;从多肉信息网站更新5条多…

QT:Qt与ECharts

介绍ECharts ECharts是一款基于JavaScript的数据可视化图表库&#xff0c;由百度团队最初开发&#xff0c;并在2018年初捐赠给Apache基金会&#xff0c;成为ASF孵化级项目。随着项目的不断发展&#xff0c;ECharts在2021年1月26日正式毕业&#xff0c;成为Apache顶级项目 链接…

背包问题【算法 07】

背包问题 背包问题是经典的计算机科学问题之一&#xff0c;涉及到如何在有限资源的约束下&#xff0c;选择最优的物品组合&#xff0c;以最大化收益。这个问题在现实中有广泛的应用&#xff0c;例如资源分配、物流调度和投资组合优化等。本文将详细介绍背包问题的定义、解决方法…

pytorch深度学习基础 7(简单的的线性训练,SGD与Adam优化器)

接下来小编来讲一下一些优化器在线性问题中的简单使用使用&#xff0c;torch模块中有一个叫optim的子模块&#xff0c;我们可以在其中找到实现不同优化算法的类 SGD随机梯度下降 基本概念 定义&#xff1a;随机梯度下降&#xff08;SGD&#xff09;是一种梯度下降形式&#…

mysql中出现错误1138-Invalid use of NULL value

问题&#xff1a;1138-Invalid use of NULL value 解决&#xff1a; 问题是当前字段中&#xff0c;有null的值&#xff0c;简单来说就是&#xff0c;你表里有空值&#xff0c;不能设置不为空&#xff01;&#xff01;&#xff01; 把空的值删掉重新设计就好了

第一次重大人工智能失败刚刚发生

这终于发生了。我们迎来了第一家真正意义上的 AI 公司惨败。 Inflection是一家由比尔盖茨、埃里克施密特、微软等人投资的公司&#xff0c;它成为第一家被冲进马桶的生成式人工智能相关公司。 他们最重要的产品是Pi&#xff0c;ChatGPT 的竞争对手&#xff0c;专注于成为友好且…

SpringAOP使用详解

AOP使用详解 首先创建maven项目 添加依赖在pom.xml里 创建三层结构和spring.xml文件&#xff0c;只要用到注解就得写扫描包在spring.xml里 上篇文章的知识点总结 对上篇文章excution详细解释 如果把前置通知修改成这个代表只有带有Logger注解的才会生效 合并注解的方法用&…

Windows权限维持实战

目录 介绍步骤 介绍 在攻击过程中中对于拿到的shell或钓上来的鱼&#xff0c;目前比较流行用CS做统一管理&#xff0c;但实战中CS官方没有集成一键权限维持的功能&#xff0c;为了将该机器作为一个持久化的据点&#xff0c;种植一个具备持久化的后门&#xff0c;从而随时可以连…

ffmpeg最新5.1.6版本源码安装

一、编译安装需要的开源编码格式&#xff1a; 首先在编译安装这些开源编码格式之前,我们要明白为啥需要他们&#xff1a; aacx264x265 为啥需要呢&#xff1f;如果你对ffmpeg稍微了解的话&#xff0c;ffmpeg本身是一个框架&#xff0c;自身默认并没有支持这三种编码格式&…

Vue3 后台管理系统项目 前端部分

这里写目录标题 1 创建Vue3项目1.1 相关链接1.2 Vue Router1.3 Element1.4 scss1.5 mitt1.6 axios1.7 echarts1.8 配置vite.config.js 2 CSS部分2.1 样式穿透2.2 :style &#xff1a;在样式中使用插值语法 3. ElementUI3.1 rules&#xff1a; 数据验证3.2 修改element.style中的…