【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构
文章目录
- Visualkeras介绍
- 下载安装
- 代码示例
- 1、导入必要的库
- 2、创建VGG16神经网络模型
- 3、可视化神经网络结构
- 4、完整代码
- 5、使用教程
- 可视化自己创建的神经网络结构
- 1、导入要的库
- 2、创建自己的神经网络模型
- 3、可视化神经网络结构图
- 4、完整代码
Visualkeras介绍
Visualkeras是一个Python包,用于帮助可视化Keras(独立或包含在tensorflow中)神经网络架构。它允许简单的造型来满足大多数需求。该模块支持分层风格的架构生成,这对CNN(卷积神经网络)非常有用。
下载安装
Visualkeras源代码链接:https://github.com/paulgavrikov/visualkeras
使用清华源安装Visualkeras
pip install visualkeras -i https://pypi.tuna.tsinghua.edu.cn/simple
代码示例
使用CNN经典网络VGG16作为示例,可视化神经网络结构。
1、导入必要的库
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, Conv2D, Dropout, MaxPooling2D, InputLayer, ZeroPadding2D
from collections import defaultdict
import visualkeras
from PIL import ImageFont
2、创建VGG16神经网络模型
# create VGG16
image_size = 224
model = Sequential()
model.add(InputLayer(input_shape=(image_size, image_size, 3)))model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(64, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(64, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(128, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(128, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(256, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(256, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(256, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(MaxPooling2D())
model.add(visualkeras.SpacingDummyLayer())model.add(Flatten())model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000, activation='softmax'))
3、可视化神经网络结构
# Now visualize the model!color_map = defaultdict(dict)
color_map[Conv2D]['fill'] = 'orange'
color_map[ZeroPadding2D]['fill'] = 'gray'
color_map[Dropout]['fill'] = 'pink'
color_map[MaxPooling2D]['fill'] = 'red'
color_map[Dense]['fill'] = 'green'
color_map[Flatten]['fill'] = 'teal'font = ImageFont.truetype("./Arial.ttf", 32)visualkeras.layered_view(model, to_file='./figures/vgg16.png', type_ignore=[visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_legend.png', type_ignore=[visualkeras.SpacingDummyLayer],legend=True, font=font)
visualkeras.layered_view(model, to_file='./figures/vgg16_spacing_layers.png', spacing=0)
visualkeras.layered_view(model, to_file='./figures/vgg16_type_ignore.png',type_ignore=[ZeroPadding2D, Dropout, Flatten, visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_color_map.png',color_map=color_map, type_ignore=[visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_flat.png',draw_volume=False, type_ignore=[visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_scaling.png',scale_xy=1, scale_z=1, max_z=1000, type_ignore=[visualkeras.SpacingDummyLayer])
4、完整代码
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, Conv2D, Dropout, MaxPooling2D, InputLayer, ZeroPadding2D
from collections import defaultdict
import visualkeras
from PIL import ImageFont# create VGG16
image_size = 224
model = Sequential()
model.add(InputLayer(input_shape=(image_size, image_size, 3)))model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(64, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(64, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(128, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(128, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(256, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(256, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(256, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(visualkeras.SpacingDummyLayer())model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(ZeroPadding2D((1, 1)))
model.add(Conv2D(512, activation='relu', kernel_size=(3, 3)))
model.add(MaxPooling2D())
model.add(visualkeras.SpacingDummyLayer())model.add(Flatten())model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000, activation='softmax'))# Now visualize the model!color_map = defaultdict(dict)
color_map[Conv2D]['fill'] = 'orange'
color_map[ZeroPadding2D]['fill'] = 'gray'
color_map[Dropout]['fill'] = 'pink'
color_map[MaxPooling2D]['fill'] = 'red'
color_map[Dense]['fill'] = 'green'
color_map[Flatten]['fill'] = 'teal'font = ImageFont.truetype("./Arial.ttf", 32)visualkeras.layered_view(model, to_file='./figures/vgg16.png', type_ignore=[visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_legend.png', type_ignore=[visualkeras.SpacingDummyLayer],legend=True, font=font)
visualkeras.layered_view(model, to_file='./figures/vgg16_spacing_layers.png', spacing=0)
visualkeras.layered_view(model, to_file='./figures/vgg16_type_ignore.png',type_ignore=[ZeroPadding2D, Dropout, Flatten, visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_color_map.png',color_map=color_map, type_ignore=[visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_flat.png',draw_volume=False, type_ignore=[visualkeras.SpacingDummyLayer])
visualkeras.layered_view(model, to_file='./figures/vgg16_scaling.png',scale_xy=1, scale_z=1, max_z=1000, type_ignore=[visualkeras.SpacingDummyLayer])
5、使用教程
- 创建一个项目文件夹(例如:Project)
- 在创建的项目文件夹Project 中新建一个文件夹(文件夹名为 figures )
- 通过链接(https://ultralytics.com/assets/Arial.ttf)下载 Arial.ttf 字体文件
- 将下载的 Arial.ttf 字体文件 放在 项目文件夹Project 下
- 在 项目文件夹Project 下新建一个py文件(如:examples.py)
- 将上述的完整代码复制到 examples.py 中
- 运行examples.py
- 在 figures文件夹中查看生成的可视化图
- vgg16.png

- vgg16_legend.png

可视化自己创建的神经网络结构
1、导入要的库
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import models,layers
from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization, Flatten, Dense
from tensorflow.keras.callbacks import Callback, ModelCheckpoint
import visualkeras
2、创建自己的神经网络模型
将以下代码替换为自己的Keras / TensorFlow 神经网络结构。
model = models.Sequential()
# 第一层卷积层
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1))) # 假设输入图像大小为48x48,1为灰度图
model.add(layers.MaxPooling2D((2, 2)))
# 第二层卷积层
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 展平层
model.add(layers.Flatten())
# 全连接层
model.add(layers.Dense(64, activation='relu'))
# 输出层,假设分类任务有7个类别
model.add(layers.Dense(7, activation='softmax'))
3、可视化神经网络结构图
显示层风格图
visualkeras.layered_view(model).show() # 只显示图
# visualkeras.layered_view(model, to_file='output.png').show() # 保存和显示图

显示带有标签的层风格图
from PIL import ImageFont
font = ImageFont.truetype("./Arial.ttf", 32)visualkeras.layered_view(model, legend=True, font=font).show() # 只显示图
# visualkeras.layered_view(model, to_file='output_legend.png', legend=True, font=font).show() # 保存和显示图

4、完整代码
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import models,layers
from tensorflow.keras.layers import Conv2D, MaxPooling2D, BatchNormalization, Flatten, Dense
from tensorflow.keras.callbacks import Callback, ModelCheckpoint
import visualkeras# 可以将下面这部分创建模型的代码更换你自己的神经网络结构
model = models.Sequential()
# 第一层卷积层
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(48, 48, 1))) # 假设输入图像大小为48x48,1为灰度图
model.add(layers.MaxPooling2D((2, 2)))
# 第二层卷积层
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
# 展平层
model.add(layers.Flatten())
# 全连接层
model.add(layers.Dense(64, activation='relu'))
# 输出层,假设分类任务有7个类别
model.add(layers.Dense(7, activation='softmax'))visualkeras.layered_view(model).show() # 只显示图
# visualkeras.layered_view(model, to_file='output.png').show() # 保存和显示图from PIL import ImageFont
font = ImageFont.truetype("./Arial.ttf", 32)visualkeras.layered_view(model, legend=True, font=font).show() # 只显示图
# visualkeras.layered_view(model, to_file='output_legend.png', legend=True, font=font).show() # 保存和显示图
相关文章:
【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构
文章目录 Visualkeras介绍下载安装代码示例1、导入必要的库2、创建VGG16神经网络模型3、可视化神经网络结构4、完整代码5、使用教程 可视化自己创建的神经网络结构1、导入要的库2、创建自己的神经网络模型3、可视化神经网络结构图4、完整代码 Visualkeras介绍 Visualkeras是一…...
nvm安装nodejs/npm/nvm笔记
1 安装nvm, 指定路径nvm路径: D:\Program_Files\nvm\nvm指定路径nodejs 路径: D:\Program_Files\nvm\nodejs 2 进入nvm安装路径找到settings.xml文件,追加2行,设置镜像 node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: ht…...
微信小程序源码-基于Java后端的小区租拼车管理信息系统毕业设计(附源码+演示录像+LW)
大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设…...
嵌入式进阶——LED呼吸灯(PWM)
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 PWM基础概念STC8H芯片PWMA应用PWM配置详解占空比 PWM基础概念 PWM全称是脉宽调制(Pulse Width Modulation)…...
一文读懂:http免费升级https
背景: 随着现在全民网络安全意识的日益提升,各个网站需要实现的https数量也随之提升,那么如何将原本网站的http访问方式升级为https呢? 该内容为如何免费将网站的http访问升级为https访问 论https的加密逻辑: 步骤 …...
算法刷题笔记 高精度除法(C++实现)
文章目录 题目描述求解思路实现代码 题目描述 给定两个非负整数(不含前导0)A,B,请你计算 A/B 的商和余数。 输入格式 共两行,第一行包含整数A,第二行包含整数B。 输出格式 共两行,第一行输…...
按月爬取天气数据可视化展示
从天气网分析,可以查询每个月的天气情况,这里按照url规则,传入年月,获取数据,最后进行可视化展示,最终效果: 下面是获取过程: 第一步: import requestsdef get_weather(month):url = f"https://lishi.tianqi.com/nanning/{month}.html"response = reques…...
VMware安装Ubuntu系统(超详细)
一.Ubuntu官网下载镜像 Ubuntu官网:Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机(ControlN),这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…...
数据清洗操作及众所周知【数据分析】
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …...
炫酷gdb
在VS里面调试很方便对吧?(F5直接调试,F10逐过程调试--不进函数,F11逐语句调试--进函数,F9创建断点),那在Linux中怎么调试呢? 我们需要用到一个工具:gdb 我们知道VS中程…...
windows 7 10 11快捷键到启动页面
1.快速打开用户启动文件夹 shell:startup 方式2:快速打开系统启动文件夹 shell:Common Startup shell:Common Startup...
[处理器芯片]-6 超标量CPU实现之浮点运算
1 浮点运算单元FPU 超标量CPU中的浮点运算单元是专门处理浮点数运算的关键组件。浮点运算单元的设计涉及多个复杂的子模块和技术,以保证高效、准确地执行浮点数的加减法、乘法、除法、平方根等操作。 1)浮点数术语 浮点数通常采用IEEE 754标准表示&…...
又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。
总有自媒体人,为了些许流量,在大放厥词,说截个图给AI,AI就能输出前端代码,这是啥都敢说,吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图,你让AI生成代码,取代前…...
ISCC2024个人挑战赛WP-WEB
(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考) 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…...
Android 使用 adb 列出设备上所有危险权限
步骤1:确定 Android SDK 位置 打开 Android Studio 的设置,并来到 Languages & Frameworks › Android SDK 处: 这里可以看到 Android SDK 目录的位置: 例如:/Users/admin/Library/Android/sdk。 复制这个路径&am…...
Spring AOP源码分析
#### AOP(面向切面编程)作用及其优势 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强(通知) 优势:减少重复代码,提高代码复用性,提高代码可维护性…...
[LLM]从GPT-4o原理到下一代人机交互技术
一 定义 GPT-4o作为OpenAI推出的一款多模态大型语言模型,代表了这一交互技术的重要发展方向。 GPT-4o是OpenAI推出的最新旗舰级人工智能模型,它是GPT系列的一个重要升级,其中的"o"代表"Omni",中文意思是“全…...
【Spring】AOP——通知(Advice)
1、通知(Advice) 1.1简介 在AOP中,通知(Advice)是切面(Aspect)中的一部分,用于定义在连接点(Joinpoint)处应该执行的操作。通知类型可以在AOP框架中配置和使…...
python中的一些基础概念
在python中整型数据可以和浮点型数据相加,在python中字符串数据可以进行相加, 在python中整型数据可以和布尔类型进行算术运算。此时True当做1,False当做0但是这样的操作是没有意义的, python中只有字符串类型没有字符类型&…...
8.Redis之hash类型
1.hash类型的基本介绍 哈希表[之前学过的所有数据结构中,最最重要的] 1.日常开发中,出场频率非常高. 2.面试中,非常重要的考点, Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的 把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
