Пример 3.5. Рисунок 3.6

>> P = [0 1 2 3 4 5 6 7 8 9 10];

>> T = [0 1 2 3 4 3 2 1 2 3 4];

>> net = newff([0 10],[5 1],{'tansig', 'purelin'});

>> net.trainParam.goal=0.01;

>> net.trainParam.epochs = 50;

>> net = train(net,P,T);

>> X = linspace(0,10);

>> Y = sim(net,X);

>> figure(1)

>> plot(P,T,'ko',X,Y)

В этом примере вектора P и T задают 11 опорных точек, по которых требуется построить непрерывную функцию. Нейронная сеть имеет два слоя, скрытый слой содержит 5 нейронов. Задано 50 эпох обучения при требуемой ошибке 0.01. Рис. 3.6 показывает, что задача решена достаточно качественно.

P, X

Рисунок 3.6. Аппроксимация функции, заданной набором точек

Пример 3.6. Пусть имеется большой массив точек:

>> x = 0:.05:2;

>> y = 1./ ((x-.3).^2 +.01) + 1./ ((x-.9).^2 +.04) - 6;

Требуется построить ИНС ПР для аппроксимации этого массива.

>> net=newff([0 2], [15,1], {'tansig','purelin'},'trainlm');

>> net.trainParam.show = 50;

>> net.trainParam.epochs =100;

>> net.trainParam.goal = 0.001;

>> P=x;

>> T=y;

>> net1 = train(net, P, T);

График обучения показан на рис. 3.7. Заданная ошибка оказалась достигнута уже на 55 итерации. Заметим, что в этом примере использовался алгоритм обучения trainlm (Levenberg-Marquardt).

Проверим полученный результат:

>> A = sim(net1,P);

>> plot(x,y,P,A)

Графики функций полностью совпадают (рис. 3.8)

Рисунок 3.7. Изменение функции ошибки в процессе обучения

Рисунок 3.8. Сравнение функции и ее аппроксимации

Пример 3.7. Рассмотрим аппроксимацию функции двух переменных: y=sin(x)cos(y).

C помощью стандартных функций MatLab получаем поверхность, показанную на рис. 3.9:

>> x = -2:0.25:2; y = -2:0.25:2;

>> z = cos(x)'*sin(y);

>> mesh(x,y,z)

Опишем обучающее множество для нейронной сети:

>> P = [x;y]; T = z;

При таком способе формирования обучающей выборки получается, что пары {x; y} на диагонали в области определения, и каждой паре соответствует столбец целевого множества. Поэтому нейронная сеть должна иметь два входа и 17 нейронов на выходе:

>> net=newff([-2 2; -2 2], [25 17], {'tansig' 'purelin'},'trainlm');

>> net.trainParam.show = 50;

net.trainParam.lr = 0.05;

net.trainParam.epochs = 300;

net.trainParam.goal = 0.001;

>> net1 = train(net, P, T);

Выполним проверку (рис. 3.10):

>> A=sim(net1,P)

>> figure(1); mesh(x,y,A)

Рисунок 3.9. Исходная функция двух переменных

Рисунок 3.10. Выход нейронной сети после обучения

Сравнение рис. 3.9 и 3.10 позволяет говорить о достаточно высоком качестве аппроксимации.

Пример 3.9. Аппроксимация функции 3-х переменных.

Пусть имеется модель, с помощью которой можно генерировать вход - выходные зависимости системы:

y = 3 a + 4 ab + 2 c + f,

где a, b, c – входные переменные, f – сигнал шума. Опишем эти величины как массивы случайных чисел:

>> a = rand(1,100);

>> b = rand(1,100);

>> c = rand(1,100);

>> f = rand(1,100)*0.025;

>> y = 3* a + 4* a. * b + 2* c + f;

Обучающее множество задается в виде:

>> P = [ a; b; c ];

>> T = y;

Опишем ИНС, и запустим процесс обучения:

>> net = newff([0 1; 0 1; 0 1], [4 1], {‘tansig’, ‘purelin’});

>> net = train(net, P,T)

Для оценки качества работы ИНС выполним команды:

>> out=sim(net,P);

>> t=1:100;

>> plot(t,y-out)

Результат показан на рис. 3.11.

Рисунок 3.11. Ошибка выхода нейронной сети

При нейросетевой аппроксимации функции по точкам может возникать явление переобучения. В следующем примере ИНС после обучения воспроизводит влияние шумов, наложенных на обучающую выборку.

Пример 3.10.

>> net = newff([-1 1],[30,1],{'tansig','purelin'}); % двухслойная ИНС ПР

>> net.trainParam.epochs = 500;

>> p = [-1:0.05:1]; % область определения функции

>> t1 = sin(2*pi*p); % эталонная функция

>> t = sin(2*pi*p)+0.1*randn(size(p)); % функция с шумом

>> [net,tr] = train(net,p,t);

>> t2 = sim(net,p);

>> figure(1); plot(p,t,'+',p,t2,'-',p,t1,':')

>> legend('вход','выход','эталон'); grid on

Результат показан на рис. 3.12. Выход обученной сети соответствует всем точкам зашумленной обучающей выборки, местами значительно отступая от эталонного процесса.

Для устранения эффекта переобучения можно использовать расширенный вариант команды train, в котором помимо обучающей выборки указывается также проверочная выборка:

Рисунок 3.12. Пример переобучения нейронной сети

>> val.P = [-0.975: 0.05: 0.975]; % формирование проверочной выборки

>> val.T = sin(2*pi*val.P) + 0.1*randn(size(val.P));

>> [net, tr] = train(net, p, t, [], [], val);

Результат обучения для этого варианта команды показан на рис. 3.13. Обучение здесь прекращается раньше – как только контрольная ошибка начинает значительно превышать ошибку обучения. За счет этого выход нейронной сети не реагирует на отдельные аномальные точки обучающего множества (рис. 3.13).

Рисунок 3.13. Контроль переобучения нейронной сети


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: