博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用NetworkX模块绘制深度神经网络(DNN)结构图
阅读量:5733 次
发布时间:2019-06-18

本文共 8053 字,大约阅读时间需要 26 分钟。

  本文将展示如何利用Python中的NetworkX模块来绘制深度神经网络(DNN)结构图。

  在文章中,我们创建的DNN结构图如下:

DNN结构示意图

该DNN模型由输入层、隐藏层、输出层和softmax函数组成,每一层的神经元个数分别为4,5,6,3,3。不知道聪明的读者有没有发现,这张示意图完全是由笔者自己用Python绘制出来的,因为并不存在现成的结构图。那么,如何利用Python来绘制出这种相对复杂的神经网络的示意图呢?答案是利用NetworkX模块。

NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便地进行复杂网络数据分析、仿真建模等工作。NetworkX支持创建简单无向图、有向图和多重图,内置许多标准的图论算法,节点可为任意数据,支持任意的边值维度,功能丰富,简单易用。

  首先,我们需要绘制出该DNN的大致框架,其Python代码如下:

# -*- coding:utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 创建DAGG = 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图plt.title('DNN for iris')    #图片标题nx.draw(        G,        node_color = 'red',             # 顶点颜色        edge_color = 'black',           # 边的颜色        with_labels = True,             # 显示顶点标签        font_size =10,                  # 文字大小        node_size =300                  # 顶点大小       )# 显示图片plt.show()

可以看到,我们在代码中已经设置好了这22个神经元以及它们之间的连接情况,但绘制出来的结构如却是这样的:

未标明位置的DNN结构图

这显然不是我们想要的结果,因为各神经的连接情况不明朗,而且很多神经都挤在了一起,看不清楚。之所以出现这种情况,是因为我们没有给神经元设置坐标,导致每个神经元都是随机放置的。

  接下来,引入坐标机制,即设置好每个神经元节点的坐标,使得它们的位置能够按照事先设置好的来放置,其Python代码如下:

# -*- coding:utf-8 -*-import networkx as nximport matplotlib.pyplot as plt# 创建DAGG = 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                  # 顶点大小       )# 显示图片plt.show()

可以看到,在代码中,通过pos字典已经规定好了每个神经元节点的位置,那么,绘制好的DNN结构示意图如下:

DNN模型的框架图

可以看到,现在这个DNN模型的结构已经大致显现出来了。

  接下来,我们需要对这个框架图进行更为细致地修改,需要修改的地方为:

  1. 去掉神经元节点的标签;
  2. 添加模型层的文字注释(比如Input layer).

其中,第二步的文字注释,我们借助opencv来完成。完整的Python代码如下:

# -*- coding:utf-8 -*-import cv2import networkx as nximport matplotlib.pyplot as plt# 创建DAGG = 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*480plt.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)

这样生成的图片就是文章最开始给出的DNN的结构示意图。Bingo,搞定!

转载地址:http://numwx.baihongyu.com/

你可能感兴趣的文章
python:redis简单操作
查看>>
ES6之Array数组
查看>>
使用wget镜像网站
查看>>
水晶报表的推拉模式的具体实现
查看>>
npm adduser报错问题
查看>>
JAVA 16(集合框架工具类)
查看>>
sqlserver中将查询结果拼接成字符串
查看>>
iptables命令使用详解
查看>>
iphone-common-codes-ccteam源代码 CCSqlite3.m
查看>>
Redis集群入门
查看>>
第七章12
查看>>
linux SA_RESTART的作用
查看>>
排序算法
查看>>
支持多个版本的ASP.NET Core Web API
查看>>
数字图像处理的Matlab实现(4)—灰度变换与空间滤波
查看>>
一些内存使用错误理解
查看>>
ehcache memcache redis 三大缓存男高音[转]
查看>>
<问题解决07>win10-64位第一次安装WampServer,启动后报计算机中丢失 MSVCR110.dll--解决方案如下:...
查看>>
java.lang.IllegalStateException
查看>>
navicat报错2005 - Unknown MySQL server host 'localhost' (0) 原因及解决方法
查看>>