Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Обучение сети

Читайте также:
  1. I. Правильное обучение и правильное изучение
  2. IV. Обучение и исцеление
  3. Ассоциативное обучение, когнитивные процессы .............................. 64
  4. Больцмановское обучение
  5. Больцмановское обучение нейронных сетей.
  6. Вопрос 62. Обучение и воспитание дошкольников с нарушениями слуха
  7. Вопрос 63. Обучение школьников

Правила настройки параметров

Правило LVQ1. LVQ - сеть обучается на основе множества пар вход/выход, составленных из элементов обучающей последовательности:

{p1, t1}, {p2, t2}, …, {pQ, tQ}.

Каждый целевой вектор имеет единственный элемент, равный единице, а остальные элементы равны нулю.

Для обучения сети необходимо задать вектор входа р,и тогда в конкурирующем слое будет выполнена настройка элементов матрицы IW11. Предположим, что при задании вектора входа p(q) весовые коэффициенты нейрона i* входного слоя наиболее близки к вектору входа p(q) и нейрон i* выигрывает конкуренцию. Тогда конкурирующая функция активации compet выдаст 1 в качестве i* -го элемента вектора выхода a1 первого слоя сети, причем все другие элементы a1 будут равны 0. Во втором, линейном слое, произведение матрицы весов LW21 × a1 выявляет некоторый столбец LW21, в котором единичное значение указывает на класс k*. Таким образом, сеть связывает вектор входа p(q) с классом k*. Это назначение может оказаться либо правильным, либо ошибочным. Поэтому в процессе обучения необходимо откорректировать строку i* матрицы IW11 таким образом, чтобы приблизить ее к вектору p(q), если назначение правильное, и удалить от вектора p(q) если назначение неправильное. Т.о. можно сформулировать правило LVQ1 для настройки параметров сети:

Это правило гарантирует, что при правильной классификации нейрон-победитель приближается к векторам входа данного класса, а при неправильной классификации удаляется от них. Оно различается функцией настройки весов слоя LVQ -сети learnlv1. Другая функция настройки весов learnlv2 позволяет улучшить настройку параметров.

Правило LVQ2. Это правило предназначено для того, чтобы улучшить настройку параметров сети после применения стандартной процедуры LVQ1. Правило LVQ2 во многом схоже с правилом LVQ1, за исключением лишь того, что в соответствии с правилом LVQ2 корректируется 2 весовых вектора, ближайших к входному; причем один из них должен быть классифицирован как правильный, а второй – нет. Введем следующие понятия, чтобы дать количественную оценку свойства близости векторов. Пусть di и dj – евклидовы расстояния вектора входа p от соответствующих строк i* и j* весовой матрицы IW11, причем строка j* принадлежит к области в пространстве признаков, соответствующей требуемому классу, а строка i* не принадлежит. Если выполняется условие

min(di*/ dj*, dj*/ di*) > 0.5 ÷ 0.7,

то два весовых вектора с евклидовыми расстояниям di и dj до вектора входа p считаются близкими, производится корректировка и правило настройки соответствующих весовых векторов выглядит следующим образом:

Процедура обучения

Для удобства работы с текстом повторим операторы задания обучающей последовательности и формирования LVQ-сети

P = [-3 -2 -2 0 0 0 0 +2 +2 +3;

0 +1 -1 2 1 -1 -2 +1 -1 0];

Tc = [1 1 1 2 2 2 2 1 1 1 ];

T = full(ind2vec(Tc));

Выполним синтез LVQ-сети:

net = newlvg(minmax(P),4, [.6.4]);

net.inputWeights{1}

ans =

delays: 0

initFcn: 'midpoint'

learn: 1

learnFcn: 'learnlv1'

learnParam: [1x1 struct]

size: [4 2]

userdata: [1x1 struct]

weightFcn: 'negdist'

Для обучения сети применим М-функцию train, задав количество циклов обучения равным 2000, и значение параметра скорости обучения 0,5:

net.trainParam.epoch = 2000;

net.trainParam.show = 100;

net.trainParam.lr = 0.05;

net = train(net, P, T);

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

V = net.IW{1,1}

V =

-0.2016 0.0002

0.2038 0.0095

0 0.0688

0 -0.0592

Построим картину распределения входных векторов по кластерам (рис. 4.2)

I1 = find(Tc == 1); % – вектор индексов первого класса;

I2 = find(Tc == 2); % – вектор индексов второго класса;

axis([-4,4,-3,3]) % – диапазоны для X и Y;

P1 = P(:, I1) % – векторы первого класса;

P2 = P(:, I2) % – векторы второго класса;

plot(P1(1,:), P1(2,:), '+k'), hold on

plot(P2(1,:), P2(2,:), 'xb'), hold on

plot(V(:, 1), V(:, 2), 'or')

Рисунок 4.2 – Распределение входных векторов

 

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

net.LW{2}

ans =

1 1 0 0

0 0 1 1

 

Нетрудно заметить, что обучение сети выполнено правильно. Чтобы проверить функционирование сети, подадим на ее вход массив обучающих векторов Р:

Y = sim(net, P)

Yc = vec2ind(Y)

 

Yc =

1 1 1 2 2 2 2 1 1 1

 

Результат подтверждает, что классификация выполнена правильно.

Построим границу, разделяющую области точек, принадлежащих к двумклассам. Для этого покроем сеткой прямоугольную область и определим принадлежность каждой точки к тому или иному классу:

 

x = -4:0.2:4;

y = -3:0.2:3;

P = mesh2P(x,y);

Y = sim(net,P);

Yc = vec2ind(Y);

I1 = find(Yc == 1); I2 = find(Yc == 2);

plot(P(1,I1),P(2,I2), '+k'), hold on

plot(P(1,I1),P(2,I2), '*b')

Построение разделяющей линии для классов:

function P = mesh2P(x,y) % – начало М-функции;

%Вычисление массива координат прямоугольной сетки

[X,Y] = meshgrid(x,y);

P = cat(3,X,Y);

[n1,n2,n3] = size(P);

P = permute(P,[3 2 1]);

P = reshape(P,[n3 n1*n2]);

% конец М-функции.

 

Наряду с процедурой обучения можно применить и процедуру адаптации в течение 200 циклов для 10 векторов, что равносильно 2000 циклам обучения с использованием функции train

net.adaptparam.passes = 200;

 

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

Pseq = con2seq(P);

Tseq = con2seq(T);

net = adapt(net,Pseq,Tseq);

net.IW{1,1}

 

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

Y = sim(net,P);

Yc = vec2ind(Y)

 

Результаты настройки параметров сети в процессе адаптации практически совпадают с результатами обучения.

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

Процедуру адаптации еще можно реализовать с использованием случайной последовательности входов, например, следующим образом: сформируем 2000 случайных векторов и выыполним только 1 цикл адаптации:

TS = 2000;

Ind = floor(rand(1,TS)*size(P,2))+1;

Pseq = con2seq(P(:,ind));

Tseq = con2seq(T(:,ind));

net.adaptparam.passes = 1;

net = adapt(net,Pseq,Tseq);

net.IW{1,1}

Y = sim(net,P);

Yc = vec2ind(Y)

 

В результате получаем LVQ-сеть, подобную тем, которые были получены ранее с помощью процедур обучения и адаптации.

 

Ход работы

1. Изучить LVQ-сеть на примере demolvq1.

2.Создать нейронную LVQ-сеть для обучающей последовательности двухэлементных векторов, имеющих 4 нейрона во входном слое и 2 нейрона в выходном с распределением [0.6 0.4], проанализировать ее структурную схему и значения параметров вычисленной модели, обучить сеть и промоделировать ее на обучающей последовательности, выполнив следующие команды:

P = [-3 -2 -2 0 0 0 0 +2 +2 +3;... % обучающая последовательность: 3 первых и 3 последних вектора

0 +1 -1 2 1 -1 -2 +1 -1 0]; % относятся к классу 1, а 4 промежуточных – к классу 2

Tc = [1 1 1 2 2 2 2 1 1 1 ]; % – индексы классов;

T = ind2vec(Tc); % – разряженная целевая матрица;

T = full(T); % – полная целевая матрица;

