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

您所在的位置:网站首页 latex绘制ppt 使用PlotNeuralNet绘制深度学习网络图

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

2023-08-16 03:53| 来源: 网络整理| 查看: 265

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

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

Download and install MikTeX(https://miktex.org/download),下载MikTeX软件,这是一个对文字、公式、图片进行排版能生成PDF的软件,写过英文论文的可能接触过。下载安装包,按提示进行安装即可。 MikTeXDownload 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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3