Engee 文档
Notebook

Python 神经网络及其与 Engee 模型的集成

在本演示中,我们将以使用 sklearn 软件包训练神经网络为例进行说明。

要在 Engee 中使用 Python 处理神经网络,需要使用 PyCall 软件包和 Engee 中的 Python 调用命令。

首先,让我们在 Engee 中安装 sklearn 和 PyPlot 库。

In [ ]:
# Pkg.add("ScikitLearn")
Pkg.add("PyPlot")

using PyPlot

# Импорт необходимых модулей из Python
@pyimport sklearn.neural_network as nn
@pyimport sklearn.tree as tree
@pyimport numpy as np
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`

在 Engee 中从模型生成训练数据

该模型为分类器生成一个由两个正弦值组成的向量,代表一个信号。根据对输出信号振幅波动的判断,设定类别标签。下图显示了模型的顶层。

image_2.png

如下图所示,您可以看到数据生成过程。

image_2.png

下面显示的是在三个范围内形成的类别标签:

  1. 小于 -0.7; 2; 大于 -0.7 且小于 0.7; 3;
  2. 大于 0.7。

image.png

接下来,让我们通过连接运行模型的辅助函数来生成数据,运行模型并查看记录到 simout 中的数据。

In [ ]:
 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)
Building...
Progress 0%
Progress 100%
Progress 100%
Out[0]:
2-element Vector{WorkspaceArray}:
 WorkspaceArray{Int64}("PyDataGen/target")
 WorkspaceArray{Vector{Float64}}("PyDataGen/Data")

接下来,我们将从 simout 中卸载数据,并将其转换为 numpy 格式,以便进一步输入 Python 神经网络。

In [ ]:
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。

image.png

让我们继续在 Python 中初始化和训练神经网络。有几个参数可以配置 MLP:

hidden_layer_sizes - 隐藏层的大小; max_iter - 允许的最大训练迭代次数; 3; alpha - 训练步长; 4; solver - 解算器,定义优化节点权重的算法; 5; verbose - 指定是否输出额外信息; 6; 6. random_state - 控制随机值的设置; learning_rate_init - 学习率。

In [ ]:
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)
/home/engee/micromamba/lib/python3.11/site-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (10) reached and the optimization hasn't converged yet.
  warnings.warn(
Out[0]:
MLPClassifier(learning_rate_init=0.1, max_iter=10, random_state=1, solver='sgd',
              verbose=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

从警告中我们可以看到,迭代次数已达到最大值,优化并未收敛。因此,我们需要增加迭代次数。让我们用新的网络参数在 Python 中重复神经网络的初始化和训练。

In [ ]:
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)
Out[0]:
MLPClassifier(learning_rate_init=0.1, max_iter=140, random_state=1,
              solver='sgd', verbose=1)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

现在让我们评估一下模型的质量。我们可以看到,神经网络的猜测准确率很高。

In [ ]:
accuracy = clf[:score](Data, target)
println("Точность: $accuracy")
Точность: 0.995004995004995

决策树

让我们来看一个用决策树结构训练神经网络的代码示例。这是一种带有教师的非参数学习方法,用于分类和回归。

这种方法需要创建一个模型,通过学习从数据特征中推断出的简单决策规则来预测目标变量的值。

这棵树可以看作是一个片断常数近似值。我们首先声明并训练决策树。

In [ ]:
dt_clf = tree.DecisionTreeClassifier()
dt_clf.fit(Data, target)
Out[0]:
DecisionTreeClassifier()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

让我们构建决策树的图形,并增大像素尺寸和密度,使图形更加直观。

In [ ]:
plt.figure(figsize=(13, 4), dpi=200)
tree.plot_tree(dt_clf, filled=true)
No description has been provided for this image
Out[0]:
7-element Vector{PyObject}:
 PyObject Text(0.6, 0.8333333333333334, 'x[1] <= 0.351\ngini = 0.573\nsamples = 1001\nvalue = [462, 83, 456]')
 PyObject Text(0.4, 0.5, 'x[0] <= -0.35\ngini = 0.261\nsamples = 539\nvalue = [0, 83, 456]')
 PyObject Text(0.5, 0.6666666666666667, 'True  ')
 PyObject Text(0.2, 0.16666666666666666, 'gini = 0.0\nsamples = 456\nvalue = [0, 0, 456]')
 PyObject Text(0.6, 0.16666666666666666, 'gini = 0.0\nsamples = 83\nvalue = [0, 83, 0]')
 PyObject Text(0.8, 0.5, 'gini = 0.0\nsamples = 462\nvalue = [462, 0, 0]')
 PyObject Text(0.7, 0.6666666666666667, '  False')

创建一个新图表来显示神经网络的结果。

In [ ]:
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")
No description has been provided for this image
Out[0]:
PyObject Text(0.5, 1.0, 'Neural Network')

从结果图中我们可以看到,根据输入数据的总和,我们生成的所有值都被分成了三个独立的组。

结论

我们用具体的例子展示了将神经网络集成到 Engee 中的选项,以及将面向模型的设计与 Python 功能相结合的可能性。