卷积神经网络结构可视化

简介

本文介绍的工具是针对卷积神经网络示意图可视化的,不包括算图。(示意图一般出现在论文中)常见的卷积神经网络示意图绘制工具不少,常用的主要有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相关推荐

  1. 卷积神经网络结构_卷积神经网络

    卷积神经网络结构 CNN's are a special type of ANN which accepts images as inputs. Below is the representation ...

  2. 卷积神经网络结构优化综述

    卷积神经网络结构优化综述 人工智能技术与咨询 来源:<自动化学报> ,作者林景栋等 摘 要 近年来,卷积神经网络(Convolutional neural network,CNNs)在计算 ...

  3. 【卷积神经网络结构专题】经典网络结构之VGG(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第三篇文章,前面我们先后介绍了LeNet和A ...

  4. 【卷积神经网络结构专题】一文详解AlexNet(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! [导读]本文是卷积神经网络结构系列专题第二篇文章,前面我们已经介绍了第一个真正意义 ...

  5. 【卷积神经网络结构专题】一文详解LeNet(附代码实现)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 近期,公众号将推出卷积神经网络结构系列专题文章,将深入浅出的为大家介绍从1998年 ...

  6. 深度学习之卷积神经网络(2)卷积神经网络结构

    深度学习之卷积神经网络(2)卷积神经网络结构 1. 单通道输入和单卷积核 2. 多通道输入和单卷积核 3. 多通道输入.多卷积核 4. 步长 5. 填充  卷积神经网络通过充分利用局部相关性和权值共享 ...

  7. 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构

    目录 一.AlexNet卷积神经网络结构模型 1.数据库ImageNet 2.AlexNet第一层卷积层 二.AlexNet卷积神经网络的改进 1.非线性变化函数的改变--ReLU 2.最大池化(Ma ...

  8. 机器学习——深度学习之卷积神经网络(CNN)——LeNet卷积神经网络结构

    目录 一.卷积神经网络 1.卷积神经的作用 2.LeNet 1)数据库准备--minst 2)模型· 二.关于卷积神经网络结构的一些术语定义 1.特征图(Feature map) 2.height(长 ...

  9. 神经网络模型可视化工具 Netron | 每日工具推荐

    今天要给大家介绍的是神经网络模型可视化工具 Netron,Netron 支持 ONNX, TensorFlow Lite, Keras, Caffe, Darknet, ncnn, MNN, Padd ...

最新文章

  1. python commands_python commands模块在python3.x被subprocess取代
  2. 私有云存储搭建(owncloud)
  3. AI理论知识整理(15)-行列式
  4. android 自定义背景园,Android 自定义ProgressBar 进度条颜色和背景颜色
  5. 区块链的安全和智能合约
  6. Node.js module.exports与导出
  7. git rollback代码都没了_ECBM库也能自动更新吗?——论GIT的用法
  8. 数据类型的提升(promotion)
  9. 01我为什么学Unity3d
  10. 安装APK时INSTALL_FAILED_ALREADY_EXISTS的解决办法
  11. 消费信贷 开源数据_消费或发布开源软件的6大动机
  12. 在vpp中做nat实验
  13. h5 前端 PHP,十分钟搞定微信H5支付(ThinkPHP5.1)
  14. 服务器系统封装iso,轻松几步 封装Windows系统镜像
  15. NAR:MicrobiomeAnalyst微生物组分析师——统计、可视化和元分析微生物组数据的网页工具
  16. Android studio最新版2021安装教程超详细。
  17. FZU - 1759 Problem 1759 Super A^B mod C 欧拉降幂公式
  18. 判断虚拟键盘是删除键的方法
  19. css如何选择同一个class下的第一个div?
  20. 春招+秋招面试经历汇总,今天我们聊聊程序员应该进大厂还是国企(Java后端方向)

热门文章

  1. 区域数据导入功能(POI使用方式)
  2. 角色操作-角色添加代码实现
  3. php 正则表达式 x,php – 匹配x正则表达式或y正则表达式
  4. maven各个属性参数详解
  5. 这10道Java面试题!大部分的人回答不出来
  6. 多重循环控制(难点重点)
  7. 测试音质好坏的软件,音响音质的好坏简单的两招测出
  8. 01LaTeX学习系列之---TeX的介绍与认识
  9. 服务化改造实践 | 如何在 Dubbo 中支持 REST 1
  10. Trustdata:映客直播站稳行业第一梯队 用户粘性增长明显