Результат запуска программы представлен на рис. 1, 2, 3, 4.
Рисунок 1 — Классификация I (слева-направо)
Рисунок 2 — Классификация II (сверху-вниз)
Рисунок 3 — Общая классификация
6
Рисунок 4 — Процесс обучения при использовании функции train в MATLAB
Код программы, моделирующей, обучающей и тестирующей работу персептрона, на языке MATLAB без использования функций Neural Network Toolbox представлен в табл. 5 (контрольный вопрос №7).
Таблица 5 — Код на Matlab (без Neural Network Toolbox)
program2.m
%Для MATLAB R2018b (9.5.0.944444) Pro
%Программа, написанная без использования функций Neural Network Toolbox clear all; close all; clc;
%=== Исходные данные ===
%Обучающая выборка из 15 точек
P = [ 3 5 4 |
6 -4 -2 -4 -3 |
|
6 |
|
6 |
8 |
7 -2 -4 -2 -3; |
|||||||
|
-1 -1 -3 |
1 -2 -2 -4 -4 |
|
9 |
|
6 |
6 |
4 6 4 4 2]; |
||||||
% Результаты классификации точек |
|
обучающей выборки |
||||||||||||
T1 |
= [0 |
0 |
0 0 |
1 1 |
1 |
1 |
0 0 |
0 |
0 |
1 |
1 |
|
1 1]; % Классификация I (слева-направо) |
|
T2 |
= [0 |
0 |
0 0 |
0 0 |
0 |
0 |
1 1 |
1 |
1 |
1 |
1 |
|
1 1]; % Классификация II (сверху-вниз) |
|
% Проверочная выборка |
(14 |
вариант) |
|
|
||||||||||
A = [0 |
1 |
-1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
-1 |
-1]; |
|
|
|
|
|
|
|
|
|
|
|
%Минимальные и максимальные значения координат min_c = min([-10, P(1, :), P(2, :)]);
max_c = max([+10, P(1, :), P(2, :)]);
%=== Построение персептрона ===
X1 = P(1, :); % Вектор подаваемых значений на вход x1 (абсциссы)
X2 = P(2, :); % Вектор подаваемых значений на вход x2 (ординаты)
W = zeros(2, 3); % Матрица весов (два коэффициента плюс смещение на каждый нейрон) v = 0.1; % Коэффициент скорости обучения
et = 1; % Пока флаг установлен, сеть считается необученной (т. е. ошибается) while (et == 1) % Пока сеть не перестанет ошибаться
et = 0; % Если в течение шага цикла сеть хоть раз ошибется, флаг установится в
единицу
% Цикл по всем точкам for k=1:size(P, 2)
% Классификация I. Тренируем первый нейрон f = 0; % Флаг успешности распознавания
7
while (f == 0) % Пока не научится классифицировать точку % Выход адаптивного сумматора
S = W(1, 1) * X1(k) + W(1, 2) * X2(k) + W(1, 3); if (S < 0) % Пороговая функция (функция активации)
Y1 = 0;
else
Y1 = 1;
end
if (Y1 == T1(k)) % Ответ совпал, флаг успешности в 1 f = 1;
else
d = T1(k) - Y1; % Вычисляем разность % Коррекция коэффициентов
W(1, 1) = W(1, 1) + v * d * X1(k);
W(1, 2) = W(1, 2) + v * d * X2(k); W(1, 3) = W(1, 3) + v * d;
% Регистрируем факт ошибки сети et = 1;
end
end
% Классификация II. Тренируем второй нейрон f = 0; % Флаг успешности распознавания
while (f == 0) % Пока не научится классифицировать точку
% Выход адаптивного сумматора
S = W(2, 1) * X1(k) + W(2, 2) * X2(k) + W(2, 3); if (S < 0) % Пороговая функция (функция активации)
Y2 = 0;
else
Y2 = 1;
end
if (Y2 == T2(k)) % Ответ совпал, флаг успешности в 1 f = 1;
else
d = T2(k) - Y2; % Вычисляем разность
% Коррекция коэффициентов
W(2, 1) = W(2, 1) + v * d * X1(k);
W(2, 2) = W(2, 2) + v * d * X2(k);
W(2, 3) = W(2, 3) + v * d;
% Регистрируем факт ошибки сети et = 1;
end
end
end
end
% Тестирование персептрона
R = zeros(2, 4); % Массив результатов классификации
%Моделирование работы сети for k=1:size(A,2)
S = W(1, 1) * A(1, k) + W(1, 2) * A(2, k) + W(1, 3); % Выход адаптивного сумматора if (S >= 0)
R(1, k) = 1;
end
S = W(2, 1) * A(1, k) + W(2, 2) * A(2, k) + W(2, 3); % Выход адаптивного сумматора if (S >= 0)
R(2, k) = 1;
end
end
%Визуализация полученного результата
plotpv(horzcat(A, P), horzcat([R(1, 1:3); R(2, 1:3)], [T1; T2])); plotpc([W(1, 1:2); W(2, 1:2)], [W(1, 3); W(2, 3)]); title('Тестирование работы сети');
xlabel('X'); ylabel('Y');
axis([min_c max_c min_c max_c]);
8
Результат запуска программы представлен на рис. 5.
Рисунок 5 — Общая классификация Код программы, моделирующей, обучающей и тестирующей работу
персептрона, на языке Python с использованием библиотеки Keras представлен в табл. 6.
Таблица 6 — Код на Python (Keras)
program3.py
"""
Python 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:18:16) [MSC v.1928 64 bit (AMD64)] on win32
-keras version is 2.4.3
-matplotlib version is 3.3.4
-tensorflow version is 2.4.1
-numpy version is 1.19.5
"""
import keras import numpy as np
from keras.layers.core import Dense from keras.models import Sequential from matplotlib import pyplot
# === Исходные данные === |
|
|
# Обучающая выборка из 15 точек |
|
|
X = np.array([3, 5, 4, 6, -4, -2, -4, -3, 6, 6, 8, 7, |
-2, -4, -2, -3], float) |
|
Y = np.array([-1, -1, -3, 1, -2, -2, -4, -4, 9, 6, 6, |
4, 6, 4, 4, 2], float) |
|
P = np.c_[X, Y] |
|
|
# Результаты классификации точек обучающей выборки |
|
|
T1 = np.array([0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, |
1, 1, 1], int) |
# Классификация |
I (слева-направо) |
|
|
T2 = np.array([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, |
1, 1, 1], int) |
# Классификация |
II (сверху-вниз) |
|
|
T = np.c_[T1, T2] |
|
|
#Минимальные и максимальные значения координат min_c = min((min(X), min(Y), -10))
max_c = max((max(X), max(Y), 10))
#Отображение графика классификации I точек обучающей выборки pyplot.figure(figsize=(5, 5), dpi=90)
pyplot.axis([min_c, max_c, min_c, max_c])
X1, Y1 = zip(*((x, y) for x, y, t in zip(X, Y, T1) if t == 0)) X2, Y2 = zip(*((x, y) for x, y, t in zip(X, Y, T1) if t == 1))
pyplot.plot(X1, Y1, color='red', marker='+', linewidth=0) # Построение графика pyplot.plot(X2, Y2, color='blue', marker='x', linewidth=0) # Построение графика pyplot.grid()
#Отображение графика классификации II точек обучающей выборки pyplot.figure(figsize=(5, 5), dpi=90)
pyplot.axis([min_c, max_c, min_c, max_c])
9
X1, Y1 = zip(*((x, y) for x, y, t in zip(X, Y, T2) if t == 0)) X2, Y2 = zip(*((x, y) for x, y, t in zip(X, Y, T2) if t == 1))
pyplot.plot(X1, Y1, color='red', marker='+', linewidth=0) # Построение графика pyplot.plot(X2, Y2, color='blue', marker='x', linewidth=0) # Построение графика pyplot.grid()
#Проверочная выборка (14 вариант) A = [[0, 1, -1],
[1, -1, -1]]
Axy = list(zip(*A))
#Axy = np.array([[x, y] for x in range(-10, 10 + 1) for y in range(-10, 10 + 1)], float)
#=== Построение персептрона с помощью Keras ===
#Создание модели
model = Sequential()
#Добавление слоя с 2 нейронами и активационной функцией "сигмоида" model.add(Dense(units=2, input_shape=(2,), activation='sigmoid'))
#Настройка модели для обучения
#функция потери - абсолютная функция потерь
#оптимизация SGD, скорость обучения: 0.05
sgd = keras.optimizers.SGD(lr=0.05, decay=1e-6, momentum=0.9) model.compile(loss=keras.losses.MeanAbsoluteError(), optimizer=sgd, metrics=['accuracy'])
# Обучение сети
model.fit(P, T, epochs=1000, batch_size=len(P) * 2, verbose=False)
# Создание нового окна с графиком
fig, ax = pyplot.subplots(figsize=(5, 5), dpi=90) pyplot.axis([min_c, max_c, min_c, max_c])
# Обучающая выборка
training_sample = [[[[], []], [[], []]], [[[], []], [[], []]]]
R = map(lambda t: map(round, t), model.predict(P)) for (x, y), (t0, t1) in zip(P, R):
training_sample[t0][t1][0].append(x) training_sample[t0][t1][1].append(y)
pyplot.plot(training_sample[0][0][0], training_sample[0][0][1], color='red', marker='+', linewidth=0)
pyplot.plot(training_sample[0][1][0], training_sample[0][1][1], color='green', marker='x', linewidth=0)
pyplot.plot(training_sample[1][0][0], training_sample[1][0][1], color='blue', marker='*', linewidth=0)
pyplot.plot(training_sample[1][1][0], training_sample[1][1][1], color='purple', marker='D', linewidth=0)
# Проверочная выборка
test_sample = [[[[], []], [[], []]], [[[], []], [[], []]]]
R = map(lambda t: map(round, t), model.predict(Axy)) for (x, y), (t0, t1) in zip(Axy, R):
test_sample[t0][t1][0].append(x) test_sample[t0][t1][1].append(y)
pyplot.plot(test_sample[0][0][0], test_sample[0][0][1], color='black', marker='+', linewidth=0)
pyplot.plot(test_sample[0][1][0], test_sample[0][1][1], color='black', marker='x', linewidth=0)
pyplot.plot(test_sample[1][0][0], test_sample[1][0][1], color='black', marker='*', linewidth=0)
pyplot.plot(test_sample[1][1][0], test_sample[1][1][1], color='black', marker='D', linewidth=0)
# Генерация сетки и построение разделяющих линий x1 = np.arange(min_c, max_c, 0.1)
x2 = np.arange(min_c, max_c, 0.1) xx1, xx2 = np.meshgrid(x1, x2)
grid = np.c_[xx1.ravel(), xx2.ravel()]
predictions0 = model.predict(grid)[:, 0].reshape(xx1.shape)
ax.contour(xx1, xx2, predictions0, levels=[.5], cmap='Greys', vmin=0, vmax=.6) predictions1 = model.predict(grid)[:, 1].reshape(xx1.shape)
ax.contour(xx1, xx2, predictions1, levels=[.5], cmap='Greys', vmin=0, vmax=.6) pyplot.grid()
pyplot.show()
10