Главная страница
Навигация по странице:

Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6. В. Г. Потемкин



Скачать 14.83 Mb.
Название В. Г. Потемкин
Анкор Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc
Дата 26.04.2017
Размер 14.83 Mb.
Формат файла doc
Имя файла Медведев В.С., Потемкин В.Г. Нейронные сети. MATLAB 6.doc
Тип Книга
#3790
страница 15 из 50
1   ...   11   12   13   14   15   16   17   18   ...   50

4.1. Архитектура персептрона


Нейрон персептрона. Нейрон, используемый в модели персептрона, имеет ступенчатую функцию активации hardlim с жесткими ограничениями (рис. 4.1).

Каждый элемент вектора входа персептрона взвешен с соответствующим весом w1j,
и их сумма является входом функции активации. Нейрон персептрона возвращает 1, если вход функции активации n  0, и 0, если n < 0.

Рис. 4.1

Функция активации с жесткими ограничениями придает персептрону способность классифицировать векторы входа, разделяя пространство входов на 2 области, как это показано на рис. 4.2 для персептрона с двумя входами и смещением.

Рис. 4.2

Пространство входов делится на 2 области разделяющей линией L, которая для двумерного случая задается уравнением

(4.1)

Эта линия перпендикулярна к вектору весов w и смещена на величину b. Векторы входа выше линии L соответствуют положительному потенциалу нейрона, и, следовательно, выход персептрона для этих векторов будет равен 1; векторы входа ниже линии L соответствуют выходу персептрона, равному 0. При изменении значений смещения и весов граница линии L изменяет свое положение. Персептрон без смещения всегда формирует разделяющую линию, проходящую через начало координат; добавление смещения формирует линию, которая не проходит через начало координат, как это показано на рис. 4.2. В случае, когда размерность вектора входа превышает 2, разделяющей границей будет служить гиперплоскость.

Демонстрационная программа nnd4db наглядно иллюстрирует перемещение разделяющей линии при решении задачи классификации векторов входа.

Архитектура сети. Персептрон состоит из единственного слоя, включающего S нейронов, как это показано на рис. 4.3, а и б в виде соответственно развернутой и укрупненной структурных схем; веса wij – это коэффициенты передачи от j-го входа к i-му нейрону.

Уравнение однослойного персептрона имеет вид:

. (4.2)



а


б

Рис. 4.3

4.2. Модель персептрона


Для формирования модели однослойного персептрона предназначена функция newp

net = newp(PR, S)

со следующими входными аргументами: PR – массив минимальных и максимальных значений для R элементов входа размера R2; S – число нейронов в слое.

В качестве функции активации персептрона по умолчанию используется функция hardlim.

Пример:

Функция

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

создает персептрон с одноэлементным входом и одним нейроном; диапазон значений входа – [0 2].

Определим некоторые параметры персептрона, инициализируемые по умолчанию.

Веса входов:

inputweights = net.inputweights{1,1}

inputweights =

delays: 0

initFcn: 'initzero'

learn: 1

learnFcn: 'learnp'

learnParam: []

size: [1 1]

userdata: [1x1 struct]

weightFcn: 'dotprod'

Заметим, что функция настройки персептрона по умолчанию learnp; вход функции активации вычисляется с помощью функции скалярного произведения dotprod; функция инициализации initzero используется для установки нулевых начальных весов.

Смещения:

biases = net.biases{1}

biases =

initFcn: 'initzero'

learn: 1

learnFcn: 'learnp'

learnParam: []

size: 1

userdata: [11 struct]

Нетрудно увидеть, что начальное смещение также установлено в 0.

Моделирование персептрона


Рассмотрим однослойный персептрон с одним двухэлементным вектором входа,
значения элементов которого изменяются в диапазоне от –2 до 2:

net = newp([–2 2;–2 2],1); % Создание персептрона net

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

net.IW{1,1}= [–1 1];

net.b{1} = [1];

В этом случае разделяющая линия имеет вид:

L: –p1 +p2 +1 = 0.

Это соответствует рис. 4.1.

Структурная схема модели персептрона показана на рис. 4.4

Рис. 4.4

Теперь определим, как откликается сеть на входные векторы p1и p2, расположенные по разные стороны от разделяющей линии:

p1 = [1; 1];

a1 = sim(net,p1) % Моделирование сети net с входным вектором p1

a1 = 1

p2 = [1; –1];

a2 = sim(net,p2) % Моделирование сети net с входным вектором p2

a2 = 0

Персептрон правильно классифицировал эти 2 вектора.

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

% Последовательность двух векторов в виде массива ячеек

p3 = {[1; 1] [1; –1]};

a3 = sim(net,p3) % Моделирование сети net при входном сигнале p3

a3 = [1] [0]

Инициализация параметров


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

net = newp([–2 2;–2 2],1);

Запросим характеристики весов входа:

net.inputweights{1, 1}

ans =

delays: 0

initFcn: 'initzero'

learn: 1

learnFcn: 'learnp'

learnParam: [ ]

size: [1 2]

userdata: [11 struct]

weightFcn: 'dotprod'

Из этого перечня следует, что в качестве функции инициализации по умолчанию
используется функция initzero, которая присваивает весам входа нулевые значения.

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

wts = net.IW{1,1}

wts = 0 0

bias = net.b{1}

bias = 0

Теперь переустановим значения элементов матрицы весов и смещения:

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

net.b{1} = 5

wts = 3 4

bias = 5

Для того, чтобы вернуться к первоначальным установкам параметров персептрона,
и предназначена функция init:

net = init(net);

wts

wts = 0 0

bias

bias = 0

Можно изменить способ, каким инициализируется персептрон с помощью функции init. Для этого достаточно изменить тип функций инициализации, которые применяются для установки первоначальных значений весов входов и смещений. Например, воспользуемся функцией инициализации rands, которая устанавливает случайные значения параметров персептрона.

% Задать функции инициализации весов и смещений

net.inputweights{1,1}.initFcn = 'rands';

net.biases{1}.initFcn = 'rands';

% Выполнить инициализацию ранее созданной сети с новыми функциями

net = init(net);

wts = net.IW{1,1}

wts = –0.96299 0.64281

bias = net.b{1}

bias = –0.087065

Видно, что веса и смещения выбраны случайным образом.
1   ...   11   12   13   14   15   16   17   18   ...   50
написать администратору сайта