Для формирования модели однослойного персептрона в системе MATLAB предназначена функция newp
net = newp(PR, S)
со следующими входными аргументами: PR – массив минимальных и максимальных значений для R элементов входа размера R x2; S – число нейронов в слое.
Например, функция
net = newp([0 2], 1);
создает персептрон с одноэлементным входом и одним нейроном;
диапазон значений входа – [0 2].
В качестве функции активации персептрона по умолчанию используется функция hardlim.
Моделирование персептрона
Рассмотрим однослойный персептрон с одним двухэлементным вектором входа, значения элементов которого изменяются в диапазоне от –2 до 2 (p 1 = [–2 2], p 2 = [–2 2], число нейронов в сети S = 1):
clear, net = newp([-2 2;-2 2],1); %Создание персептрона net
По умолчанию веса и смещение равны нулю, и для того, чтобы установить желаемые значения, необходимо применить следующие операторы:
net.IW{1,1} = [-1 1]; % Веса w11= -1; w12 = 1
net.b{1} = [1]; % Смещение b = 1
Запишем уравнение (1) в развернутом виде для данной сети:
,
В этом случае разделяющая линия имеет вид
|
|
L: - p 1 + p 2 + 1 = 0
и соответствует линии L на рисунке 2.
Определим реакцию сети на входные векторы p1 и p2, расположенные по разные стороны от разделяющей линии:
p1 = [1; 1];
a1 = sim(net,p1) % Моделирование сети net с входным
вектором p1
a1 = 1
p2 = [1; -1];
a2 = sim(net,p2) % Моделирование сети net с входным
вектором p2
a2 = 0
Персептрон правильно классифицировал эти два вектора. Заметим, что можно было бы ввести последовательность двух векторов в виде массива ячеек и получить результат также в виде массива ячеек.
p3 = {[1; 1] [1; -1]}
a3 = sim(net,p3) % Моделирование сети net при
входном сигнале p3
p3 = [2x1 double] [2x1 double]
a3 = [1] [0]
Инициализация параметров
Для однослойного персептрона в качестве параметров нейронной сети в общем случае выступают веса входов и смещения. Допустим, что создается персептрон с двухэлементным вектором входа и одним нейроном
clear, 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: [1x1 struct]
weightFcn: 'dotprod'
Из этого списка следует, что в качестве функции инициализации по умолчанию используется функция initzero, которая присваивает весам входа нулевые значения. В этом можно убедиться, если извлечь значения элементов матрицы весов и смещения:
wts = net.IW{1,1}, bias = net.b{1}
wts =
0 0
bias =
Теперь переустановим значения элементов матрицы весов и смещения:
net.IW{1,1} = [3, 4]; net.b{1} = 5;
wts = net.IW{1,1}, bias = net.b{1}
wts = 3 4
bias = 5
Для того чтобы вернуться к первоначальным установкам параметров персептрона, предназначена функция init:
net = init(net); wts = net.IW{1,1}, bias = net.b{1}
wts = 0 0
bias = 0
Можно изменить способ, каким инициализируется персептрон с помощью функции init. Для этого достаточно изменить тип функции инициализации, которые применяются для установки первоначальных значений весов входов и смещений. Например, воспользуемся функцией инициализации rands, которая устанавливает случайные значения параметров персептрона:
|
|
% Задать функции инициализации весов и смещений
net.inputweights{1,1}.initFcn = 'rands';
net.biases{1}.initFcn = 'rands';
% Выполнить инициализацию ранее созданной сети с новыми функциями
net = init(net);
wts = net.IW{1,1}, bias = net.b{1}
wts = -0.1886 0.8709
bias = -0.6475
Видно, что веса и смещения выбраны случайным образом.