如何画神经网络模型图

网络上确实有很多画神经网络图的方法,我是一个初学者,仅仅只有一点Python基础,下面记录一下我自己第一次画神经网络结构图的方法和踩过的坑。

我的办法

按照网上各路大神提供的资料,我首先 尝试了graphviz,但是在安装成功后,尝试了网上的一个现成的代码。

digraph G {
	rankdir=LR
	splines=line
	nodesep=.05;
	node [label=""];

	subgraph cluster_0 {
	 color=white;
	 node [style=solid,color=blue4, shape=circle];
	 x1 x2 x3;
	 label = "layer 1";
	}

	subgraph cluster_1 {
	 color=white;
	 node [style=solid,color=red2, shape=circle];
	 a12 a22 a32 a42 a52;
	 label = "layer 2";
	}

	subgraph cluster_2 {
	 color=white;
	 node [style=solid,color=red2, shape=circle];
	 a13 a23 a33 a43 a53;
	 label = "layer 3";
	}

	subgraph cluster_3 {
	 color=white;
	 node [style=solid,color=seagreen2, shape=circle];
	 O1 O2 O3 O4;
	 label="layer 4";
	}

	x1 -> a12
	x1 -> a22
	x1 -> a32
	x1 -> a42
	x1 -> a52

	x2 -> a12
	x2 -> a22
	x2 -> a32
	x2 -> a42
	x2 -> a52

	x3 -> a12
	x3 -> a22
	x3 -> a32
	x3 -> a42
	x3 -> a52

	a12 -> a13
	a22 -> a13
	a32 -> a13
	a42 -> a13
	a52 -> a13

	a12 -> a23
	a22 -> a23
	a32 -> a23
	a42 -> a23
	a52 -> a23

	a12 -> a33
	a22 -> a33
	a32 -> a33
	a42 -> a33
	a52 -> a33

	a12 -> a43
	a22 -> a43
	a32 -> a43
	a42 -> a43
	a52 -> a43

	a12 -> a53
	a22 -> a53
	a32 -> a53
	a42 -> a53
	a52 -> a53

	a13 -> O1
	a23 -> O1
	a33 -> O1
	a43 -> O1
	a53 -> O1

	a13 -> O2
	a23 -> O2
	a33 -> O2
	a43 -> O2
	a53 -> O2

	a13 -> O3
	a23 -> O3
	a33 -> O3
	a43 -> O3
	a53 -> O3

	a13 -> O4
	a23 -> O4
	a33 -> O4
	a43 -> O4
	a53 -> O4
}

我配置好graphviz的开发环境之后,尝试着运行这个代码,但是提示语法错误。因为我没有从网上找到解决办法,自己也不会语法,就放弃了这个办法。

#########################################################################
之后我尝试了networkx + matplotlib,配置了这个需要的开发环境,也找到了可以顺利运行的代码:

import networkx as nx
import matplotlib.pyplot as plt
 
# 创建DAG
G = nx.DiGraph()
 
# 顶点列表
vertex_list = ['v'+str(i) for i in range(1, 22)]
# 添加顶点
G.add_nodes_from(vertex_list)
 
# 边列表
edge_list = [
             ('v1', 'v5'), ('v1', 'v6'), ('v1', 'v7'),('v1', 'v8'),('v1', 'v9'),
             ('v2', 'v5'), ('v2', 'v6'), ('v2', 'v7'),('v2', 'v8'),('v2', 'v9'),
             ('v3', 'v5'), ('v3', 'v6'), ('v3', 'v7'),('v3', 'v8'),('v3', 'v9'),
             ('v4', 'v5'), ('v4', 'v6'), ('v4', 'v7'),('v4', 'v8'),('v4', 'v9'),
             ('v5','v10'),('v5','v11'),('v5','v12'),('v5','v13'),('v5','v14'),('v5','v15'),
             ('v6','v10'),('v6','v11'),('v6','v12'),('v6','v13'),('v6','v14'),('v6','v15'),
             ('v7','v10'),('v7','v11'),('v7','v12'),('v7','v13'),('v7','v14'),('v7','v15'),
             ('v8','v10'),('v8','v11'),('v8','v12'),('v8','v13'),('v8','v14'),('v8','v15'),
             ('v9','v10'),('v9','v11'),('v9','v12'),('v9','v13'),('v9','v14'),('v9','v15'),
             ('v10','v16'),('v10','v17'),('v10','v18'),
             ('v11','v16'),('v11','v17'),('v11','v18'),
             ('v12','v16'),('v12','v17'),('v12','v18'),
             ('v13','v16'),('v13','v17'),('v13','v18'),
             ('v14','v16'),('v14','v17'),('v14','v18'),
             ('v15','v16'),('v15','v17'),('v15','v18'),
             ('v16','v19'),
             ('v17','v20'),
             ('v18','v21')
            ]
# 通过列表形式来添加边
G.add_edges_from(edge_list)
 
# 指定绘制DAG图时每个顶点的位置
pos = {
        'v1':(-2,1.5),
        'v2':(-2,0.5),
        'v3':(-2,-0.5),
        'v4':(-2,-1.5),
        'v5':(-1,2),
        'v6': (-1,1),
        'v7':(-1,0),
        'v8':(-1,-1),
        'v9':(-1,-2),
        'v10':(0,2.5),
        'v11':(0,1.5),
        'v12':(0,0.5),
        'v13':(0,-0.5),
        'v14':(0,-1.5),
        'v15':(0,-2.5),
        'v16':(1,1),
        'v17':(1,0),
        'v18':(1,-1),
        'v19':(2,1),
        'v20':(2,0),
        'v21':(2,-1)
       }
