Нейронные сети хорошо осуществляют сглаживание или подбор значений функций по точкам. Нейронные сети могут эмпирически подобрать большинство функций. Причем, это могут быт как функции одной переменной, так и нескольких. Для первого примера возьмем зашумленную функцию одной переменной.
Пусть необходимо создать и обучить нейронную сеть, которая бы находила значение функции по заданному аргументу. Функция задана таблицей
1 | 2 | 3 | 4 | 5 | 6 | 7 | ... |
4,19 | 9,85 | 8,64 | -8,16 | 9,07 | -6,74 | 9,41 | ... |
-2,12 | -8,89 | -6,30 | 2,44 | -8,44 | -6,28 | -9,42 | ... |
Для наглядности изобразим точки функции на плоскости:
Создать нейронную сеть в Matlab возможно тремя способами:
- с помощью функции командной строки
- используя графический интерфейс пользователя
- nftool
- nntool
Мы рассмотрим первый из них. Разобрав его можно будет с легкостью разобраться с командами
nftool и nntool.
Представление исходных данных
Для аппроксимации функции, ее аргументы (x1,[x2,…]) представим в виде столбцов, сгруппированных в матрицу. Значения (y1,[y2,…])- аналогично. Столбцы матриц аргуменов X и значений Y должны соответствовать.
Например, аргументы и результаты для задачи XOR будут такими:
Inputs = [0 1 0 1;
0 0 1 1];
Targets = [0 0 0 1];
В нашем примере мы сами создадим исходные значения функции.
L=100;
NOISE=rand(1,L)*1.5-0.75;
X=rand(1,L)*20-10;
Y=X.*cos(X)+NOISE;
TABLE=[X;Y];
Создание НС из командной строки
Создадим сеть. Для этого примера, используем однонаправленную сеть с обратным распространением ошибок и сигмоидальной функцией передачи в скрытом слое и линейной функцией передачи в выходном слое. Эта структура хорошо подходит для аппроксимации функций.
Количество нейронов N используемых в скрытом слое зависит от сложности решаемой задачи (в данном случае аппроксимируемой функции).
NET = newfit(X,Y,N);
Обучение сети
По умолчанию для обучения данная нейронная сеть использует алгоритм Левенберга-Маркварта [Levenberg-Marquardt]. Входные и целевые векторы в случайном порядке данные делятся на три набора:
- 60% векторов используются для обучения;
- 20% векторов – для проверки достоверности результатов и чтобы избежать перетренировки сети;
- Последние 20% используются для независимого испытания сети
Тренировка НС
Чтобы тренировать сеть, введите:
Чтобы тренировать сеть, введите:
NET=train(NET, X,Y);
Откроется окно
Оно показывает процесс тренировки сети и позволяет его прервать, нажав кнопку “Stop Training”.
По умолчанию остановка процесса обучения происходит, когда среднеквадратичная ошибка проверки достоверности результатов возрастает шесть эпох подряд.
- Заключительная среднеквадратичная ошибка (СКО) мала.
- Ошибка проверочного (Validation) и тестового (Test) наборов утверждения имеют подобные характеристики.
- Переобучения не произошло (после точки остановки происходит лишь увеличение СКО проверочного набора до 16-й эпохи ).
На следующем рисунке можем увидеть аппроксимированную функцию-результат.
Еще одним полезным инструментом оценки результата обучения нейронной сети может быть построение функций регрессии результатов Output (которые дает обученная нейронная сеть) от целевых значений Y (которые были изначальным условием нашей задачи).
Если результаты аппроксимации оказались неудовлетворительными можно попробовать какой-либо из следующих подходов:
- Увеличить число скрытых нейронов.
- Увеличить число учебных векторов.
- Увеличьте число входных переменных, если таковые имеются.
- Использовать другой алгоритм обучения (http://www.mathworks.com/access/helpdesk/help/toolbox/nnet/backpro7.html)
В данном случае, нас устраивает тренированность сети NET.
Использование нейронной сети для получения значений аппроксимируемой функции.
Используя тренированную сеть NET, получим значения искомой функции для аргументов из интервала [-10;10] с интервалом 0.5.
X_rez=-10:0.5:10;
Y_rez = sim(NET, X_rez);
Комментариев нет:
Отправить комментарий