図のニューラルネットワーク構造を使用してNetworkX深絞り。

この記事は、公共のマイクロチャネル番号から再生された  Pythonの中国人コミュニティ、著者:jclian、NetworkXモジュール構造でのPythonを使う(DNN)深いニューラルネットワークを描画する方法を示しています。

次のように私たちが作成した姿を知らDNN構造:

DNN概略的な構造

DNNモデル入力層、中間層、出力層、及び組成物のソフトマックス関数、それぞれの層のニューロンの数は、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

あなたが見ることができ、この構造は現在、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的结构示意图

おすすめ

転載: blog.csdn.net/cskywit/article/details/88019377