Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Готовые отчеты (2021) / Лабораторная работа 2

.pdf
Скачиваний:
125
Добавлен:
05.06.2021
Размер:
303.73 Кб
Скачать

Федеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет инфокоммуникационных сетей и систем Кафедра программной инженерии и вычислительной техники

ЛАБОРАТОРНАЯ РАБОТА №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