- Постановка задачи
- Структура расположения файлов
- Выбор исходных данных
- Закладываем скелет будущей программы MQL5
- Описание структуры скрипта Python
- Полносвязный нейронный слой
- Организация параллельных вычислений средствами OpenCL
- Реализация модели перцептрона в Python
- Создание обучающей и тестовой выборки
- Проверка корректности распределения градиента
- Сравнительное тестирование реализаций
Реализация модели перцептрона в Python
Для реализации модели полносвязного перцептрона на языке Python воспользуемся ранее созданным нами шаблоном. Как вы помните, в шаблоне мы оставили не заполненными описание нейронных слоев нашей модели.
# Создание модели нейронной сети
|
Для создания полносвязных слоев в нейронной сети библиотека Keras предоставляет класс layers.Dense. Внутри данного слоя реализуется операция:
где:
- activation — функция активации, задается в параметрах;
- input — массив исходных данных;
- kernel — матрица весов;
- dot — операция векторного умножения;
- bias — элемент смещения.
Для управления процессом создания нейронного слоя Dense имеет ряд параметров:
- units — размерность выходного пространства (количество нейронов в слое);
- activation — используемая функция активации;
- use_bias — необязательный параметр, указывающий на необходимость использования вектора элементов смещения;
- kernel_initializer — метод инициализации матрицы весов;
- bias_initializer — метод инициализации вектора элементов смещения;
- kernel_regularizer — метод регуляризации матрицы весов;
- bias_regularizer — метод регуляризации вектора смещения;
- activity_regularizer — метод регуляризации функции активации;
- kernel_constraint — функция ограничения матрицы весов;
- bias_constraint — функция ограничения вектора смещения.
Следует обратить внимание, что изменение параметров после первого обращения к слою невозможно.
Дополнительно к указанным выше параметрам Dense может принимать параметр input_shape, указывающий на размер массива входных данных. Параметр допустим только для первого слоя нейронной сети. В случае использования параметра создается входной слой для вставки перед текущим слоем. Операцию можно рассматривать как эквивалент явного определения входного слоя.
Реализацию своей первой модели нейронной сети мы начнем с копирования нашего шаблона скрипта в новый файл perceptron.py. В созданном файле создадим первую модель с одним скрытым слоем из 40 нейронов и 2 нейронами в слое результатов. В скрытом слое будем использовать Swish в качестве функции активации. Нейроны выходного слоя будут активироваться гиперболическим тангенсом.
# Создание модели нейронной сети
|
В принципе этого достаточно для запуска обучения модели. Но мы с вами изучаем работу различных моделей и хотим понять влияние изменения архитектуры нейронной сети на способность модели обучаться и обобщать исходные данные. Поэтому я добавил еще две модели. В одной модели я добавил еще два скрытых слоя. В итоге получилась модель с тремя скрытыми слоями. Все три скрытых слоя полностью идентичны: имеют по 40 элементов и активируются функцией Swish. Первый и последний слои остались без изменений.
# Создание модели с тремя скрытыми слоями
|
И конечно, нам нужно будет повторить и все последующие шаги для каждой модели. Сначала подготовим модель к обучению с помощью метода compile.
model2.compile(optimizer='Adam',
|
После этого запустим процесс обучения модели и сохраним обученную модель.
history2 = model2.fit(train_data, train_target,
|
Третью модель построим на базе второй с добавлением регуляризации. Для каждого нейронного слоя укажем в параметре kernel_regularizer объект класса keras.regularizers.l1_l2 с параметрами L1 и L2-регуляризации. Как видно из названия класса, мы будем использовать ElasticNet.
# Добавляем регуляризацию в модель с тремя скрытыми слоями
|
Далее скомпилируем и обучим модель. Для всех трех моделей используются идентичные параметры обучения. Это позволит оценить непосредственно влияние архитектуры модели на результат обучения. При этом максимально исключим влияние прочих факторов.
model3.compile(optimizer='Adam',
|
Так как в данном скрипте мы обучаем не одну, а целых три модели, нам нужно подправить и блок визуализации. Выведем на один график результаты обучения всех трех моделей. Это продемонстрирует отличия в процессе обучения и валидации. Изменение внесем в блоки построения обоих графиков.
# Отрисовка результатов обучения трех моделей
|
plt.figure()
|
После обучения в нашем шаблоне идет проверка работоспособности модели на тестовой выборке. Здесь нам тоже предстоит провести тестирование трех моделей в схожих условиях. Я пропущу блок загрузки тестовой выборки, так как он без изменений перешел из шаблона. Приведу лишь код непосредственного тестирования моделей.
# Проверка результатов моделей на тестовой выборке
|
Результаты тестирования в шаблоне выводились в журнал. Но сейчас мы имеем результаты тестирования трех моделей. Более наглядно будет сравнить результаты на графике. Для построения графиков воспользуемся средствами библиотеки Matplolib.
В данном случае мы будем отображать не динамику процесса, как ранее, а сравнивать величины. Следовательно, для отображения величин удобнее будет приметь столбчатую диаграмму. Для построения диаграмм библиотека предлагает метод bar. Этот метод в параметрах принимает два массива: в первом мы укажем метки сравниваемых параметров, а во втором — их величины. Для полноты картины добавим название графика и вертикальной оси с помощью методов title и ylabel, соответственно.
plt.figure()
|
С работой скрипта познакомимся немного позже. В следующей главе мы подготовим данные для обучения и тестирования моделей.