Нейронные сети Python и их интеграция с моделями Engee¶
В данной демонстрации мы рассмотрим пример обучения нейронных сети с помощью пакета sklearn.
Для работы с нейронными сетями с помощью Python в Engee используется пакет PyCall и команды вызова Python в Engee.
Для начала установим библиотеки sklearn и PyPlot в Engee.
using Pkg
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;
- больше -0.7 и меньше 0.7;
- больше 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(5)
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);
Многослойный персептрон¶
Первая сеть – классификатор, которую мы рассмотрим в данной демонстрации, – это сеть многослойного персептрона для предсказания принадлежности к группе данных по амплитуде колебания.
Многослойный персептрон (MLP) – это модель искусственной нейронной сети с прямой связью, которая сопоставляет наборы входных данных с набором соответствующих выходных данных. MLP состоит из нескольких уровней, каждый из которых полностью связан со следующим. Узлами слоев являются нейроны с нелинейными функциями активации, кроме узлов входного слоя. Между входным и выходным слоем может быть один или несколько нелинейных скрытых слоев.
На рисунке ниже показан MLP с одним скрытым слоем со скалярным выходом.
Перейдём к инициализации и обучению нейронной сети в Python. Для настройки MLP имеются несколько параметров:
- hidden_layer_sizes – размер скрытого слоя;
- max_iter – максимально допустимое количество итераций обучения;
- alpha – шаг обучения;
- solver – решатель, который определяет алгоритм оптимизации весов по узлам;
- verbose – указание, выводить ли дополнительную информацию;
- 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")
Дерево решений¶
Рассмотрим пример кода для обучения нейронной сети со структурой дерева решений (decision tree). Это непараметрический метод обучения с учителем, используемый для классификации и регрессии.
В рамках этого метода требуется создать модель, которая прогнозирует значение целевой переменной, изучая простые правила принятия решений, выведенные из особенностей данных.
Дерево можно рассматривать как кусочно-постоянную аппроксимацию. Начнём с объявления и обучения дерева решений.
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.