Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5336

.pdf
Скачиваний:
1
Добавлен:
13.11.2022
Размер:
1.25 Mб
Скачать

41

T=[1 1 0 0]; % определение входов нейронов (реакции на входы P)

plotpv(P, T); % изображение входных векторов двух категорий, категория задаётся элементами вектора T – см. рисунок 20.

Vectors to be Classified

1.5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P(2)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-0.5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

1.2

 

 

 

 

 

 

 

 

 

P(1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рисунок 20 – Исходные векторы, предназначенные для классификации нейроном

net=newp([-1 1; -1 1], 1);

linehandle=plotpc(net.IW{1}, net.b{1}); % получение управляющей структуры linehandle для изображения разделяющей линии в координатах весов (IW) и

порога срабатывания нейрона (b)

plotpc(net.IW{1}, net.b{1}); % изображение разделяющей прямой cla; % очистка координатных осей

plotpv(P, T);

linehandle=plotpc(net.IW{1}, net.b{1}); % получение управления структуры linehandle

E=1; % присвоение начального значения ошибки net=init(net); % инициализация нейрона linehandle=plotpc(net.IW{1}, net.b{1});

while(mse(E))'; % организация цикла пока ошибка не равна 0

[net, Y, E]=adapt(net, P, T); % адаптация нейрона net на обучающей выборке <P, T>, функция возвращает адаптированный нейрон net, выход Y, ошибку E

42

linehandle=plotpc(net.IW{1}, net.b{1}, linehandle); % изображение разделяющей прямой нейрона после адаптации

drawnow; % очистка окна графиков end; − см. рисунок 21.

Vectors to be Classified

1.5

1

0.5 P(2) 0

-0.5

-1

-0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1 1.2 P(1)

Рисунок 21 – Прямая, разделяющая исходные векторы на классы

Проведём классификацию одного вектора с помощью обученного нейрона на основе функции sim.

P=[-0.3; 1.0]; % определение вектора P

a=sim(net, P); % имитация работы нейрона net, получение отклика нейрона a plotpv(P, a); % изображение входа p, отнесенного нейроном к категории a – см.

рисунок 22.

hold on; % включить режим добавления графиков

plotpv(P, T); % изображение входных точек в соответствии с категориями T plotpc(net.IW{1}, net.b{1}); % изображение разделяющей поверхности

hold off; % отключить режим добавления графиков – см. рисунок 23.

43

P(2)

Vectors to be Classified 1.1

1.08

1.06

1.04

1.02

1

0.98

0.96

0.94

0.92

0.9 -0.4 -0.38 -0.36 -0.34 -0.32 -0.3 -0.28 -0.26 -0.24 -0.22 -0.2

P(1)

Рисунок 22 – Вектор P, отнесённый нейроном к категории a

P(2)

Vectors to be Classified 1.1

1.08

1.06

1.04

1.02

1

0.98

0.96

0.94

0.92

0.9 -0.4 -0.38 -0.36 -0.34 -0.32 -0.3 -0.28 -0.26 -0.24 -0.22 -0.2

P(1)

Рисунок 23 – Исходный вектор

7.Создание слоя линейных нейронов

P1={-1 0 0 0 1 1 -1 0 -1 1}; % последовательность входов

T1={-1 -1 1 0 1 2 0 -1 -1 1}; % последовательность выходов

net=newlin([-1 1], 1, [0 1], 0.1); % создание линейного слоя из одного нейрона со значениями входа в интервале [-1; 1], задержками входа от 0 до 1 и уровнем обучения 0,1

[net, y, e, pf]=adapt(net, P1, T1); % адаптация нейрона к последовательности p1 mse(e); % измерение ошибки

p2={1 -1 -1 1 1 -1 0 0 0 1};

44

t2={2 0 -2 0 2 0 -1 0 0 1};

[net, y, e, pf]=adapt(net, p2, t2, pf); % адаптация с начальным вектором задержки pf mse(e);

p3=[P1 p2]; % формирование новой последовательности входов t3=[T1 t2]; % формирование новой последовательности выходов net.adaptParam.passes=100; % установка количества проходов

[net, y, e]=adapt(net, p3, t3); % адаптация нейрона mse(e);

8. Изучение возможности линейного нейрона решать несепарабельные задачи

P=[-0.2 +0.3 +0.3 -0.7 -0.4; -0.8 +0.2 -0.5 -1.0 +0.1]; % входы линейного нейрона

T=[1 0 1 0 1]; % выходы – реакции нейрона на входы P net=newp([-2 2; -2 2], 1); % создание нейрона

plotpv(P, T); % изображение обучающей выборки – см. рисунок 24.

Vectors to be Classified

P(2)

0.6

0.4

0.2

0

-0.2 -0.4 -0.6 -0.8

-1

-1.2 -1.4

-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

 

 

 

 

P(1)

 

 

 

 

 

Рисунок 24 – Линейно несепарабельные исходные векторы

linehandle=plotpc(net.IW{1}, net.b{1}); % изображение разделяющей прямой for a=1 : 25; % организация цикла обучения нейрона

[net, Y, E]=adapt(net, P, T); % адаптация нейрона

Linehandle=plotpc(net.IW{1}, net.b{1}, linehandle); % получение управляющей структуры изображения для новой разделяющей прямой

drawnow; % изображение разделяющей прямой см. рисунок 25.

45

end;

Vectors to be Classified

P(2)

0.6

0.4

0.2

0

-0.2 -0.4 -0.6 -0.8

-1

-1.2 -1.4

-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

 

 

 

 

P(1)

 

 

 

 

 

Рисунок 25 – Прямая, не разделяющая исходные векторы на классы

9.Процесс обучения линейного нейрона

P=[-1.0 0.6]; % определение входов нейрона

T=[0.0 0.2]; % определение выходов нейрона w=-1.5 : 0.2 : 1.5; % установка интервала весов

b=-1.5 : 0.2 :1.5; % установка интервала пороговых значений

ES=errsurf(P, T, w, b, 'purelin'); % формирование поверхности ошибки в координатных осях – весов и пороговых значений

plotes(w, b, ES); % изображение поверхности ошибки – см. рисунок 26.

 

 

Error Surface

 

 

Error Contour

 

 

 

 

 

 

1.5

 

 

 

 

 

 

 

1

 

 

Error

5

 

 

 

0.5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Sum Squared

0

 

 

 

 

 

 

-5

 

 

 

0

 

 

 

 

 

BiasB

 

 

 

 

 

 

 

 

 

 

 

 

 

-0.5

 

 

 

1

 

 

 

-1

 

 

 

 

0

 

1

 

 

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

Bias B

-1

-1

 

-1.5

 

 

 

 

 

Weight W

-1

0

1

 

 

 

 

 

 

 

 

 

 

Weight W

 

Рисунок 26 – Поверхность ошибки

46

maxlr=0.20*maxlinlr(P, 'bias'); % возвращение максимального уровня обученности для линейного слоя с bias

net=newlin([-2 2], 1, [0], maxlr);

net.trainParam.goal=.001; % установка целевого значения ошибки

ES=errsurf(P, T, w, b, 'purelin'); % формирование поверхности ошибки plotes(w, b, ES); % изображение поверхности ошибки

subplot(1, 2, 2); % создание 2 координатных осей в графическом окне и установка первых осей активными

net.IW{1, 1}=0;

net.b{1}=0.5; % произвольное изменение весов нейронов

[net, tr]=train(net, P, T); % эпоха обучения нейрона, формирование истории обучения tr plotperf(tr, net.trainParam.goal); % изображение истории обучения на поверхности ошибки

p=-1.1; % формирование выхода обученного нейрона для входа -1, 1 a=sim(net, p); − см. рисунок 27.

 

100

 

 

Performance is 0.00089338, Goal is 0.001

 

 

 

 

 

 

 

 

 

 

 

10-1

 

 

 

 

 

 

 

Goal-Black

10-2

 

 

 

 

 

 

 

Training-Blue

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10-3

 

 

 

 

 

 

 

 

10-4

0

2

4

6

8

10

12

 

 

 

 

 

12 Epochs

 

 

 

Рисунок 27 – Изменение среднеквадратичной ошибки в ходе обучения

47

2.4. Лабораторная работа 4

Тема: Изучение многослойного нелинейного персептрона и алгоритма обратного распространения ошибки

Цель работы – изучение архитектуры персептрона и специальных функций для создания персептрона, настройки его весов и смещений и адаптации,

ознакомление с демонстрационными примерами, а также приобретение навыков построения и обучения персептронов для различных областей применения.

Теоретические сведения

Персептрон – это однослойная нейронная сеть с S нейронами и R входами,

каждый из которых может состоять из нескольких элементов. Передаточной функцией каждого нейрона является ступенчатая функция типа hardlim или hardlims. Помимо основных входов, нейроны персептрона имеют вход для постоянного смещения, равного единице. Элементы входов и смещения взвешиваются с помощью функции скалярного произведения dotprod и

суммируются с помощью функции накопления netsum.

Создание персептрона производится следующей функцией:

net = newp(PR, S, tf, lf),

где net – объект класса network;

PR – массив размера Rx2 минимальных и максимальных значений для R

векторов входа;

S – число нейронов персептрона;

tf – передаточная функция из списка { hardlim, hardlims }, причём по умолчанию задается hardlim;

lf – обучающая функция из списка {learnp, learnpn}, причём по умолчанию – learnp.

При создании персептрона, матрица весов и вектор смещений инициализируются нулями с помощью функций initzero.

Обучение персептрона производится с помощью функции адаптации adapt,

48

которая корректирует веса и смещения по результатам обработки каждой пары входных и выходных значений (обучение с учителем). Применение функции adapt гарантирует, что любая задача классификации с линейно отделимыми векторами будет решена за конечное число циклов настройки. Функция обучения train, когда настройка параметров сети выполняется не после каждого прохода, а в результате всех проходов обучающего множества, в ряде случаев не обеспечивает сходимости процесса настройки, поэтому не используется для обучения персептрона.

Настройка весов и смещений, реализуемая функциями learnp и learnpn,

производится по следующим правилам:

а) для входных сигналов вычисляются выходные;

