Готовые отчеты (2021) / Лабораторная работа 2
.pdfФедеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет инфокоммуникационных сетей и систем Кафедра программной инженерии и вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА №2 по дисциплине «Системы искусственного интеллекта»
Выполнил: студент 3-го курса дневного отделения группы ИКПИ-85
Коваленко Леонид Александрович Преподаватель:
доцент кафедры ПИиВТ Белая Татьяна Иоанновна
Санкт-Петербург
2021
Цель работы Изучение модели нейрона перцептрона и архитектуры перцептронной
однослойной нейронной сети; создание и исследование моделей перцептронных нейронных сетей в системе MATLAB.
Задание Индивидуальное задание согласно варианту представлено в табл. 1.
Таблица 1 — Индивидуальное задание
|
Кол-во классов |
Координаты точек проверочного |
Контрольный |
№ вв. |
для |
множества и номер класса1, к |
|
|
классификации |
которому принадлежит каждая точка |
вопрос |
|
|
||
|
|
|
|
14 |
4 |
(0, 1) — 1; (1, -1) — 2; (-1, -1) — 3 |
72 |
Теоретические сведения Искусственная нейронная сеть (ИНС) — математическая модель,
описывающая отдельные элементарные функции, присущие нервной системе живых организмов. Структурным элементом ИНС является искусственный нейрон, полностью описываемый вектором входов X , вектором синаптических коэффициентов W , а также функцией активации f (S) . ИНС обычно применяются для решения задач, плохо подлежащих формализации (т. е. таких, которые нельзя описать аналитически).
В данной работе будет рассмотрен простейший вид ИНС — персептрон. Персептрон — это однослойная нейронная сеть, позволяющая решать задачу классификации линейно разделимых объектов.
Прежде, чем начать пользоваться сетью, ее необходимо обучить — т. е. определить значения синаптических коэффициентов и смещений (смещения можно также рассматривать как синаптические коэффициенты входов, на которые постоянно подана единица). Алгоритм обучения в соответствии с дельта-правилом можно описать следующим образом:
1.Подать на вход сети вектор входных данных;
2.Если ответ на выходе верный, перейти на п. 5, если нет, то на п. 3;
1Номера классов в таблице наведены условно.
2Код программы на языке MATLAB без использования функций Neural Network Toolbox.
2
3. |
Скорректировать |
синаптические |
коэффициенты: |
||
wij (k +1)=wij (k )+v δ xi , где |
i — номер входа, j — номер нейрона в слое, k |
— |
|||
номер итерации, 0<v <1 |
— коэффициент скорости обучения (определяется |
||||
эмпирически), |
δ=Y теор−Y практ — |
разность между |
теоретическим |
и |
|
практическим значениями выхода, xi |
— значение, поданное на i -й вход; |
|
4.Подать на вход тот же вектор, и перейти на п. 2;
5.Подать на вход очередной вектор, и так действовать в соответствии с
пп.2-4, пока не закончатся данные обучающей выборки, и пока сеть не перестанет ошибаться (или ошибка будет допустимой).
После того, как сеть обучена, выполняется оценка корректности её работы с помощью проверочной выборки, а также оценка погрешности.
Практическая часть Ввиду того, что для однозначного задания положения точки на
плоскости достаточно двух координат, персептрон будет иметь два входа: x1
иx2 . Однако, дабы работать со смещениями как с синаптическими
коэффициентами, понадобится также вход x0 , на который постоянно подана единица. Т. к. классифицировать необходимо на четыре класса, то понадобится два нейрона ( 22=4 ). Следовательно, матрица весовых коэффициентов W будет иметь размерность 2× 3 (два нейрона, три параметра).
Основная идея классификации в данном случае будет следующей: прямая, "проводимая" первым нейроном будет делить множество точек плоскости на два класса — так мы получим первый разряд кодовой комбинации, кодирующей номер класса. Второй нейрон будет "проводить" линию, которая также делит множество точек плоскости на два класса, и так мы получим второй разряд кодовой комбинации. Пересекаясь, обе линии будут делить множество точек плоскости на четыре класса, что и требуется в условии.
3
Проверочные точки представлены в табл. 2. Таблица 2 — Проверочные точки
|
|
Классифи |
Классифи |
|
|
|
Кодовая |
№ п/п |
Класс |
X |
|
Y |
комбинац |
||
кация I |
кация II |
|
|||||
|
|
|
|
|
ия |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
1 |
0 |
0 |
1 |
|
-1 |
00 |
|
|
|
|
|
|
|
|
2 |
2 |
0 |
1 |
-1 |
|
-1 |
01 |
|
|
|
|
|
|
|
|
3 |
4 |
1 |
1 |
0 |
|
1 |
11 |
|
|
|
|
|
|
|
|
Точки обучающей выборки представлены в табл. 3. |
|
|
|||||
Таблица 3 — Точки обучающей выборки |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
Классифи |
Классифи |
|
|
|
Кодовая |
№ п/п |
Класс |
X |
|
Y |
комбинац |
||
кация I |
кация II |
|
|||||
|
|
|
|
|
ия |
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
|
|
|
3 |
|
-1 |
|
|
|
|
|
|
|
|
|
2 |
1 |
0 |
0 |
5 |
|
-1 |
00 |
|
|
|
|
||||
3 |
4 |
|
-3 |
||||
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
4 |
|
|
|
6 |
|
1 |
|
|
|
|
|
|
|
|
|
5 |
|
|
|
-4 |
|
-2 |
|
|
|
|
|
|
|
|
|
6 |
2 |
0 |
1 |
-2 |
|
-2 |
01 |
|
|
|
|
||||
7 |
-4 |
|
-4 |
||||
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
8 |
|
|
|
-3 |
|
-4 |
|
|
|
|
|
|
|
|
|
9 |
|
|
|
6 |
|
9 |
|
|
|
|
|
|
|
|
|
10 |
3 |
1 |
0 |
6 |
|
6 |
10 |
|
|
|
|
||||
11 |
8 |
|
6 |
||||
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
12 |
|
|
|
7 |
|
4 |
|
|
|
|
|
|
|
|
|
13 |
|
|
|
-2 |
|
6 |
|
|
|
|
|
|
|
|
|
14 |
4 |
1 |
1 |
-4 |
|
4 |
11 |
|
|
|
|
||||
15 |
-2 |
|
4 |
||||
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
16 |
|
|
|
-3 |
|
2 |
|
|
|
|
|
|
|
|
|
Код программы, моделирующей, обучающей и тестирующей работу |
персептрона, на языке MATLAB с использованием функций Neural Network Toolbox представлен в табл. 4.
4
Таблица 4 — Код на MATLAB (Neural Network Toolbox)
program1.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 (сверху-вниз) |
%Отображение графика классификации I точек обучающей выборки figure(1); % Создание окна номер 1 с фигурой
plotpv(P, T1); % Построение графика
%Отображение графика классификации II точек обучающей выборки figure(2); % Создание окна номер 2 с фигурой
plotpv(P, T2); % Построение графика
%Проверочная выборка (14 вариант)
A = [0 |
1 |
-1; |
1 |
-1 |
-1]; |
%Минимальные и максимальные значения координат min_c = min([-10, P(1, :), P(2, :)]);
max_c = max([+10, P(1, :), P(2, :)]);
%=== Построение персептрона с помощью функций Neural Network Toolbox ===
%Создание перцептрона с 2 входами и 2 нейронами
%В качестве функции активации персептрона по умолчанию
%используется функция hardlim (Hard-limit transfer function)
net = newp([min_c max_c; min_c max_c], 2);
%Установка макс. количества эпох для обучения: 50 net.trainParam.epochs = 50;
%Обучение сети
net = train(net, P, [T1; T2]);
% Моделирование работы персептрона на проверочной выборке a = sim(net, A);
%Визуализация полученного результата figure(3); % Создание окна номер 3 с фигурой
plotpv(horzcat(A, P), horzcat(a, [T1; T2])); % Построение графика axis([min_c max_c min_c max_c]); % Настройка диапазонов осей графика
%Построение классификационных линий
%net.IW - матрица входных весов
%net.b - вектор смещения
plotpc(net.IW{1}, net.b{1});
Для обучения используется функция train.
Функция адаптации — adapt — не используется в задачах кластеризации и классификации (задача данной лабораторной как раз является таковой), т. к. она предназначена для обучения по мере поступления данных (т. е. важен порядок), а задачи кластеризации и классификации решаются по всей совокупности данных без учета их порядка.
5
Результат запуска программы представлен на рис. 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