# 绘制DAG图
plt.title('DNN for iris')    #图片标题
plt.xlim(-2.2, 2.2)                     #设置X轴坐标范围
plt.ylim(-3, 3)                     #设置Y轴坐标范围
nx.draw(
        G,
        pos = pos,                      # 点的位置
        node_color = 'red',             # 顶点颜色
        edge_color = 'black',           # 边的颜色
        with_labels = True,             # 显示顶点标签
        font_size =10,                  # 文字大小
        node_size =300                  # 顶点大小
       )

###############################################################################
import cv2
import networkx as nx
import matplotlib.pyplot as plt
 
# 创建DAG
G = nx.DiGraph()
 
# 顶点列表
vertex_list = ['v'+str(i) for i in range(1, 22)]
# 添加顶点
G.add_nodes_from(vertex_list)
 
# 边列表
edge_list = [
             ('v1', 'v5'), ('v1', 'v6'), ('v1', 'v7'),('v1', 'v8'),('v1', 'v9'),
             ('v2', 'v5'), ('v2', 'v6'), ('v2', 'v7'),('v2', 'v8'),('v2', 'v9'),
             ('v3', 'v5'), ('v3', 'v6'), ('v3', 'v7'),('v3', 'v8'),('v3', 'v9'),
             ('v4', 'v5'), ('v4', 'v6'), ('v4', 'v7'),('v4', 'v8'),('v4', 'v9'),
             ('v5','v10'),('v5','v11'),('v5','v12'),('v5','v13'),('v5','v14'),('v5','v15'),
             ('v6','v10'),('v6','v11'),('v6','v12'),('v6','v13'),('v6','v14'),('v6','v15'),
             ('v7','v10'),('v7','v11'),('v7','v12'),('v7','v13'),('v7','v14'),('v7','v15'),
             ('v8','v10'),('v8','v11'),('v8','v12'),('v8','v13'),('v8','v14'),('v8','v15'),
             ('v9','v10'),('v9','v11'),('v9','v12'),('v9','v13'),('v9','v14'),('v9','v15'),
             ('v10','v16'),('v10','v17'),('v10','v18'),
             ('v11','v16'),('v11','v17'),('v11','v18'),
             ('v12','v16'),('v12','v17'),('v12','v18'),
             ('v13','v16'),('v13','v17'),('v13','v18'),
             ('v14','v16'),('v14','v17'),('v14','v18'),
             ('v15','v16'),('v15','v17'),('v15','v18'),
             ('v16','v19'),
             ('v17','v20'),
             ('v18','v21')
            ]
# 通过列表形式来添加边
G.add_edges_from(edge_list)
 
# 指定绘制DAG图时每个顶点的位置
pos = {
        'v1':(-2,1.5),
        'v2':(-2,0.5),
        'v3':(-2,-0.5),
        'v4':(-2,-1.5),
        'v5':(-1,2),
        'v6': (-1,1),
        'v7':(-1,0),
        'v8':(-1,-1),
        'v9':(-1,-2),
        'v10':(0,2.5),
        'v11':(0,1.5),
        'v12':(0,0.5),
        'v13':(0,-0.5),
        'v14':(0,-1.5),
        'v15':(0,-2.5),
        'v16':(1,1),
        'v17':(1,0),
        'v18':(1,-1),
        'v19':(2,1),
        'v20':(2,0),
        'v21':(2,-1)
       }
# 绘制DAG图
plt.title('DNN for iris')    #图片标题
plt.xlim(-2.2, 2.2)                     #设置X轴坐标范围
plt.ylim(-3, 3)                     #设置Y轴坐标范围
nx.draw(
        G,
        pos = pos,                      # 点的位置
        node_color = 'red',             # 顶点颜色
        edge_color = 'black',           # 边的颜色
        font_size =10,                  # 文字大小
        node_size =300                  # 顶点大小
       )
 
# 保存图片,图片大小为640*480
plt.savefig('E://data/DNN_sketch.png')
 
# 利用opencv模块对DNN框架添加文字注释
 
# 读取图片
imagepath = 'E://data/DNN_sketch.png'
image = cv2.imread(imagepath, 1)
 
# 输入层
cv2.rectangle(image, (85, 130), (120, 360), (255,0,0), 2)
cv2.putText(image, "Input Layer", (15, 390), 1, 1.5, (0, 255, 0), 2, 1)
 
# 隐藏层
cv2.rectangle(image, (190, 70), (360, 420), (255,0,0), 2)
cv2.putText(image, "Hidden Layer", (210, 450), 1, 1.5, (0, 255, 0), 2, 1)
 
# 输出层
cv2.rectangle(image, (420, 150), (460, 330), (255,0,0), 2)
cv2.putText(image, "Output Layer", (380, 360), 1, 1.5, (0, 255, 0), 2, 1)
 
# sofrmax层
cv2.rectangle(image, (530, 150), (570, 330), (255,0,0), 2)
cv2.putText(image, "Softmax Func", (450, 130), 1, 1.5, (0, 0, 255), 2, 1)
 
# 保存修改后的图片
cv2.imwrite('E://data/DNN.png', image)

运行也没有问题,但是我们写论文画神经网络图有自己的要求,需要一定的编程技术来需改程序,可惜我的编程能力只是菜鸟吧。

#########################################################################
终极大招
processon 这个网站是一个可以免费在线画图的网页,最终在免费模板的基础上画出了自己的神经网络图。在这里插入图片描述
关于前面碰到的问题,如果有大佬路过,还请大佬指点一二。最后还是感谢大家的阅读,要是能点赞收藏一二就更完美了。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值