В этой статье мы рассмотрим возможности использования одного из основных инструментов MatLab для проектирования и обучения нейронных сетей Neural Time Series (ntstool) как с помощью GUI, так и с помощью программного кода (а также коснемся расширения возможностей проектирования с помощью программного кода)
Выбор типа сети
Рис. 1 – Экран приветствия утилиты ntstool
При запуске утилиты ntstool пользователя встречает экран приветствия со следующем текстом приветствия:
Предсказание — это своего рода динамическая фильтрация, в которой прошлые значения одного или нескольких временных рядов используются для прогнозирования будущих значений. Динамические нейронные сети, которые включают в себя слои запаздывания, используются для нелинейной фильтрации и прогнозирования.
Существует много приложений для прогнозирования. Например, финансовый аналитик может захотеть предсказать будущую стоимость акции, облигации или другого финансового инструмента. Инженер может захотеть предсказать сбой реактивного двигателя.
Предиктивные модели также используются для идентификации системы (или динамического моделирования), в котором строятся динамические модели физических систем. Эти динамические модели используются для анализа, моделирования, мониторинга и управления различными системами, включая производственные системы, химические процессы, робототехнику и аэрокосмические системы.
Этот инструмент позволяет решать три типа нелинейных временных рядов, показанных на правой панели. Выберите одно и нажмите [Next].
На правой панели находится панель выбора типа нейронной сети:
- Нелинейная авторегрессионная с внешним входом
- Нелинейная вход-выход (Без обратных связей)
- Нелинейная авторегрессионная (Генератор)
Однако с помощью программного кода можно реализовать большее количество архитектур сети, например:
1. Нелинейная авторегрессионная с внешним входом:
Рис. 2 – NARX NN
Является реализацией одного из простейших типов нейронных сетей, в частности, сетей прямого распространения, однако реализуется временное окно получения данных.
Для генерации с помощью программного кода нужно использовать следующую команду:
narxnet(inputDelays,feedbackDelays,hiddenSizes,trainFcn)
Аргументы:
- inputDelays — Входной вектор задержки (По умолчанию = 1:2)
- feedbackDelays — Вектор обратных задержек (По умолчанию = 1:2)
- hiddenSizes — Количество скрытых нейронов (По умолчанию = 10)
- trainFcn — Метод обучения ( По умолчанию = ‘trainlm’)
С помощью команды closeloop(net), есть возможность замкнуть контур этой сети для получения рекуррентной сети.
Рис. 3 – NARX NN
2. Нелинейная вход-выход (Без обратных связей ):
Реализует простейшую сеть прямого распространения.
Рис. 4 – NIO NN
Для генерации с помощью программного кода нужно использовать следующую команду:
narnet(feedbackDelays,hiddenSizes,trainFcn)
Аргументы:
- inputDelays — Входной вектор задержки (По умолчанию = 1:2)
- hiddenSizes — Количество скрытых нейронов (По умолчанию = 10)
- trainFcn — Метод обучения ( По умолчанию = ‘trainlm’)
С помощью команды closeloop(net), есть возможность замкнуть контур этой сети для получения рекуррентной сети — генератора.
Рис. 5 – NAR NN
Пример создания нейронных сетей с помощью кода
inputDelays = 1:10; feedbackDelays = 1:10; hiddenLayerSize = 20; %Нейронные сети без обратных связей netx = narxnet(inputDelays,feedbackDelays,hiddenLayerSize); net = narnet(feedbackDelays,hiddenLayerSize); %Нейронные сети с обратными связями netxc = closeloop(netx); netc = closeloop(net); %Для просмотра полученных сетей: view(net)
Выбор данных для обучения, и их подготовка
Рис. 6 – Окно выбора параметров
В утилите ntstool выбор данных для обучения не составляет проблем, поэтому рассмотрим выбор параметров в коде:
Прежде чем начать, разберемся что такое подготовка данных (Из официальной документации):
Подготовка данных для обучения и имитации. Функция PREPARETS подготавливаем временные ряды для части сети, изменяя время до минимума, чтобы “чувствовать” входные данные и внутренние переменные. Использование PREPARETS позволяет оставить исходные временные ряды неизменными, легко настраивая их для сети с разными размерами задержек как для открытых, так и закрытых нейронных сетей.
Синтаксис команды:
[Xs,Xi,Ai,Ts,EWs,shift] = preparets(net,Xnf,Tnf,Tf,EW)
Аргументы:
- Net —Нейронная сеть
- Xnf — Не возвращаемые входные данные
- Tnf — Не возвращаемые выходные данные
- Tf — Выходные данные
- EW — Вес ошибок (По умолчанию = {1})
Возвращаемые значения:
- Xs — Перемещенные входы
- Xi — Изначальные состояния входных задержек
- Ai — Изначальные состояния скрытых нейронов
- Ts — Перемещенные выходы
- EWs — Перемещенные веса ошибок
Также, перед применение preparets может потребоваться использование функции tonndata, которая конвертирует данные в стандартный тип для нейронных сетей.
Синтаксис команды tonndata:
[y,wasMatrix] = tonndata(x,columnSamples,cellTime)
Аргументы:
- x — Матрица или ячейка – массив матриц
- columnSamples — True если исходные данные представлены в виде колонок, false если в виде строк
- cellTime — True если исходные данные представлены в виде колоноками ячеек матрицы, false если в виде матрицы
Возвращаемые значения:
- y— Исходные данные, конвертированные в стандартный вид
- wasMatrix — True если исходные данные представлены в виде матриц
Выбор назначения данных
В этой части рассматривается выбор процентного соотношения данных: Тренировка, Проверка, Тестирование
Рис. 7 – Окно выбора процентного соотношения
Как и предыдущие шаги, работа с ntstool очень проста и требует простого выбора значений. В том случае, если вы проектируете нейронную сеть с помощью программного кода используйте следующие команды:
net.divideParam.trainRatio = 85/100; %Тренировка net.divideParam.valRatio = 15/100; %Проверка net.divideParam.testRatio = 5/100; %Тестирование
Выбор количества скрытых нейронов и задержек
Последним шагом перед обучением сети в ntstool является выбор количества скрытых нейронов и количество нейронов задержки.
Рис. 8 – Окно выбора размера сети
Заметим, что размеры сети при проектировании в программном кде определяются на первом шаге.
Обучение нейросети
Рис. 9 – Окно обучения нейронной сети
Операция обучения кодом выглядит так:
[net,tr] = train(net,inputs,targets,inputStates,layerStates);
Для обучения сети в обоих случаях используется nntraintool:
Рис.10 — Окно nntraintool
При помощи которого можно получить различные графики, характеризующие процесс и качество обучения сети.
Графики также можно вызывать с помощью команд:
outputs = net(inputs,inputStates,layerStates); errors = gsubtract(targets,outputs); performance = perform(net,targets,outputs)
Для более подробной информации о дополнительных возможностях train, воспользуйтесь официальным руководством (возможностей там много).
Получение нейронной сети
Для работы с обученной сетью необходимо выполнить экспорт полученной нейросети.
Рис. 11 — Окно экспорта нейронной сети
Главный вопрос, который встает на этом шаге: можно ли установить конкретное время дискретизации для нейронной сети. Ответ: да можно, но не с использованием ntstool, где всегда по будет шаг дискретизации 1 секунда.
Для получения Simulink модели после всех операций над нейронной сетью с использованием кода, необходимо вызвать функцию :
gensim(net,time)
где time – время дискретизации, а net – нейронная сеть.
После вызова будет получена модель в Simulink, с заданной частотой дискретизации.
Примерный программный код для проектирования простейшей нейронной сети в MatLab
%Исходные данные inputSeries = con2seq(In'); targetSeries = con2seq( F'); %Создание нейросети inputDelays = 1:10; feedbackDelays = 1:10; hiddenLayerSize = 20; net = narxnet(inputDelays,feedbackDelays,hiddenLayerSize); %Задание процентного соотношения net.divideParam.trainRatio = 85/100; net.divideParam.valRatio = 15/100; net.divideParam.testRatio = 5/100; %Обучение нейросети [net,tr] = train(net,inputs,targets,inputStates,layerStates); %Графики результатов outputs = net(inputs,inputStates,layerStates); errors = gsubtract(targets,outputs); performance = perform(net,targets,outputs) %Экспорт полученной нейросети gensim(net,0.001)
Ссылка по ГОСТ:
Ефименко Г.А., Синица А.М.: Нейронные сети в MatLab [Электронный ресурс] // Digiratory. 2017 г. URL: https://digiratory.ru/508 (дата обращения: ДД.ММ.ГГГГ).
Георгий, здравствуйте! А как масштабировать входные данные?
В графическом интерфейсе размерность входа определяется автоматически исходя из размерности матрицы входных значений, в случае с описанием в формате кода, то размерностью входных данных для функции tonndata(x,columnSamples,cellTime).
нужна помощь в создании нс
Опишите, пожалуйста, свою проблему. Мы попробуем помочь.
если можно не здесь, а по почте ***@mail.ru