close

Вход

Забыли?

вход по аккаунту

?

Отчет Нейронная сеть

код для вставкиСкачать
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
Нижегородский государственный университет им. Н.И.Лобачевского
МЕХАНИКО-МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ
Кафедра теоретической механики
ОТЧЕТ
по работе на тему
"Аппроксимация функции нейронной сетью"
Исполнитель: студентка 656 группы Ларина Е.С.
Преподаватель: доцент, к.ф.-м.н. Ляхов А.Ф.
Нижний Новгород
2013
Постановка задачи
Создать нейронную сеть и выполнить аппроксимацию функции y=2〖sin〗^2 x, x∈[0,1]
с учетом воздействия шума. Для создания сети использовать пакет Neural Networks Toolbox системы Matlab.
Сравнить эффективность аппроксимацию функции с учетом воздействия шума нейронов сетью и полиномами средствами пакета Matlab.
Написать программу на m-языке пакета Matlab.
Создание нейронной сети для аппроксимацию функции
При моделелировании нейронной сети выделяются следующие этапы:
Создание сети
Обучение сети
Тестирование сети
Использование сети для решения поставленной задачи
Создадим двухслойную нейронной сеть прямого распределения (однонаправленную), которую необходимо обучить аппроксимировать исходную функцию в условиях воздействия шума. Шум - случайные искажения, вносимые в значения аппроксимируемой функции в точках ее определения. Заметим, что способность сети аппроксимировать исходную функцию при наличии шума, особенно важна для практики.
Определим число нейронов в каждом слое. На вход сети подаем идеальный (незашумленный) вектор input_param. Его компоненты расположены на отрезке [0; 1] с шагом delta = 0.1, то есть размерность входного вектора N = 21.
Выходной вектор output_param выбираем таким образом, чтобы его компоненты соотетветствовали векторам входа.
В нейрона кете Neural Network Toolbox системы Matlab задание входного и выходного вектора записывается так:
input_param = [0:0.05:1]; - входной вектор
output_param = 2.* sin(input_param). ^2; - выходной вектор
Число нейронов в скрытом слое определим по формуле:
где n - число входных нейронов (n = 1),
m - число выходных нейронов (m = 1),
N - число элементов обучающей выборки (N = 21)
Lщ - число синаптических весов
Подставив соответствующие значения получим:
4≤L_щ≤67
Оценив необходимое число весов, рассчитаем число нейронов в скрытом слое:
L=L_щ/(m+n), откуда 2≤L≤33
Значение L решено было выбрать равным 20.
Структурная схема нейронной сети.
Рис. 1. Укрупненная структурная схема сети
Рис. 2. Структурная схема сети.
Рис.3. Структурная схема сети.
Рис.4. Сигналы после линии задержки между входным и первым слоями
Рис. 5. Весовая матрица между входными и скрытым слоями
Рис.7. Сигналы после линии задержки между скрытым и выходным слоями
Рис. 8. Весовая матрица между скрытым и выходным слоями
Обучение созданной сети
Для обучения созданной нейронной сети необходимо указать, какие наборы данных должны быть использованы в качестве обучающих. Обучение сети при отсутствии шума
Для обучения созданной нейронной сети при отсутствии шума в качестве обучающих данных используем идеальный входной вектор:
[0:0.05:1]; - входной вектор output_param = 2.* sin(input_param). ^2;- выходной вектор
Сеть учится с максимальным количеством циклов обучения 700 или до достижения допустимой средней квадратичной погрешности 10-5.
Процесс обучения иллюстрируется графиком зависимости ошибки обучения от количества циклов обучения:
Рис. 9. Кривая обучения нейронной сети при отсутствии шума
Из рисунка следует, что сеть обучилась за 35 эпох. Монотонно убывающий характер кривой говорит об успешном обучении сети.
Обучение сети при наличии шума
Чтобы создать нейронной сеть, не чувствительную к воздействию шума, обучим ее с применением одного идеального и одного зашумленного векторов входа. Искажений вектор имеет шум со средним значением , распределенным по нормального закону. Целевой вектор состоит из двух векторов. Такой способ обучения нейронной сети позволяет правильно аппроксимировать как зашумленную функцию, так и идеальную:
[input_param, input_param + randn(size(input_param)) * 0.04)]; - входной вектор, состоящий из двух векторов
[2.* sin(input_param). ^2, 2.* sin(input_param). ^2] - целевой вектор, состоящий из двух векторов.
При обучении зашумленной нейронной сети количество циклов обучения - 700, а допустимая среднеквадратичная прогрешность 10-3.
Процесс обучения зашумленной нейронной сети иллюстрируется графиком зависимости ошибки обучения от количества циклов обучения.
Рис. 10. Кривая обучения нейронной сети при наличии шума
Рисунок показывает, что сеть успешно обучилась за 33 эпохи.
Повторное обучение сети при отсутствии шума
Для того, чтобы гарантировать правильность классификации идеальный векторов нейронную сеть, обученную в присутствии искаженного вектора, обучим без шума.
Рис. 11. Кривая обучения нейронной сети при отсутствии шума
Графика зависимости ошибки обучения от количества циклов обучения показан на рис. 11. Можно видеть, что нейронная сеть при отсутствии шума обучилась за 47 эпох.
Эффективность функционирования нейронной сети
Рассмотрит две нейронные сети: сеть №1, обученную на идеальным векторе, и сеть №2, обученную в присутствии зашумленного вектора.
Проверка функционирования системы производится следующим образом. Шум с диапазоном значений от 0 до 0.3 с шагом 0.01, распределенным по нормальному закону, добавляется к вектору входа каждой сети. Для каждого уровня шума формируется 30 зашумленных последовательностей, затем вычисляется выход сети. После этого определяется количество ошибочных классификаций и вычисляется процент ошибки.
Для того, чтобы определить эффективность функционирования каждой сети, вычислим процент ошибки и построим соответствующий график зависимости процента ошибки от уровня входного шума, который показан на рис. 12.
Рис. 12. Зависимость процента ошибки от уровня входного шума
Аппроксимация функции с помощью нейронной сети
Используем созданную нейронную сеть для аппроксимации данной функции. Сформируем искаженный вектор входа со средним значением шума равным 0.05, распределенным по нормальному закону. При использовании сети зададим уровень зашумления входного вектора:
p1=[input_param,(input_param+randn(size(input_param))*0.04)];
Рис. 13. Аппроксимация функции двухслойной нейронной сетью
Рис.14 Структурная схема нейронной сети
На рис. 13 пунктиром показан график основной функции. Результат работы нейронной сети изображены сплошной линией. Крестиками обозначены точки (их 19), соответствующие зашумленному входному вектору. Среднеквадратичная ошибка аппроксимации данной функции полиномами: E = 0.0092
Аппроксимацию функции полиномами с учетом воздействия шума
Выполним аппроксимацию функции с учетом воздействия шума в системе Matlab полиномами по методу наименьших квадратов. Диапазон входных значений [0; 1] шагом 0.05.
График функции и аппроксимирующего полинома на отрезке [0; 1] изображен на рис. 15. График дает наглядное представление о полиномиальной аппроксимации.
Рис. 15. Аппроксимация функции полиномами
На рис. 15 пунктиром показан график основной функции. График аппроксимирующего полинома двадцатой степени изображен сплошной линией. Крестиками обозначены точки (их 19), соответствующие зашумленному входному вектору. Среднеквадратичная ошибка аппроксимации данной функции полиномами: E = 0.0880
Выводы
На основе полученных результатов можно сделать следующие выводы:
Нейронная сеть способна обучаться как при зашумленных, так и при не зашумленных входных параметрах в отличии от других методов аппроксимации функции, в которых в качестве исходного задается не зашумленный вектор.
Аппроксимация при зашумленном входном векторе нейронной сетью в представленных результатах лучше, чем полиномами (среднеквадратичная ошибка примерно в 8 раз меньше).
Использованная литература
Ю.В.Виноградова, А.Ф.Ляхов "Аппроксимация функции нейронной сетью", 2009 г.
Код программы:
>> input_param = [0:0.05:1];
>> output_param = 2.* sin(input_param).^2;
>> net=newff(minmax(output_param),[20,1],{'tansig','purelin'},'trainbfg');
>> gensim(net);
>> gensim(net);
>> net.trainParam.epochs=700;
>> net.trainParam.show=50;
>> net.trainParam.goal=1e-5;
>> [net,tr]=train(net,input_param,output_param);
>> netn=net;
>> netn.trainParam.epochs=700;
>> netn.trainParam.show=50;
>> netn.trainParam.goal=1e-3;
>> t1=[2.*sin(input_param).^2, 2.*sin(input_param).^2];
>> p1=[input_param,(input_param+randn(size(input_param))*0.04)];
>> [netn,tr]=train(netn,p1,t1);
>> netn.trainParam.goal=1e-5;
>> [netn,tr]=train(netn,input_param,output_param);
>> tic
>> noise=0:0.01:0.3;
>> test=30
>> network1=[];
>> network2=[];
>> output_param = 2.* sin(input_param).^2;
>> for noiselevel=noise
>> errors1=0;
>> errors2=0;
>> for i=1:test
>> P=input_param+randn(size(input_param))*noiselevel;
>> A=sim(net,P);
>> errors1=errors1+sum(sum(abs(A-output_param)))/2;
>> An=sim(netn,P);
>> errors2=errors2+sum(sum(abs(An-output_param)))/2;
>> echo off
>> end
>> network1=[network1 errors1/21/30];
>> network2=[network2 errors2/21/30];
>> end
>> network1
>> network2
>> toc
>> figure(1)
>> plot(noise,network1*100,'--b',noise,network2*100,':r','LineWidth',1.5);
>> legend('процент ошибки сети net', 'процент ошибки сети netn');
>> xlabel('Уровень шума','FontSize',12);
>> ylabel('Процент ошибки','FontSize',14);
>> title('Полученная зависимость процента ошибки от уровня шума','FontSize',12,'FontWeight','bold');
>> grid on
>> plot(noise,network1*100,'--b',noise,network2*100,':r','LineWidth',1.5);
>> legend('процент ошибки сети net', 'процент ошибки сети netn');
>> xlabel('Уровень шума','FontSize',12);
>> ylabel('Процент ошибки','FontSize',14);
>> title('Полученная зависимость процента ошибки от уровня шума','FontSize',12,'FontWeight','bold');
>> grid on
>> p2=randn(size(input_param))*0.05+input_param;
>> [an,E]=sim(net,p2);
>> figure(2);
>> plot(p2,output_param,'+',p2,an,'-',input_param,output_param,':','LineWidth',1.5)
>> legend('вход','выход','2*(sin(x))^2');
>> title('Аппроксимация функции y=2*(sin(x))^2 двухслойной нейронной сетью','FontSize',12,'FontWeight','Bold');
>> grid on
>> E=mse(an-output_param);
>> gensim(net);
>> x = [0:0.05:1];
>> y=2.* sin(input_param).^2;
>> p=polyfit(x,y,20)
> In polyfit at 80
>> f=polyval(p,xt);
>> xt=x+0.05*randn(size(x));
>> yp=polyval(p,xt);
>> figure(1);
>> plot(xt,y,'+',xt,yp,'-',x,y,':','LineWidth',1.5);
>> legend('Вход','Выход','2.* sin(x).^2;');
>> title('Аппроксимация функции y=2.* sin(x).^2 полиномами', 'FontSize',14);
>> grid on
>> err=sqrt(sum((y-yp).^2)/20)
Документ
Категория
Разное
Просмотров
290
Размер файла
712 Кб
Теги
нейронная, отчет, сеть
1/--страниц
Пожаловаться на содержимое документа