如何使用Graphviz在Python中可视化神经网络
在本教程中,我们将学习如何使用Graphviz在Python中绘制(想象)一个脑网络。Graphviz是一个开源的图表表示编程的Python模块。它在科学家中通常被广泛使用来进行表示。它的主要数据处理表达为概念图和组织图的方式,意味着您需要提供一个关于其拓扑结构的主要基于文本的表示,该表示将自动阅读并生成一张图片。
安装:
对于Windows终端:
pip install Graphviz
对于anaconda终端:
conda install -c anaconda graphviz
什么是神经网络
神经网络粗略地基于人类大脑的工作原理:多个神经元与其他神经元相连,通过它们之间的连接传递信息,并当输入到达神经元的某个阈值时停止。我们的人造大脑网络将包含人造神经元和神经递质,它们之间通过传递信息的连接加权。神经元的权重将经过一种称为反向传播的优化过程。在训练过程的每个周期中,反向传播将被用来逐层回顾网络并根据它们对大脑网络误差的贡献来调整权重。
神经网络是自我优化的功能,可以将输入引导到正确的结果。然后,我们可以将另一个输入放入该功能中,它将基于其对训练数据的理解来预测结果。
神经网络的目标
与每个神经网络一样,这个神经网络应该了解数据中的重要特征以产生结果。具体来说,为了演示每个输入测试的结果,该大脑网络将获得一个包含六个示例的数据集,每个示例都包含由零和一组成的三个元素的部分。例如,训练集中的一个示例可能是[0, 1, 1]。每个示例的结果将是一个单独的一或零。结果不完全由数据样本的第一个元素部分中的数字决定。使用前面的示例,[0, 1, 1]的结果将是0,因为第一个部分包含一个零。下面给出一个模型概述,以演示每个输入测试的结果。
有两种在Python中创建神经网络的方法:
- 从头开始 - 这可以是一个很好的学习练习,因为它会向您展示神经网络从零开始的工作原理。
- 使用神经网络库 - 像Keras和TensorFlow这样的包通过抽象底层代码来简化构建神经网络的过程。假设您已经熟悉神经网络的工作原理,这是最快且最简单的创建神经网络的方法。
无论选择哪种方法,使用神经网络进行预测的工作流程是相同的:
- 导入库。例如:import numpy as np
- 定义/创建输入数据。例如,使用numpy创建一个数据集和一个数据值的数组。
- 添加权重和偏置(如果适用)以添加特征。这些是可学习的参数,意味着它们可以在训练过程中进行调整。
- 根据已知的好的数据训练网络以找到权重和偏置的正确值。
- 使用一组测试数据测试网络以查看其性能。
- 使用超参数调整模型(这些是用于控制训练过程的参数),计算准确性并进行预测。
从零开始创建神经网络
在这个示例中,我将使用Python代码和numpy和scipy库创建一个简单的具有两个节点的神经网络。
运行以下程序的步骤:
- 定义网络,导入在此示例中所需的Python库。
- 在缩小(限制)的内部生成不规则数
- 正常的分配:
- 创建“Network”类并定义其参数:
- 为每个层设置神经元/中心节点数量并引入权重网络
- 一种引入大脑组织的权重网络的方法
- 需要更多工作来准备组织。
- 使用输入向量“input_vector”来运行组织。’input_vector’可以是元组,列表或ndarray,activation_function()执行专业工作,即执行sigmoid函数:
- 运行网络并获得结果
- 实例化类的一个示例
- 使用形状(2)的简单网络运行示例,记录和元组,并获得结果
import numpy as np
from scipy.special import expit as activation_function
from scipy.stats import transform
def truncated_normal(mean=0, sdd=1, low=0, upper=10):
return truncnorm(
(low - mean) / sdd, (upper - mean) / sdd, loc1=mean, scale=sdd)
class Nnetwork:
def __init__(self,
no_of_in_node,
no_of_out_node,
no_of_hidden_node,
learning_rate):
self.no_of_in_node = no_of_in_node
self.no_of_out_node = no_of_out_node
self.no_of_hidden_node = no_of_hidden_node
self.learning_rate = learning_rate
self.create_weight_matrices()
def create_weight_matrices(self):
rad1 = 1 / np.sqrt(self.no_of_in_node)
X = truncated_normal(mean=0, sdd=1, low=-rad1, upper=rad1)
self.weights_in_hidden = X.rvs((self.no_of_hidden_node,
self.no_of_in_node))
rad1 = 1 / np.sqrt(self.no_of_hidden_node)
X = truncated_normal(mean=0, sdd=1, low=-rad1, upper=rad1)
self.weights_hidden_out = X.rvs((self.no_of_out_node,
self.no_of_hidden_node))
def train(self, i/p_vectorr, target_vectorr):
pass #
def run(self, i/p_vectorr):
# Turn the i/p vectorr into a column vectorr:
i/p_vectorr = np.array(i/p_vectorr, ndmin=2).T
i/p_hidden = activation_function(self.weights_in_hidden @ i/p_vectorr)
o/p_vectorr = activation_function(self.weights_hidden_out @ i/p_hidden)
return o/p_vectorr
simple_network = Nnetwork(no_of_in_node=2,
no_of_out_node=2,
no_of_hidden_node=4,
learning_rate=0.6)
simple_network.run([(3, 4)])
输出:
使用Graphviz绘制简单图表
方法:
- 导入模块。
- 创建一个新的Diagraph对象。
- 将node()和edge()添加到图对象中。
- 使用render()对象保存源代码。
以下是实现方法:
from graphviz import Digraph
dot = Digraph(comment='A Round Graph')
dot.node('A1', 'Alex')
dot.node('B1', 'Rishu')
dot.node('C1', 'Mohe')
dot.node('D1', 'Satyam')
dot.edges(['A1B1', 'A1C1', 'A1D1'])
dot.edge('B1', 'C1', constraint = 'false')
dot.edge('C1', 'D1', constraint = 'false')
dot.format = 'png'
dot.render('Graph', view = True)
输出:
Graph1.png
我们可以通过dot的source方法来检查生成的源代码:
print(dot.source)
输出:
digraph {
A1 [labels=Alex]
B1 [labels=Rishu]
C1 [labels=Mohe]
D1 [labels=Satyam]
A1 -> B1
A1 -> C1
A1 -> D1
B1 -> C1 [constraint=false]
C1 -> D1 [constraint=false]
}
利用Graphviz绘制(可视化)神经网络
这里我们正在利用上面模型中找到的执行源代码:
我们应该讨论一下方法论:
- 创建一个有向图对象。
- 使用rankdir来定义图的方向。
- 创建具有以下内容的子图:
- 设定颜色。
- 设定节点属性。
- 设定子图的级别。
- 用(->)创建项之间的边。
这个源代码应该保存在一个.txt文件(myfile.txt)中,并从命令行运行’dab -Tpng -O myfile.txt’以获取一个具有图形的.png图片。
示例1:
digraph G {
rankdir=LR
splines=line
node [fixedsize=true, labels=""];
subgraphs cluster_0 {
colour=white;
node [style11=solid,colour=blue4, shapes=circle];
y1 y2 y3 y4;
labels = "layer 1 (Input layer)";
}
subgraphs cluster_11 {
colour=white;
node [style11=solid,colour=red2, shapes=circle];
a12 a22 a32;
labels = "layer 2 (hidden layer)";
}
subgraphs cluster_2 {
colour=white;
node [style11 = solid,colour = seagreen2, shapes = circle];
O;
labels="layer 3 (output layer)";
}
y1 -> a 12;
y1 -> a 22;
y1 -> a 32;
y2 -> a 12;
y2 -> a 22;
y2 -> a 32;
y3 -> a 12;
y3 -> a 22;
y3 -> a 32;
y4 -> a 12;
y4 -> a 22;
y4 -> a 32;
a 12 -> O
a 22 -> O
a 32 -> O
}
在终端中运行以下命令:
dot -Tpng -O myfile.txt
输出:
示例2:
digraph G {
rankdir=LR
splines=line
nodesep=.05;
node [labels=""];
subgraphs cluster_0 {
colour=white;
node [style11=solid,colour=blue4, shapes=circle];
y1 y2 y3;
labels = "layer 1";
}
subgraphs cluster_11 {
colour=white;
node [style11=solid,colour=red2, shapes=circle];
b12 b22 b32 b42 b52;
labels = "layer 2";
}
subgraphs cluster_2 {
colour=white;
node [style11=solid, colour=red2, shapes=circle];
b13 b23 b33 b43 b53;
labels = "layer 3";
}
subgraphs cluster_3 {
colour=white;
node [style11=solid, colour=seagreen2, shapes=circle];
O1 O2 O3 O4;
labels="layer 4";
}
y1 -> b 12;
y1 -> b 22;
y1 -> b 32;
y1 -> b 42;
y1 -> b 52;
y2 -> b 12;
y2 -> b 22;
y2 -> b 32;
y2 -> b 42;
y2 -> b 52;
y3 -> b 12;
y3 -> b 22;
y3 -> b 32;
y3 -> b 42;
y3 -> b 52;
b 12 -> b 13
b 22 -> b 13
b 32 -> b 13
b 42 -> b 13
b 52 -> b 13
b 12 -> b 23
b 22 -> b 23
b 32 -> b 23
b 42 -> b 23
b 52 -> b 23
b 12 -> b 33
b 22 -> b 33
b 32 -> b 33
b 42 -> b 33
b 52 -> b 33
b 12 -> b 43
b 22 -> b 43
b 32 -> b 43
b 42 -> b 43
b 52 -> b 43
b 12 -> b 53
b 22 -> b 53
b 32 -> b 53
b 42 -> b 53
b 52 -> b 53
b 13 -> O1
b 23 -> O2
b 33 -> O3
b 43 -> O4
b 53 -> O4
}
输出: