使用PlotNeuralNet绘制深度学习网络图

PlotNeuralNet源代码链接:https://github.com/HarisIqbal88/PlotNeuralNet
网上找了很多画深度学习网络图的方法,发现这个PlotNeuralNet的颜值与实用性比较出色,只是需要进行编程,但是对于搞深度学习的人来说,问题应该不大。

先展示几张PlotNeuralNet画的效果图:
FCN-8网络图
Holistically-Nested Edge Detection
在GitHub上的源码中有所依赖软件安装步骤,本人的电脑是window10系统,需要安装两个小软件,我把链接稍微贴一下(PlotNeuralNet的GitHub页面上也有,可以去那找)。

  1. Download and install MikTeX(https://miktex.org/download),下载MikTeX软件,这是一个对文字、公式、图片进行排版能生成PDF的软件,写过英文论文的可能接触过。下载安装包,按提示进行安装即可。
    MikTeX
  2. Download and install bash runner on Windows, recommends Git bash or
    Cygwin
    下载Git bash或者Cygwin两者之一就行。我只试了Git Bash。

软件安好了后,打开Git Bash,使用cd 命令将工作路径转到PlotNeuralNet所在的路径下。可以用 ls 看到PlotNeuralNet下的目录结构。
在这里插入图片描述
我们先来看一个例子:
将工作路径转到 PlotNeuralNet/pyexamples,可以看到里面有个 test_simple.py 文件。里面有个test_simple.pdf文件,是发布者上传的,你可以提前删除它。
在这里插入图片描述
运行命令:

bash ../tikzmake.sh test_simple

注意test_simple后不加.py后缀,等程序运行结束,可以在 PlotNeuralNet/pyexamples目录下看到新生成的test_simple.pdf文件。

!!!有时因为该文件夹下已有你要创建的文件的同名文件,这时候会报个错,并让你重新输一个名字,随便输入一个文件名,按回车即可。
在这里插入图片描述
在这里插入图片描述
这就是PlotNeuralNet自动生成的网络图。

下面的任务就是利用给的这个例子,我们来画自己的网络图,我们先整体看一下 test_simple.py 代码的内容。代码中给出了我的注释。

import sys
sys.path.append('../')
#pycore.tikzeng是发布者写的python接口,可以直接调用里面的函数来就行绘图,本博客末尾有解释
from pycore.tikzeng import *

#定义自己的网络图结构
arch = [
	"""
	前三行是一个初始化的过程,以后写自己的网络图照抄上去就行
	"""
    to_head( '..' ),
    to_cor(),
    to_begin(),
    
    #添加一个卷积层conv1
    to_Conv("conv1", 512, 64, offset="(0,0,0)", to="(0,0,0)", height=64, depth=64, width=2 ),
    #添加一个池化层pool1
    to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)"),
    #添加一个卷积层conv2
    to_Conv("conv2", 128, 64, offset="(1,0,0)", to="(pool1-east)", height=32, depth=32, width=2 ),
     #添加一个连接线,在pool1和conv2之间
    to_connection( "pool1", "conv2"), 
    #添加一个池化层pool2
    to_Pool("pool2", offset="(0,0,0)", to="(conv2-east)", height=28, depth=28, width=1),
    #添加一个softmax层soft1
    to_SoftMax("soft1", 10 ,"(3,0,0)", "(pool1-east)", caption="SOFT"  ),
    #添加一个连接线,在pool2和soft1之间
    to_connection("pool2", "soft1"), 
    #添加一个 “+” 按钮sum1
    to_Sum("sum1", offset="(1.5,0,0)", to="(soft1-east)", radius=2.5, opacity=0.6),
    #添加一个连接线,在soft1和sum1之间
    to_connection("soft1", "sum1"),
    #结束
    to_end()
    ]

#后面的东西在自己画图是直接粘贴过去就行
def main():
    namefile = str(sys.argv[0]).split('.')[0]
    to_generate(arch, namefile + '.tex' )

if __name__ == '__main__':
    main()

下面对其中我认为重要的代码逐一进行一个详细的分析。

  • 有时会在网络头部加上一张图片,PlotNeuralNet中也可以做到,
    用to_input()函数。
#####################################################################
# 添加输入的图像到网络头部,使用函数to_input
# to_input(pathfile,to='(-3,0,0)', width=8, height=8, name="temp")
# pathfile--输入图片的路径,
# to="(-3,0,0)"--输入图片的坐标(x,y,z),
# width=16,height=16--图片显示时的宽和高,根据需要自己调节
# name--指名称
# 这行代码紧跟前三行的后面
#####################################################################
to_input('1.jpg',width=8, height=8),

在这里插入图片描述

  • 卷积层添加
#####################################################################
# 添加卷积层
# to_Conv(name,s_filer=256,n_filer=64,offset="(0,0,0)",to="(0,0,0)",width=1,height=40, depth=40, caption=" ")
# name--名称
# s_filer--卷积层图像尺寸
# n_filer--卷积层图像深度(通道数)
# s_filer、n_filer指卷积层结构的参数,并非制图时的尺寸
# offset--与前一层分别在x,y,z方向的距离
# to--在x,y,z方向的坐标,
# offset、to的在后面会深入讲,你可以自己该不同的值试验一下,找规律
# width--制图时的厚度
# height、depth--制图时的长宽
# width、height、depth指在制图时,卷积层的尺寸
# caption--备注信息
#####################################################################
to_Conv("conv1", 512, 64, offset="(0,0,0)", to="(0,0,0)", height=64, depth=64, width=2 ),

效果图
在这里插入图片描述
注意一下,s_filer,n_filer指的是你在图中标注的尺寸大小,width,height, depth指的是在图中图形显示的实际厚、长与深度(宽)。

添加池化层的代码和参数如下:

#####################################################################
# 添加池化层
# to_Pool(name,offset="(0,0,0)",to="(0,0,0)",width=1,height=32,depth=32,opacity=0.5,caption=" ")
# 部分参数与卷积层相同
# opacity--透明度,0-1之间
# to="(conv1-east)"--在con1层的东侧
#####################################################################
to_Pool("pool1", offset="(0,0,0)",to="(conv1-east)",width=1, height=64, depth=64,opacity=0.9),

效果图:
在这里插入图片描述
在这里,着重讲一下offset、to这两个参数,使用它们可以调整层对应的位置:
to–在x,y,z方向的坐标,to="(conv1-east)"–可以表示在con1层的正东侧(放在平面上理解是右边,根据个人理解吧),
通过offset的值获取偏移的距离,to的值可以体现相对于谁来进行偏移。比如:offset="(0,0,0)",to="(conv1-east)"
来看下这个代码,猜猜是什么效果:

to_Conv("conv1", 512, 64, offset="(0,0,0)", to="(0,0,0)", height=64, depth=64, width=2 ),
to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)"),
to_Conv("conv2", 512, 64, offset="(5,0,0)", to="(0,0,0)", height=64, depth=64, width=2 ),
to_Pool("pool2", offset="(5,0,0)", to="(conv2-east)"),

这里创建了依次创建了卷积层conv1、池化层pool1、卷积层conv2、池化层pool2。
pool1在conv1的正东侧,偏移offset为0;
conv2在位置(0,0,0)(这里的坐标还没弄太明白,但是影响也不太大,等以后再进行研究一下,有大佬了解也请指点)处,相对偏移offset(5,0,0),即在x方向(水平向右为x的正方向)平移5个单位(单位是啥不太清楚);
pool2在conv2的正东侧,x方向上偏移offset为0。如下图所示:
在这里插入图片描述
有时候网络图并不是直线型的,需要有多尺度下采样啥的,也可以用offset来实现,举了个小例子,懂了原理后,可以自由发挥:

to_Conv("conv1", 512, 64, offset="(0,0,0)", to="(0,0,0)", height=64, depth=64, width=2 ),
to_Pool("pool1", offset="(0,0,0)", to="(conv1-east)"),
to_Conv("conv2", 512, 64, offset="(5,-10,0)", to="(conv1-east)", height=64, depth=64, width=2 ),
to_Pool("pool2", offset="(0,0,0)", to="(conv2-east)"),

效果图:
在这里插入图片描述
此外,层与层之间需要带箭头的线来连接,可以用到两个函数,比较简单:
to_connection()
to_skip()

#水平连接,参数为:起始位置、中止位置
to_connection("pool1", "conv2"),
to_connection("conv2","pool2"),
#跨连接,参数为:起始位置、中止位置,pos默认为1.25,可以自己调一调试试啥效果
to_skip(of = "pool1",to = "pool2",pos=1.25),

在这里插入图片描述

有了这些基本的认识,来画出一张简单的网络图来说问题就不大了。
这些函数都是在路径 :PlotNeuralNet-master\pycore下的tikzeng.py与blocks.py中,博客中未提及的函数可以从tikzeng.py与blocks.py找到,对于每个函数自己都可以试一试,熟悉熟悉就会了,还可以自己定义自己的函数,方便用来画图。
在这里插入图片描述

参考博客:https://blog.csdn.net/qq_43790749/article/details/110590396?spm=1001.2014.3001.5502

  • 32
    点赞
  • 201
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
PlotNeuralNet是一个用于绘制卷积神经网络的Python库。通过使用该库,您可以轻松地创建漂亮的卷积神经网络结构。您可以使用PlotNeuralNet的API来定义网络的每个层次和连接。具体步骤如下: 1. 首先,安装PlotNeuralNet库。您可以在中找到面向Python的PlotNeuralNet教程,其中提供了详细的安装说明和使用示例。 2. 导入PlotNeuralNet库并创建一个新的网络图对象。 3. 使用API定义网络的每个层次。您可以使用PlotNeuralNet提供的各种函数来添加卷积层、池化层、全连接层等。根据您的网络结构和需求,您可以自由地调整每个层次的参数。 4. 使用API定义网络的连接。您可以使用PlotNeuralNet提供的函数来定义网络中每个层次之间的连接关系。您可以指定连接的输入和输出层次以及连接的类型(如卷积连接、池化连接等)。 5. 最后,使用API绘制网络图。您可以使用PlotNeuralNet提供的函数将网络图绘制像文件或在Jupyter Notebook中显示。 具体的使用示例可以在和中找到。这些示例提供了使用PlotNeuralNet绘制卷积神经网络的代码和详细说明。 综上所述,您可以使用PlotNeuralNet库的API来绘制卷积神经网络结构。通过定义每个层次和连接,您可以创建自定义的网络图,并使用提供的函数将其绘制出来。 参考文献: 面向Python的PlotNeuralNet教程 使用PlotNeuralNet绘制深度学习网络图 【论文作使用PlotNeuralNet绘制卷积神经网络——以VGG-F为例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值