б) определяются ошибки как разность между целевым выходом и соответствующим выходным сигналом;

в) производится корректирование весов и смещений путём сложения старых значений с приращениями, каждое из которых равно произведению соответствующего сигнала на ошибку того нейрона, для которого корректируется параметр.

Для того чтобы сделать время обучения нечувствительным к большим или малым выбросам векторов входа, производят нормирование входных данных при вычислении приращений весов и смещений:

pni = pi (sqrt(1+ p12 +…+ pr2)).

Такое нормирование обеспечивается применением функции learnp для настройки как весов, так и смещений. Также автоматически свойству net.adaptFcn

задаётся значение adaptwb, что позволяет использовать любые функции для настройки весов и смещений, а свойству net.adaptParam – набор параметров по умолчанию.

Адаптация персептрона производится функцией-методом adapt (net,P,T),

где P – входные векторы; T – целевые значения. Процесс адаптации продолжается до тех пор, пока не будет достигнуто требуемое значение критерия

49

качества обучения в виде средней абсолютной ошибки, вычисляемой функцией

mae.

Самостоятельная работа

Задание 1. Создать персептрон с одним нейроном и одноэлементным входом, диапазон значений которого от 0 до 1, и проанализировать значения параметров его вычислительной модели, выполнив следующие действия:

