日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用NetworkX绘制深度神经网络结构图(Python)

發布時間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用NetworkX绘制深度神经网络结构图(Python) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文將展示如何利用Python中的NetworkX模塊來繪制深度神經網絡(DNN)結構圖。

已知我們創建的DNN結構圖如下:

該DNN模型由輸入層、隱藏層、輸出層和softmax函數組成,每一層的神經元個數分別為4,5,6,3,3。不知道聰明的讀者有沒有發現,這張示意圖完全是由筆者自己用Python繪制出來的,因為并不存在現成的結構圖。那么,如何利用Python來繪制出這種相對復雜的神經網絡的示意圖呢?答案是利用NetworkX模塊。

?NetworkX是一個用Python語言開發的圖論與復雜網絡建模工具,內置了常用的圖與復雜網絡分析算法,可以方便地進行復雜網絡數據分析、仿真建模等工作。NetworkX支持創建簡單無向圖、有向圖和多重圖,內置許多標準的圖論算法,節點可為任意數據,支持任意的邊值維度,功能豐富,簡單易用。

首先,我們需要繪制出該DNN的大致框架,其Python代碼如下:

# -*- coding:utf-8 -*-
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圖
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個神經元以及它們之間的連接情況,但繪制出來的結構如卻是這樣的:

這顯然不是我們想要的結果,因為各神經的連接情況不明朗,而且很多神經都擠在了一起,看不清楚。之所以出現這種情況,是因為我們沒有給神經元設置坐標,導致每個神經元都是隨機放置的。
接下來,引入坐標機制,即設置好每個神經元節點的坐標,使得它們的位置能夠按照事先設置好的來放置,其Python代碼如下:?

# -*- coding:utf-8 -*-
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                  # 頂點大小)
# 顯示圖片
plt.show()

可以看到,在代碼中,通過pos字典已經規定好了每個神經元節點的位置,那么,繪制好的DNN結構示意圖如下:

可以看到,現在這個DNN模型的結構已經大致顯現出來了。接下來,我們需要對這個框架圖進行更為細致地修改,需要修改的地方為:

  1. 去掉神經元節點的標簽;
  2. 添加模型層的文字注釋(比如Input layer).

其中,第二步的文字注釋,我們借助opencv來完成。完整的Python代碼如下:

# -*- coding:utf-8 -*-
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)

?這樣生成的圖片就是文章最開始給出的DNN的結構示意圖。Bingo,搞定!

總結

以上是生活随笔為你收集整理的使用NetworkX绘制深度神经网络结构图(Python)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。