Нейронные сети Лаба 2
.pdfКак видно из этого графика, для настройки нейронной сети нужно приблизительно 0,5 с., а далее до 4-й секунды сигнал отслеживается с высокой точностью. После мгновенной смены частоты сигнала, нейронная сеть настраивается на новый сигнал уже за 0,25 с. Это обусловлено тем, что частота снимания сигнала возросла вдвое.
В завершение отметим основные достоинства и ограничения линейных
сетей:
Однослойные линейные сети могут решать задачи линейной аппроксимации функций и распознавания образов
Однослойные линейные сети могут быть или рассчитаны непосредственно, или обучены с использованием правила обучения WH. Кроме того, для их обучения могут использоваться процедуры адаптации.
Архитектура однослойной линейно сети полностью определяеся решаемой задачей, причем число входов в сети и число нейронов в слое определяется числом входов и выходов задачи.
Адаптивные линейные сети ADALINE находят широкое практическое применение при построении цифровых фильтров для обработки сигналов.
Линейные нейронные сети могут быть успешно научены только в том случае, если входы и выходы связаны линейно. Однако даже в случае, когда линейная сеть не может найти точного решения, она в состоянии построить решение, наиболее близкое в смысле среднекватратичного отклонения, при условии, что параметр обучения достаточно мал. Такая сеть найдѐт наиболее точное решение в рамках линейной структуры. Это обусловлено тем, что поверхность ошибки обучения является многомерным парабалоидом и имеет единственный минимум, а значит алгоритм градиентного спуска должен приводить решение в этот минимум.
При работе с моделями линейных сетей могут возникнуть ситуации, когда число настраиваемых параметров недостаточно, чтоб выполнить все условия. В этом случае говорят, что сеть переобозначена (терминология линейной алгебры). Но может иметь место и обратная ситуация, когда число настраиваемых параметров слишком велико, в этом случае говорят, что сеть недообозначена. Однако в обоих случаях метод наименьших квадратов осуществляет настройку, пытаясь минимизировать ошибку сети.
Решения линейной задачи при помощи линейной нейронной сети может быть реализовано следующим образом. Если .суммарное количество
весов и сдвигов линейной сети , где R — количество входов, S - количество слоѐв, равняется количеству пар векторов входа и цели, то такая задача разрешима с помощью линейной нейронной сети. Это справедливо за исключением того случая, когда векторы входа линейно зависимы и используется сеть без сдвигов.
На практике линейная сеть обычно используется не сама по себе, а как обучаемый сумматор на выходе другой сети.
2.3Порядок выполнения работы
1.Повторить теоретический материал по линейным нейронным сетям и алгоритмам обучения
2.Провести моделирование линейной нейронной сети
3.Провести обучение параметров линейной нейронной сети
4.Решить задачу наблюдения за нестационарным сигналом при помощи линейной нейронной сети (в соответствии с вариантом задания в таблице 2.1) Меняя значение параметра скорости настройки lr , количество эпох обучения и количество задержек, настроить линейную сеть так, чтобы ошибка была минимальной; описать зависимость результата от данных параметров.
5.Провести анализ полученных результатов.
Таблица 2.1 – Варианты задания
№ |
Сигнал |
||
time1=0:0.05:5 |
time2=5.05:0.025:10 |
||
|
|||
1. |
y sin(3x) cos(5x); |
y cos(5x) sin(4x) 0.5cos(87x); |
|
2. |
y cos(5x) sin(4x) 0.5cos(87x); |
y sin(x) 0.25sin(12x); |
|
3. |
y sin(x) 0.25sin(12x); |
y cos(6x) sin(5x) arctan(0.25x); |
|
4. |
y cos(6x) sin(5x) arctan(0.25x); |
y sin(0.5x) cos(4x); |
|
5. |
y sin(0.5x) cos(4x); |
y cos(2x) sin(7x) tanh(2x); |
|
6. |
y cos(2x) sin(7x) tanh(2x); |
y x cos(2x) sin(5x); |
|
7. |
y x cos(2x) sin(5x); |
y cos(4x) sin(7x) arctan(2x) |
|
8. |
y cos(4x) sin(7x) arctan(2x) |
y cos(x2 ) sin(2x); |
|
9. |
y cos(x2 ) sin(2x); |
y cos(5x) sin(2x) 0.35sin(98x); |
|
10. |
y cos(5x) sin(2x) 0.35sin(98x); |
y sin(0.5x) 0.72sin(4x) 0.25sin(35x); |
|
11. |
y sin(0.5x) 0.72sin(4x) 0.25sin(35x); |
y sin(x cos(2x)) ; |
|
|
|
|
|
12. |
y sin(x cos(2x)) ; |
y cos(2x) sin(8x) 0.23cos(3x); |
|
|
|
|
|
13. |
y cos(2x) sin(8x) 0.23cos(3x); |
y 0.75sin(5x) cos(9x); |
|
14. |
y 0.75sin(5x) cos(9x); |
y cos(2x) sin(10x) 0.65sin(45x); |
|
15. |
y cos(2x) sin(10x) 0.65sin(45x); |
y sin(3x) cos(5x); |
Дополнительные задания:
1.Описать и исследовать поверхности ошибок других критериев обучения и других нейронных сетей.
2.Реализовать Адалину
3.Решить задачу классификации с помощью линейной сети или Адалины.
2.4Содержание отчѐта
1.Название работы;
2.Цель работы
3.Описание используемой нейронной сети и еѐ архитектуры
4.Описание и результаты экспериментов, выполненных в ходе работы, и выводы из них.
5.Расширенные выводы к лабораторной работе
Приложения:
1.Код рисунка 2.4:
#-*- coding: utf-8 -*- import neurolab as nl import numpy as np import pylab as pl
#Задаём границы и шаг графика: w = np.arange(-2, 2, 0.05)
b = np.arange(-2, 2, 0.05) X,Y = np.meshgrid(w,b)
#Задаём функцию ошибки:
mse = nl.error.MSE()
# Задаём обучающую выборку:
P = array([[1],[-1.2]]) #входной сигнал T = array([[0.5],[1]]) #обучающий сигнал
# Задаём сеть:
net = nl.net.newp([[-1,1]], 1, nl.trans.PureLin())
# Собираем данные об ошибке:
data = np.empty((len(w),len(b))) # массив для значений ошибки
# Для каждого сочетания веса и сдвига for j in range(len(b)):
for i in range(len(w)):
#инициализируем сеть соответствующей парой значений net.layers[ 0].np['w'] = [[w[i]]]
net.layers[ 0].np['b'] = [b[j]]
#вычисляем ошибку полученной сети
e = mse(T - net.sim(P))
# заносим значение в массив data[j][i] = e
# Строим график:
pl.contour(w, b, data, 50) # выводим 50 изолиний pl.grid() # добавляем сетку
pl.colorbar() # добавляем шкалу pl.title('MSE contour') # добавляем заголовок
pl.xlabel('weight') # добавляем метку абсциссы pl.ylabel('bias') # добавляем метку ординаты pl.show() # выводим на экран (для старых версий)
#Добавляем на график найденное сетью оптимальное значение: err = net.train(P,T,goal = 0.000,show = 0)
weight = net.layers[0].np['w'] bias = net.layers[0].np['b'] pl.plot(weight, bias, 'o')
2.Сбор данных о траектории системы
#Переинициализируем сеть
net = nl.net.newp(nl.tool.minmax(P), T.shape[-1], nl.trans.PureLin()) n = 15 # число эпох обучения
err = np.empty(n) # массив для значений ошибки
w,b = [],[] # массивы весов и сдвигов соответственно
#Запускаем n циклов обучения for i in range(n):
#запоминаем веса
w = np.append(w, net.layers[0].np['w']) b = np.append(b, net.layers[0].np['b'])
# проводим одну эпоху обучения
e = net.train(P,T,goal = -1,show = 0, epochs = 2, lr = 0.4*maxlr) err[i] = e[0] # запоминаем ошибку
pl.plot(w,b,'r-o') # выводим на экран
3. Код рисунка 2.5а
Z = data # массив значений ошибки, собранный в приложении 1. fig = pl.figure(2) # создаём новое окно
ax = fig.gca(projection='3d') # получаем оси трёхмерного графика ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1) # выводим на экран данные из приложения 1 в виде проволочной сетки.
ax.plot3D(w, b, err, 'r-o') # выводим на экран данные о траектории системы из приложения 2.
ax.contour(X, Y, Z, zdir='z', offset= 0, stride = 1) # выводим проекцию по направлению z. Она должна совпадать с рисунком 2.4
pl.show()
Для дополнительных сведений см. matplotlib.sourceforge.net/examples/index.html и matplotlib.sourceforge.net/gallery.html