1. Создать и инициализировать персептрон:

net = newp([0 1], 1)

 

% – на экране весь объект;

net.inputWeights{1,1}

% – веса входа объекта;

net.biases{1}

 

% – смещение нейрона;

net.IW{1,1}

 

% – значение весов;

net.b{1}

 

% – значение смещения;

net.IW{1,1}=[3]

 

% – задание веса;

net.b{1}=[4]

 

% – задание смещения;

net = init(net);

 

% – инициализация нулями;

net.IW{1,1}

 

% – нулевое значение веса;

net.b{1}

 

% –нулевое значение смещения;

net.inputWeights{1,1}.initFcn=rands;

net.biases{1}.initFcn=rands;

net = init(net);

 

% – инициализация случайными значениями;

net.IW{1,1}, net.b{1}

% – новые значения;

p = {[0] [1] [0.5]};

 

% – последовательность входов;

a = sim(net, p)

% – моделирование сети;

Задание 2. Создать персептрон с одним нейроном и двоичным входом и настроить его параметры, сначала для выполнения логической функции AND, а

затем для выполнения логической функции OR, выполнив следующие действия:

1. Создать персептрон:

net = newp([0 1;0 1], 1).

50

2. Подготовить обучающие последовательности:

p={[0;0] [0;1] [1;0] [1;1]};

 

p1=cat(2, p{:});

 

T1=num2cell(p1(1,:) & p1(2,:))

% – функция AND;

T2=num2cell(p1(1,:) | p1(2,:))

% – функция OR.

3. Настроить параметры персептрона для выполнения логической функции

AND, используя процедуру адаптации:

 

net.adaptParam.passes = 10;

% – число проходов;

net.adapt(net,p,T1);

% – настройка на AND;

net.IW{1,1},net.b{1}

% – линия 2p1 + p2 –3=0;

Y =sim(net,p)

% – моделирование AND.

4. Настроить параметры персептрона для выполнения логической

функции OR, используя процедуру обучения:

net.trainParam.epochs=20;

% – число циклов;

net = init(net);

% – инициализация;

net = train(net,p,T2);

% – настройка на OR;

net.IW{1,1},net.b{1}% – линия 2p1 + 2p2 –2=0;

 

Y = sim(net,p)

% – моделирование OR.

 

Задание 3 . Используя пошаговый

режим адаптации

и обучения,

проследить изменения весов, смещения,

выходного значения и

ошибки для

персептрона, рассмотренного в третьем

задании. Для этих целей использовать

команды:

 

 

 

 

net.adaptParam.passes = 1;

 

 

 

net.trainParam.epochs = 1;

 

 

 

[net,Y,e]=adapt(net,p,T1);

% – для AND;

 

[net, Y,e]=train(net,p,T2);

% – для OR;

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]