最近重新开始学习吴恩达老师的深度学习,但是做笔记发现视频清晰度不够高,很多神经网络图都不清楚,就开始找有什么工具可以画神经网络图,于是发现了graphviiz,效果不错,于是就想用它来绘制神经网络图了。
先看下效果:
废话不多说进入正题
一、安装graphviz
下载graphviz
可以到Graphviz官网下载安装包:下载地址,或者直接点击下载graphviz-2.38.msi(我这里安装的是这个),双击msi文件,一直next,记住安装路径
配置环境变量
下载完成后,将其安装地址的...\Graphviz2.38\bin文件夹加入环境变量
验证
打开Windows命令行界面,输入dot -version,回车显示graphviz相关版本信息,安装成功如下图
二、安装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查找
如下图:
验证是否成功
改好之后,创建个文件,粘贴以下代码测试下能不能用。
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 库可以正常工作了
三、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