卷积神经网络结构可视化工具PlotNeuralNet
卷积神经网络结构可视化
简介
本文介绍的工具是针对卷积神经网络示意图可视化的,不包括算图。(示意图一般出现在论文中)常见的卷积神经网络示意图绘制工具不少,常用的主要有NN SVG、ConvNetDraw、PlotNeuralNet等。写这篇重点介绍PlotNeuralNet的教程的原因是国内关于它的教程很少并且大都只是列举了官方demo。个人觉得PlotNeuralNet是很好看、可定制程度高的卷积神经网络可视化工具。
常见工具
NN SVG
这是我过去一段时间内比较喜欢用的,特点是很方便,提供给用户的是个交互式的Web页面。可以访问 官方地址使用该工具,网站首页截图如下。
该工具的主要特点如下。
- 方便,各层直接界面控制增减及变化。
- 支持三种风格,选择空间大。
- 支持SVG格式下载。
缺点如下
- 可视化界面的最大问题就是很多用户期待的功能为考虑全面,定制程度低。
- 各层连接不是很美观。
ConvNetDraw
我从未使用过,很多博主推荐,但是观感劝退了我。其官方地址可以访问使用,首页截图如下。
特点如下。
- 脚本化控制
- 尺度自定义
- 直观
缺点如下。
- 既没有做到脚本化的自由度,又没有做到交互界面的观感。
- 不好看。
PlotNeuralNet
可以访问其Github官方地址下载该工具。
下面呈现的是前馈网络的示意图。
这是我极力推荐的工具,尽管它的上手难度略高于之前两个,但学会之后很好用,不少论文就是使用这个工具可视化的。
其主要特点如下。
- 脚本化,使用LaTex编写或者使用Python脚本编写结构模型,自由度高。
相关缺点如下。
- 无交互界面,上手略有难度。
使用教程
说明
基于Linux或者有bash的环境,我只在Ubuntu系统下测试成功。(事实上,深度学习首选的环境之一就是Ubuntu。)这里只介绍Python脚本绘制的方式,不介绍LaTex方式。需要安装前置软件,如LaTex解析器(推荐安装texlive。)。
前置准备
安装textlive
调用LaTex解析生成PDF,需要安装LaTex,这里使用TextLive。可以使用清华的镜像源下载,Linux环境下执行下面的命令即可。该命令为下载镜像到当前目录,失败则可能换源,去掉上述链接的最后文件,在浏览器中查看合适文件下载即可。
wget https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/Images/texlive2019.iso
其他相关软件包安装
sudo apt-get install perl-tk
- 安装图形界面
sudo mount -o loop texlive.iso /mnt
- 挂载镜像
cd /mnt
- 切换到挂载目录
sudo ./install-tl -gui
- 使用图形界面安装
sudo apt-get install texlive-latex-extra
- 安装扩展包
下载源码
使用Git将源码仓库clone到本地,命令如下。
git clone https://github.com/HarisIqbal88/PlotNeuralNet.git
源码目录结构
其中pycore下的tikzeng.py是核心文件,定义了绘图过程(所有to开头的函数),可以绘制的层,py脚本向LaTex的转换。代码比较易懂,这里不做解析了。
绘制图形
一般将自己写的py脚本放在clone的项目的pyexamples目录下。源目录下有两个py脚本,对其进行详细注释,包含了常用的语法。
代码1-test_simple.py
通过cd到pyexamples目录执行bash ../tikzmake.sh test_simple
(注意不加py后缀,且有些错误或者警告正常,观察是否生成pdf文件即可。)具体代码如下。
import sys
sys.path.append('../') # 添加自定义库的目录
from pycore.tikzeng import * # 导入自定义库# defined your arch
arch = [# 添加头to_head( '..' ),to_cor(),to_begin(),# 添加卷积层conv1to_Conv("conv1", 512, 64, offset="(0,0,0)", to="(0,0,0)", height=64, depth=64, width=2 ),# 卷积层conv1东侧添加池化层pool1to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)"),# 池化层pool1东侧添加卷积层conv2to_Conv("conv2", 128, 64, offset="(1,0,0)", to="(pool1-east)", height=32, depth=32, width=2 ),# 建立pool1到conv2的连接箭头to_connection( "pool1", "conv2"), # conv2东侧添加pool2to_Pool("pool2", offset="(0,0,0)", to="(conv2-east)", height=28, depth=28, width=1),# pool1东侧添加softmax层但是偏移3单位to_SoftMax("soft1", 10 ,"(3,0,0)", "(pool1-east)", caption="SOFT" ),# 建立pool2到soft1的连接箭头to_connection("pool2", "soft1"), # 结束to_end()]def main():namefile = str(sys.argv[0]).split('.')[0]to_generate(arch, namefile + '.tex' )if __name__ == '__main__':main()
生成的PDF如下。
代码2-unet.py
具体代码如下。
import sys
sys.path.append('../')
from pycore.tikzeng import *
from pycore.blocks import *arch = [ # 开头to_head('..'), to_cor(),to_begin(),# 添加输入层to_input( '../examples/fcn8s/cats.jpg' ),# 添加block1包含一个二重卷积接reluto_ConvConvRelu( name='ccr_b1', s_filer=500, n_filer=(64,64), offset="(0,0,0)", to="(0,0,0)", width=(2,2), height=40, depth=40 ),to_Pool(name="pool_b1", offset="(0,0,0)", to="(ccr_b1-east)", width=1, height=32, depth=32, opacity=0.5),# 添加三个block,每个包含三个二卷积加一池化*block_2ConvPool( name='b2', botton='pool_b1', top='pool_b2', s_filer=256, n_filer=128, offset="(1,0,0)", size=(32,32,3.5), opacity=0.5 ),*block_2ConvPool( name='b3', botton='pool_b2', top='pool_b3', s_filer=128, n_filer=256, offset="(1,0,0)", size=(25,25,4.5), opacity=0.5 ),*block_2ConvPool( name='b4', botton='pool_b3', top='pool_b4', s_filer=64, n_filer=512, offset="(1,0,0)", size=(16,16,5.5), opacity=0.5 ),# 瓶颈,为block5to_ConvConvRelu( name='ccr_b5', s_filer=32, n_filer=(1024,1024), offset="(2,0,0)", to="(pool_b4-east)", width=(8,8), height=8, depth=8, caption="Bottleneck" ),to_connection( "pool_b4", "ccr_b5"),# 解码器# 多个block,每个为unconv*block_Unconv( name="b6", botton="ccr_b5", top='end_b6', s_filer=64, n_filer=512, offset="(2.1,0,0)", size=(16,16,5.0), opacity=0.5 ),to_skip( of='ccr_b4', to='ccr_res_b6', pos=1.25),*block_Unconv( name="b7", botton="end_b6", top='end_b7', s_filer=128, n_filer=256, offset="(2.1,0,0)", size=(25,25,4.5), opacity=0.5 ),to_skip( of='ccr_b3', to='ccr_res_b7', pos=1.25), *block_Unconv( name="b8", botton="end_b7", top='end_b8', s_filer=256, n_filer=128, offset="(2.1,0,0)", size=(32,32,3.5), opacity=0.5 ),to_skip( of='ccr_b2', to='ccr_res_b8', pos=1.25), *block_Unconv( name="b9", botton="end_b8", top='end_b9', s_filer=512, n_filer=64, offset="(2.1,0,0)", size=(40,40,2.5), opacity=0.5 ),to_skip( of='ccr_b1', to='ccr_res_b9', pos=1.25),to_ConvSoftMax( name="soft1", s_filer=512, offset="(0.75,0,0)", to="(end_b9-east)", width=1, height=40, depth=40, caption="SOFT" ),to_connection( "end_b9", "soft1"),# 结束to_end() ]def main():namefile = str(sys.argv[0]).split('.')[0]to_generate(arch, namefile + '.tex' )if __name__ == '__main__':main()
其执行结果如下图。
补充说明
封装的各类层函数都在tikzeng.py文件中,可以修改并使用。具体的代码和结果可以在我的Github找到,欢迎star或者fork。实际项目请按照官方项目更新为主。
卷积神经网络结构可视化工具PlotNeuralNet相关推荐
- 卷积神经网络结构_卷积神经网络
卷积神经网络结构 CNN's are a special type of ANN which accepts images as inputs. Below is the representation ...
- 卷积神经网络结构优化综述
卷积神经网络结构优化综述 人工智能技术与咨询 来源:<自动化学报> ,作者林景栋等 摘 要 近年来,卷积神经网络(Convolutional neural network,CNNs)在计算 ...
- 【卷积神经网络结构专题】经典网络结构之VGG(附代码实现)
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第三篇文章,前面我们先后介绍了LeNet和A ...
- 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...
- 【卷积神经网络结构专题】一文详解LeNet(附代码实现)
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 近期,公众号将推出卷积神经网络结构系列专题文章,将深入浅出的为大家介绍从1998年 ...
- 深度学习之卷积神经网络(2)卷积神经网络结构
深度学习之卷积神经网络(2)卷积神经网络结构 1. 单通道输入和单卷积核 2. 多通道输入和单卷积核 3. 多通道输入.多卷积核 4. 步长 5. 填充 卷积神经网络通过充分利用局部相关性和权值共享 ...
- 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构
目录 一.AlexNet卷积神经网络结构模型 1.数据库ImageNet 2.AlexNet第一层卷积层 二.AlexNet卷积神经网络的改进 1.非线性变化函数的改变--ReLU 2.最大池化(Ma ...
- 机器学习——深度学习之卷积神经网络(CNN)——LeNet卷积神经网络结构
目录 一.卷积神经网络 1.卷积神经的作用 2.LeNet 1)数据库准备--minst 2)模型· 二.关于卷积神经网络结构的一些术语定义 1.特征图(Feature map) 2.height(长 ...
- 神经网络模型可视化工具 Netron | 每日工具推荐
今天要给大家介绍的是神经网络模型可视化工具 Netron,Netron 支持 ONNX, TensorFlow Lite, Keras, Caffe, Darknet, ncnn, MNN, Padd ...
最新文章
- python commands_python commands模块在python3.x被subprocess取代
- 私有云存储搭建(owncloud)
- AI理论知识整理(15)-行列式
- android 自定义背景园,Android 自定义ProgressBar 进度条颜色和背景颜色
- 区块链的安全和智能合约
- Node.js module.exports与导出
- git rollback代码都没了_ECBM库也能自动更新吗?——论GIT的用法
- 数据类型的提升(promotion)
- 01我为什么学Unity3d
- 安装APK时INSTALL_FAILED_ALREADY_EXISTS的解决办法
- 消费信贷 开源数据_消费或发布开源软件的6大动机
- 在vpp中做nat实验
- h5 前端 PHP,十分钟搞定微信H5支付(ThinkPHP5.1)
- 服务器系统封装iso,轻松几步 封装Windows系统镜像
- NAR:MicrobiomeAnalyst微生物组分析师——统计、可视化和元分析微生物组数据的网页工具
- Android studio最新版2021安装教程超详细。
- FZU - 1759 Problem 1759 Super A^B mod C 欧拉降幂公式
- 判断虚拟键盘是删除键的方法
- css如何选择同一个class下的第一个div?
- 春招+秋招面试经历汇总,今天我们聊聊程序员应该进大厂还是国企(Java后端方向)