Python 神经网络及其与 Engee 模型的集成¶
在本演示中,我们将以使用 sklearn 软件包训练神经网络为例进行说明。
要在 Engee 中使用 Python 处理神经网络,需要使用 PyCall 软件包和 Engee 中的 Python 调用命令。
首先,让我们在 Engee 中安装 sklearn 和 PyPlot 库。
# Pkg.add("ScikitLearn")
Pkg.add("PyPlot")
using PyPlot
# Импорт необходимых модулей из Python
@pyimport sklearn.neural_network as nn
@pyimport sklearn.tree as tree
@pyimport numpy as np
在 Engee 中从模型生成训练数据¶
该模型为分类器生成一个由两个正弦值组成的向量,代表一个信号。根据对输出信号振幅波动的判断,设定类别标签。下图显示了模型的顶层。
如下图所示,您可以看到数据生成过程。
下面显示的是在三个范围内形成的类别标签:
- 小于 -0.7; 2; 大于 -0.7 且小于 0.7; 3;
- 大于 0.7。
接下来,让我们通过连接运行模型的辅助函数来生成数据,运行模型并查看记录到 simout 中的数据。
function run_model(name_model)
Path = (@__DIR__) * "/" * name_model * ".engee"
if name_model in [m.name for m in engee.get_all_models()] # Проверка условия загрузки модели в ядро
model = engee.open( name_model ) # Открыть модель
model_output = engee.run( model, verbose=true ); # Запустить модель
else
model = engee.load( Path, force=true ) # Загрузить модель
model_output = engee.run( model, verbose=true ); # Запустить модель
engee.close( name_model, force=true ); # Закрыть модель
end
return model_output
end
run_model("PyDataGen")
sleep(1)
collect(simout)
接下来,我们将从 simout 中卸载数据,并将其转换为 numpy 格式,以便进一步输入 Python 神经网络。
target = simout["PyDataGen/target"];
target = collect(target);
target = np.array(target.value);
Data = simout["PyDataGen/Data"];
Data = collect(Data);
Data = np.array(Data.value);
多层perseptron¶
在本演示中,我们考虑的第一个网络(分类器)是一个多层perseptron 网络,用于根据振荡幅度预测数据组的成员。
多层perseptron(MLP)是一种前馈式人工神经网络模型,可将一组输入数据映射到一组相应的输出数据。MLP 由若干层组成,每一层与下一层完全相连。除输入层的节点外,各层的节点都是具有非线性激活函数的神经元。输入层和输出层之间可能有一个或多个非线性隐藏层。
下图显示了一个具有标量输出的隐藏层的 MLP。
让我们继续在 Python 中初始化和训练神经网络。有几个参数可以配置 MLP:
hidden_layer_sizes - 隐藏层的大小; max_iter - 允许的最大训练迭代次数; 3; alpha - 训练步长; 4; solver - 解算器,定义优化节点权重的算法; 5; verbose - 指定是否输出额外信息; 6; 6. random_state - 控制随机值的设置; learning_rate_init - 学习率。
clf = nn.MLPClassifier(hidden_layer_sizes=(100,), max_iter=10, alpha=1e-4, solver="sgd", verbose=1, random_state=1, learning_rate_init=.1)
clf[:fit](Data, target)
从警告中我们可以看到,迭代次数已达到最大值,优化并未收敛。因此,我们需要增加迭代次数。让我们用新的网络参数在 Python 中重复神经网络的初始化和训练。
clf = nn.MLPClassifier(hidden_layer_sizes=(100,), max_iter=140, alpha=1e-4, solver="sgd", verbose=1, random_state=1, learning_rate_init=.1)
clf[:fit](Data, target)
现在让我们评估一下模型的质量。我们可以看到,神经网络的猜测准确率很高。
accuracy = clf[:score](Data, target)
println("Точность: $accuracy")
决策树¶
让我们来看一个用决策树结构训练神经网络的代码示例。这是一种带有教师的非参数学习方法,用于分类和回归。
这种方法需要创建一个模型,通过学习从数据特征中推断出的简单决策规则来预测目标变量的值。
这棵树可以看作是一个片断常数近似值。我们首先声明并训练决策树。
dt_clf = tree.DecisionTreeClassifier()
dt_clf.fit(Data, target)
让我们构建决策树的图形,并增大像素尺寸和密度,使图形更加直观。
plt.figure(figsize=(13, 4), dpi=200)
tree.plot_tree(dt_clf, filled=true)
创建一个新图表来显示神经网络的结果。
plt.figure(figsize=(18, 6), dpi=80) # увеличим размер и плотность пикселей
plt.scatter(Data[:, 1], Data[:, 2], c=target, cmap=plt.cm.Paired, edgecolors="k")
plt.title("Neural Network")
从结果图中我们可以看到,根据输入数据的总和,我们生成的所有值都被分成了三个独立的组。
结论¶
我们用具体的例子展示了将神经网络集成到 Engee 中的选项,以及将面向模型的设计与 Python 功能相结合的可能性。