net = newlvq(minmax(P), 4, [0.6 0.4]); % – параметры вычисли-

% тельной модели

gensim(net); % – структурная схема LVQ-сети;

net = train(net, P, T); % – обучение сети со значениями

%параметров по умолчанию;

Y = sim(net, P) % – моделирование LVQ-сети;

P = [-3 -2 -2 0 0 0 0 +2 +2 +3;...

0 +1 -1 2 1 -1 -2 +1 -1 0];

Tc = [1 1 1 2 2 2 2 1 1 1 ]; % – индексы классов;

T = ind2vec(Tc); % – разряженная целевая матрица;

T = full(T); % – полная целевая матрица;

net = newlvq(minmax(P), 4, [0.6 0.4]); % – параметры вычисли-

% тельной модели

gensim(net); % – структурная схема LVQ-сети;

net = train(net, P, T); % – обучение сети со значениями

%параметров по умолчанию;

Y = sim(net, P) % – моделирование LVQ-сети;

Yc = vec2ind(Y) % – индексы классов, которые получила сеть;

% Сравнить Yc и Tc.

 

3. Повторить первое задание для всевозможных векторов индексов и выявить случаи несовпадения Yc и Tc, т. е. случаи неправильной классификации.

 

4. Создать нейронную LVQ-сеть с теми же параметрами, что и в первом задании, обучить сеть, промоделировать ее, построить график распределения входных векторов по кластерам и разделяющую линию областей точек, принадлежащих разным классам, выполнив следующие команды:

P = [-3 -2 -2 0 0 0 0 +2 +2 +3;... % обучающая последовательность: 3 первых и 3 последних вектора

0 +1 -1 2 1 -1 -2 +1 -1 0]; % относятся к классу 1, а 4 промежуточных – к классу 2

Tc = [1 1 1 2 2 2 2 1 1 1 ]; % – индексы классов;

T = full(ind2vec(Tc));

net = newlvg(minmax(P),4,[.6.4]);

net.inputWeights{1,1}

net.IW{1,1} % – веса входного слоя после инициализации;

net.LW{2,1} % – веса выходного слоя после инициализации;

net.b{1}, net.b{2}

net.trainParam.epoch = 2000;

net.trainParam.show = 100;

net.trainParam.lr = 0.05;

net = train(net,P,T);

net.IW{1,1} % – веса выходного слоя после обучения;

net.LW{2,1} % – веса выходного слоя после обучения;

I1 = find(Tc == 1); % – вектор индексов первого класса;

I2 = find(Tc == 2); % – вектор индексов второго класса;

axis([-4,4,-3,3]) % – диапазоны для X и Y;

P1 = P(:,I1) % – векторы первого класса;

P2 = P(:,I2) % – векторы второго класса;

V = net.IW{1,1} % – веса выходного слоя;

plot(P1(1,:),P1(2,:), ′+k′), hold on

plot(P2(1,:),P2(2,:), ′xb′), hold on

plot(V(:,1),V(:,2), ′or′)

Y = sim(net,P)

Yc=vec2ind(Y)

% Построение разделяющей линии для классов:

x = -4:0.2:4;

y = -3:0.2:3;

P = mesh2P(x,y);

Y = sim(net,P);

Yc = vec2ind(Y);

I1 = find(Yc == 1); I2 = find(Yc == 2);

plot(P(1, I1),P(2, I2), ′+k′), hold on

plot(P(1, I1),P(2, I2), ′*b′).

 

 

function P = mesh2P(x,y)

%Вычисление массива координат прямоугольной сетки

[X,Y] = meshgrid(x,y);

P = cat(3,X,Y);

[n1,n2,n3] = size(P);

P = permute(P,[3 2 1]);

P = reshape(P,[n3 n1*n2]);

% конец М-функции.

 

5. Создать нейронную LVQ-сеть для разбиения двухэлементных векторов на 8 кластеров и 4 класса, обучить сеть, промоделировать ее, построить график распределения векторов по кластерам и разделяющую границу векторов, модифицируя команды 4-го задания.


Дата добавления: 2015-11-30; просмотров: 29 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.021 сек.)