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

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=0block1_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=2block1_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=4block2_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=12block3_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=14block4_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=24block5_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.rhkb.cn/news/407428.html

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

相关文章

Linux三剑客-sedawk

一、三剑客-sed命令 1、格式 sed 找谁干啥 文件 找谁:条件,匹配哪一行,哪些行. 干啥:动作,增删改查. #显示文件的第3行 sed -n 3p /etc/passwd选项说明-n取消默认输出-p查找-rsed支持扩展正则-i修改文件内容,这个选项放在最后…

【C++ Primer Plus习题】3.5

问题: 解答: #include <iostream> using namespace std;int main() {long long populationWorld 0;long long populationChina 0;cout << "请输入全球的人口数:";cin >> populationWorld;cout << "请输入中国的人口数:";cin &g…

XSS- - - DOM 破坏案例与靶场

目录 链接靶场&#xff1a; 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场&#xff1a; XS…

GenAI 的产品:快速行动,但失败

2022 年秋季&#xff0c;我正在做一个很酷的项目。是的&#xff0c;你猜对了——使用公司特定的数据对预先训练的 LLM&#xff08;Bert&#xff09;进行微调。 然而&#xff0c;很快 ChatGPT 就发布了&#xff0c;并席卷了全世界。既然已经有一门非常强大的 LLM 了&#xff0c…

ARM——驱动——inmod加载内核模块

在上一篇文章的代码上添加出错处理 #include <linux/init.h> // 包含初始化宏和函数 #include <linux/kernel.h> // 包含内核函数和变量 #include <linux/fs.h> // 包含文件操作的结构和函数 #include <linux/kdev_t.h> /…

PyTorch——transforms

接着上一篇&#xff0c;我们这一篇讲transforms 1、什么是transform 首先transform是来自PyTorch的一个扩展库——【torchvision】&#xff0c;【torchvision】这个库提供了许多计算机视觉相关的工具和功能&#xff0c;能够在神经网络中&#xff0c;将图像、数据集、预处理模型…

【系统架构设计】软件架构设计(1)

【系统架构设计】软件架构设计&#xff08;1&#xff09; 软件架构概述架构需求与软件质量属性软件架构风格数据流风格批处理序列管道-过滤器2者风格比较 仓库风格--黑板系统 层次系统架构风格二层及三层C/S架构风格MVCMVP 面向服务的架构 软件架构概述 基于架构的软件开发模型…

网络通信tcp

一、udp案例 二、基于tcp: tcp //c/s tcp 客户端: 1.建立连接 socket bind connect 2.通信过程 read write close tcp服务器: 1.建立连接 socket bind listen accept 2.通信过程 read write close connect函数 int connect(int sockfd, con…

postgresql 集群文档

https://www.cnblogs.com/Alicebat/p/14148933.html [命令] Pacemaker 命令 pcs cluster &#xff08;管理节点&#xff09; – Eternal Center PostgreSQL实战之物理复制和逻辑复制&#xff08;五&#xff09;_postgresql 流复制和物理复制-CSDN博客 https://jingyan.baidu…

【Windows】深度学习环境部署

引言 1 Windows环境准备 1.1 VSCode Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的开源代码编辑器。它非常受开发者欢迎&#xff0c;因为它功能强大、扩展性好&#xff0c;并且支持多种编程语言。VSCode 尤其适合 Python 开发&#xff0c;特别是…

网络 通信

一、客户端接收(也可以bind) 1. socket socket 函数 用于创建一个套接字&#xff08;socket&#xff09;&#xff0c;这是网络通信的基础。 它的原型如下&#xff1a;int socket(int domain, int type, int protocol); 参数&#xff1a; domain&#xff1a;指定协议族&…

虚幻5|AI视力系统,听力系统,预测系统(3)预测系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;2&#xff09;听力系统-CSDN博客 一&#xff0c;添加一个AI预感感官配置 1.选中我们的AIPerception,右侧细节添加一个AI预感感官配置&#xff0c;然后我们把所有感官的年龄都调成5&#xff0c;是所有 2…

全网最简单的Java设计模式【九】策略模式-实战中最常用的设计模式之一

策略模式是一种行为设计模式&#xff0c;它允许你定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可以相互替换。该模式让算法的变化独立于使用算法的客户。在实际开发中&#xff0c;策略模式可以帮助我们减少大量的 if-else 或 switch 条件判断语句&…

premiere2023暴力压缩视频

目录 1. 需求说明2. 压缩流程 1. 需求说明 要将三段视频拼接起来&#xff0c;时长超过了1h&#xff0c;然后压缩到200M以内的视频。 这是三段视频的信息&#xff1a; 合并三个视频文件意味着总时长增加了。较长的视频文件通常也会更大&#xff0c;即使比特率相同。 当我把三段…

vscode 阅读linux内核(vscode+clangd)

此插件曾在vim里用过&#xff0c;非常好用。 首先先在vscode 里下载clangd插件 这只是客户端&#xff0c;还需下载个服务器&#xff08;这在coc插件里也有说明&#xff09; sudo apt install clangd 下载完后可以 clangd --version 查看版本信息&#xff0c;如果能查看&#x…

UE5 日期时间蓝图变量 加减节点

参考链接&#xff1a;Having troubles with DateTime in UE5 - General / Feedback & Requests - Epic Developer Community Forums (unrealengine.com) 直接粘贴到UE5蓝图图表可用。&#xff08;反之相加&#xff0c;用负号操作一下&#xff09; 减号蓝图节点&#xff08;…

8.22-docker的部署及其使用

docker 1.docker环境部署以及语法 [rootdocker ~]# cat << EOF | tee /etc/modules-load.d/k8s.conf> overlay> br_netfilter> EOFoverlaybr_netfilter[rootdocker ~]# modprobe overlay[rootdocker ~]# modprobe br_netfilter[rootdocker ~]# cat /etc/module…

AI绘画工具 Stable Diffusion【插画转绘】:建筑 | 风景| 人像照片的插画转绘制作教程,照片秒变插画风格图片!

大家好&#xff0c;我是画画的小强 关于Stable Diffusion 的插画转绘&#xff0c;今天给大家分享一种制作方法。我们先看一下效果图。 一. 图片转插画的制作方法 本期教程我们将使用AI绘画工具Stable Diffusion&#xff0c;关于SD的安装和入门使用可以看看我的往期入门教程…

122-域信息收集应用网络凭据CS插件AdfindBloodHound

参考&#xff1a;【内网安全】域信息收集&应用网络凭据&CS插件&Adfind&BloodHound_ladon adfinder bloodhound-CSDN博客 工作组和域环境 我的理解&#xff1a; 工作组就是还是局域网一样只是大一点里面的电脑很多&#xff0c;每个电脑还是都是单独的电脑没有…

解决arcmap发布影像切片,注册传输数据慢的问题

1、本地服务器进行切片步骤&#xff1a; 开发环境按照正常方案发布影像切片。 2、生产环境切片步骤 a、使用范文等同影像文件范围的矢量面数据&#xff0c;作为切片数据发布切片服务 重点&#xff1a;【服务名称必须一致】 b、获取开发环境切片的切片方案文件conf.xml 重点&am…