最近重新开始学习吴恩达老师的深度学习,但是做笔记发现视频清晰度不够高,很多神经网络图都不清楚,就开始找有什么工具可以画神经网络图,于是发现了graphviiz,效果不错,于是就想用它来绘制神经网络图了。

先看下效果:




有没有画神经网络结构的好方法 如何画神经网络立体图_有没有画神经网络结构的好方法


废话不多说进入正题

一、安装graphviz

下载graphviz

可以到Graphviz官网下载安装包:下载地址,或者直接点击下载graphviz-2.38.msi(我这里安装的是这个),双击msi文件,一直next,记住安装路径

配置环境变量

下载完成后,将其安装地址的...\Graphviz2.38\bin文件夹加入环境变量

验证

打开Windows命令行界面,输入dot -version,回车显示graphviz相关版本信息,安装成功如下图


有没有画神经网络结构的好方法 如何画神经网络立体图_python_02


二、安装python的graphviz库

由于graphviz是dot语言编写的绘图脚本,使用起来难免有些不适应,有时候更想用python来编写,对于 Python 而言,也有一个 Graphviz 库与该工具对应,使用 Graphviz 库可以使用 Python 的语法生成 dot 语言绘图脚本,并调用 Graphviz 工具生成图片并保存。但是由于 Graphviz 库并不是独立工作库,它需要连接 Graphviz 工具来联合工作,也就是说当你需要使用 Graphviz 库时必须安装 Graphviz 工具并设置好 Python 调用 Graphviz 工具的接口。

anoconda虚拟环境安装

打开anoconda Prompt输入命令pip install graphviz

修改两项设置

接下完成两步

第一步:打开cmd命令窗口输入

echo process1 = subprocess.Popen(command1,stdout=subprocess.PIPE,shell=True)

第二步:在自己的python 安装路径下,找到文件 subprocess.py,打开,找到 Popen(object) 类。找到这个类的 init 方法,把 shell=False 修改为 shell=True。

注:可按crtl+F查找

如下图:


有没有画神经网络结构的好方法 如何画神经网络立体图_python_03


验证是否成功

改好之后,创建个文件,粘贴以下代码测试下能不能用。

from graphviz import Digraph

dot = Digraph('测试')
dot.node("1","Life's too short")
dot.node("2","I learn Python")
dot.edge('1','2')

dot.view()

看到下图,说明 graphviz 库可以正常工作了


有没有画神经网络结构的好方法 如何画神经网络立体图_conda_04


三、graphviz的使用

,使用dot语言请参考其他优秀博客,这里是使用python绘制神经网络图,如下代码为绘制神经网络

from graphviz import Digraph


def Neural_Network_Graph(input_layer, hidden_layers, output_layer, filename="demo1"):
    g = Digraph('g', filename=filename)  # 定义一个有向图
    n = 0  # 所有结点的数量,用其来作为结点的名字(代号)
    g.graph_attr.update(splines="false", nodesep='0.8',
                        ranksep='2', rankdir="LR")  
                        # 设置下图的属性: 线类型,结点间隔,每一级的间隔

    # Input Layer
    with g.subgraph(name='cluster_input') as c:
        the_label = 'Input Layer'
        c.attr(color='white')
        for i in range(input_layer):
            n += 1
            c.node(str(n))
            c.attr(label=the_label, rank='same')
            c.node_attr.update(color="#2ecc71", style="filled",
                               fontcolor="#2ecc71", shape="circle")

    last_layer_nodes = input_layer  # 最后一层的结点数量
    nodes_up = input_layer  # 总结点数量
    
    # Hidden Layers
    
    hidden_layers_nr = len(hidden_layers)  # 隐藏层层数
    for i in range(hidden_layers_nr):
        with g.subgraph(name="cluster_" + str(i + 1)) as c:
            c.attr(color='white')
            c.attr(rank='same')
            the_label = "Hidden Layer" + str(i+1)
            c.attr(label=the_label)
            for j in range(hidden_layers[i]):
                n += 1
                c.node(str(n), shape="circle", style="filled",
                       color="#3498db", fontcolor="#3498db")
                for h in range(nodes_up - last_layer_nodes + 1, nodes_up + 1):
                    g.edge(str(h), str(n))  # 定义好上一层到下一层的连接线
            last_layer_nodes = hidden_layers[i]
            nodes_up += hidden_layers[i]

    # Output Layer
    with g.subgraph(name='cluster_output') as c:
        c.attr(color='white')
        c.attr(rank='same')
        for i in range(1, output_layer + 1):
            n += 1
            c.node(str(n), shape="circle", style="filled",
                   color="#e74c3c", fontcolor="#e74c3c")
            for h in range(nodes_up - last_layer_nodes + 1, nodes_up + 1):
                g.edge(str(h), str(n))
        c.attr(label='Output Layer')
        c.node_attr.update(color="#2ecc71", style="filled",
                           fontcolor="#2ecc71", shape="circle")

    g.attr(arrowShape="none")
    g.edge_attr.update(arrowhead="none", color="#707070")
    g.render(filename, format="png",view=True)

# -------------------------------------------
input_layer = 4  # 输入层的神经元数量
hidden_layers = [3,1]  # 隐藏层层数和数量
output_layer = 1  # 输出层神经元数量
# -----------------------------------------------

Neural_Network_Graph(input_layer, hidden_layers, output_layer)

得到网络图如下:


有没有画神经网络结构的好方法 如何画神经网络立体图_有没有画神经网络结构的好方法


想要不同的神经网络图,可以修改参数input_layer, hidden_layers, output_layer