Engee 文档
Notebook

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

在这个演示中,我们将看一个使用sklearn包进行神经网络训练的例子。

为了使用Python处理神经网络,Engee在Engee中使用PyCall包和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. 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); 

多层感知器

我们将在本演示中考虑的第一个分类器网络是多层感知器网络,用于通过振荡幅度预测属于数据组。

多层感知器(MLP)是一种前馈人工神经网络模型,它将输入数据集映射到相应的输出数据集。 MLP由几个级别组成,每个级别都完全连接到下一个级别。 层的节点是具有非线性激活函数的神经元,除了输入层的节点。 在输入和输出层之间可以存在一个或多个非线性隐藏层。

下图显示了一个带有标量输出的单个隐藏层的MLP。

image.png

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

  1. hidden_layer_sizes-隐藏层的大小;
  2. max_iter-训练迭代的最大允许次数;
  3. 阿尔法-学习步骤;
  4. 求解器-定义跨节点优化权重的算法的求解器;
  5. verbose-指示是否输出附加信息;
  6. random_state-用于管理随机值的设置;
  7. 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)
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")
Out[0]:
PyObject Text(0.5, 1.0, 'Neural Network')

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

结论

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