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

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

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

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

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

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

ЛАБОРАТОРНАЯ РАБОТА №3 по дисциплине «Системы искусственного интеллекта»

Выполнил: студент 3-го курса дневного отделения группы ИКПИ-85

Коваленко Леонид Александрович Преподаватель:

доцент кафедры ПИиВТ Белая Татьяна Иоанновна

Санкт-Петербург

2021

Цель работы Изучение возможности аппроксимации с помощью нейронной сети

прямого распространения.

Задание Индивидуальное задание согласно варианту представлено в табл. 1.

Таблица 1 — Индивидуальное задание

№ вв.

 

Функция

Промежуток нахождения решения

 

 

 

 

 

14

 

cos (x−0.5)

 

x [−10 , 0 ) (0 , 10]

 

|x|

 

 

 

Теоретические сведения Аппроксимация — замена одних математических объектов другими, в

том или ином смысле близкими к исходным.

Аппроксимация может сводиться к нахождению функциональной зависимости по имеющемуся набору точек.

В нашем случае функциональная зависимость будет представлена в нейросетевом базисе, т. е. через комбинацию активационных функций нейронных сетей.

Согласно теореме, доказанной в 1989 г. Л. Фунахаши, произвольно сложная функция может быть аппроксимирована двуслойной нейронной сетью, имеющей произвольные активационные функции. Поэтому классически для решения задачи аппроксимации используют многослойный персептрон. В данной лабораторной работе для решения задачи аппроксимации будем использовать четырехслойную нейронную сеть.

 

 

 

Практическая часть

Табличные значения заданной функции генерируются:

 

X={A+

(BA) i

| for ifrom 0 to N−1 inclusive},Y ={cos(|xx|−5) | for x X }

 

(N −1)

где

N — количество точек (пусть N=1000 ), A и B — границы (по

условию

A=−10 , B=10 ), X — абсциссы точек, Y — ординаты точек.

2

При нечетном числе точек и симметричных границах (относительно

нуля) найдется хотя бы один

x

равный нулю. При четном числе точек (

N=1000 ) и симметричных

границах (относительно

нуля,

по условию

A=−10 ,B=10 ) не найдется

x

равный нулю, а

значит

промежуток

нахождения решения будет x [−10 , 0 ) (0 , 10] , что и требуется по условию. Код программы, моделирующей, обучающей и тестирующей работу

нейронной сети, на языке MATLAB с использованием функций Neural Network Toolbox представлен в табл. 2.

Таблица 2 — Код на MATLAB (Neural Network Toolbox)

program1.m

%Для MATLAB R2018b (9.5.0.944444) Pro

%Программа, написанная с использованием функций Neural Network Toolbox clear all; close all; clc;

%=== Исходные данные ===

%Число точек

n = 1000;

% Генерация вектора X

X = linspace(-10, 10, n);

%Генерация вектора Y на основе вектора X

Y = cos(X - 0.5) ./ abs(X);

%Минимальные и максимальные значения координат min_x = min([-10, X(1, :)]);

max_x = max([+10, X(1, :)]); min_y = min([-5 , Y]);

max_y = max([+80, Y]);

%=== Создание нейронной сети обратного распространения с прямой связью ===

%3 скрытых слоя, первые два по 12 нейронов

%Передаточные функции: гиперболический тангенс и линейная функция

net = newff([min_x max_x], [12 12 1], {'tansig' 'tansig' 'purelin'});

%Скорость обучения net.trainParam.lr = 0.05;

%Максимальное число эпох net.trainParam.epochs = 10000;

%Цель тренировки net.trainParam.goal = 1e-6;

%Обучение сети

[net, TR, Y, E] = train(net, X, Y);

%Моделирование работы сети

R = sim(net, X);

%Построение графика

plot(X, Y, X, R, "bx"); % Построение xlim([min_x max_x]) % Установка границы по X ylim([min_y max_y]) % Установка границы по Y

text([(min_x + 1) (min_x + 1)], [(min_y + 20) (min_y + 20)], "Gradient error: " + TR.gradient(end));

text([(min_x + 1) (min_x + 1)], [(min_y + 15) (min_y + 15)], "Performance error: " +

TR.perf(end));

grid on; % Отображение сетки графика

Результат запуска программы представлен на рис. 1, 2, 3.

3

Рисунок 1 — Аппроксимация функции

Рисунок 2 — Аппроксимация функции, увеличенный масштаб

Рисунок 3 — Процесс обучения в MATLAB 4

Код программы, моделирующей, обучающей и тестирующей работу нейронной сети, на языке Python с использованием библиотеки Keras представлен в табл. 3.

Таблица 3 — Код на Python (Keras)

program2.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

from math import cos

#=== Исходные данные ===

#Число точек

n = 1000

# Генерация вектора X

X = np.linspace(-10, 10, n)

# Генерация вектора Y на основе вектора X

Y = np.array([(cos(x) - 0.5) / abs(x) for x in X], float)

#Минимальные и максимальные значения координат min_x = min((min(X), -10))

max_x = max((max(X), 10))

#=== Создание нейронной сети обратного распространения с прямой связью ===

#Создание модели

model = Sequential()

#Добавление слоев

#3 скрытых слоя, первые два по 12 нейронов

#Передаточные функции - гиперболический тангенс (2 скрытых слоя) model.add(Dense(units=12, input_shape=(1,), activation='tanh')) model.add(Dense(units=12, activation='tanh')) model.add(Dense(units=1)) % activation: linear

#Настройка модели для обучения

sgd = keras.optimizers.SGD(lr=0.05, decay=1e-6, momentum=0.9) model.compile(loss="mean_squared_error", optimizer=sgd)

# Обучение сети и моделирование

model.fit(X, Y, validation_split=0.15, epochs=1000, batch_size=len(X) * 4, verbose=False)

R = model.predict(X)

#=== Построение графиков ===

#Построение по точкам

mean_squared_error = model.evaluate(X,

Y, batch_size=len(X) * 2, verbose=False)

pyplot.figure(figsize=(5, 5), dpi=90)

# Создание нового окна с графиком

pyplot.plot(X,

Y)

# Ожидаемый результат

 

pyplot.plot(X,

R, 'bx', linewidth=0)

# Полученный результат

pyplot.axis([min_x, max_x, min_x // 2, max_x * 5])

# Установка границ

pyplot.grid()

# Отобразить сетку

 

 

pyplot.text(min_x + 0.5, 15, f"MSE: {round(mean_squared_error, 8)}")

pyplot.show()

# Показать график

 

 

# Построение в

виде функции

 

 

pyplot.figure(figsize=(5, 5), dpi=90)

# Создание нового окна с графиком

pyplot.plot(X,

Y)

# Ожидаемый результат

 

pyplot.plot(X,

R)

# Полученный результат

 

pyplot.axis([min_x, max_x, min_x // 2, max_x * 5])

# Установка границ

pyplot.grid()

# Отобразить сетку

 

 

pyplot.show()

# Показать график

 

 

Результат запуска программы представлен на рис. 4, 5, 6, 7.

5

Рисунок 4 — Аппроксимация функции

Рисунок 5 — Аппроксимация функции, увеличенный масштаб

Рисунок 6 — Функция (синий) и аппроксимация (оранжевый)

6

Рисунок 7 — Функция (синий) и аппроксимация (оранжевый), увеличенный масштаб

Код программы, моделирующей, обучающей и тестирующей работу нейронной сети, на языке Python с использованием библиотеки Neurolab представлен в табл. 4.

Таблица 4 — Код на Python (Neurolab)

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

-neurolab version is 0.3.5

-matplotlib version is 3.3.4

-numpy version is 1.19.5

"""

import numpy as np

from matplotlib import pyplot from math import cos

import neurolab as nl import neurolab.trans

#=== Исходные данные ===

#Число точек

n = 1000

# Генерация вектора X

X = np.linspace(-10, 10, n)

# Генерация вектора Y на основе вектора X

Y = np.array([(cos(x) - 0.5) / abs(x) for x in X], float)

#Минимальные и максимальные значения координат min_x = min((min(X), -10))

max_x = max((max(X), 10))

#=== Создание нейронной сети обратного распространения с прямой связью ===

TanSig = nl.trans.TanSig()

PureLin = nl.trans.PureLin()

net = nl.net.newff([[min_x, max_x]], [12, 12, 1], [TanSig, TanSig, PureLin])

error = net.train(X.reshape(X.size, 1), Y.reshape(Y.size, 1), epochs=800, goal=0.01)[- 1]

R = net.sim(X.reshape(X.size, 1))

#=== Построение графиков ===

#Построение по точкам и в виде графика

pyplot.figure(figsize=(5, 5), dpi=90) # Создание нового окна с графиком pyplot.plot(X, Y)

pyplot.plot(X, R, 'bx', linewidth=0)

pyplot.axis([min_x, max_x, min_x // 2, max_x * 5]) # Установка границ

7

pyplot.grid() # Отобразить сетку

pyplot.text(min_x + 0.5, 15, f"SSE: {round(error, 8)}") pyplot.show() # Показать график

# Построение линий

pyplot.figure(figsize=(5, 5), dpi=90) # Создание нового окна с графиком pyplot.plot(X, Y) # Ожидаемый результат

pyplot.plot(X, R) # Полученный результат

pyplot.axis([min_x, max_x, min_x // 2, max_x * 5]) # Установка границ pyplot.grid() # Отобразить сетку

pyplot.show() # Показать график

Результат запуска программы представлен на рис. 8, 9, 10, 11.

Рисунок 8 — Аппроксимация функции

Рисунок 9 — Аппроксимация функции, увеличенный масштаб

n

В данном случае используется мера ошибки SSE: ( yi− ^yi )2 .

i=1

Мера ошибки MSE: 1 n ( yi− ^yi )2 .

n i=1

Поэтому MSE для Neurolab-версии: 10001 0.00999411≈9e-6 .

8

Рисунок 10 — Функция (синий) и аппроксимация (оранжевый)

Рисунок 11 — Функция (синий) и аппроксимация (оранжевый), увеличенный масштаб

Заключение В результате выполнения лабораторной работы мы изучили

возможности аппроксимации с помощью нейронной сети обратного распространения; создали и исследовали модели нейронных сетей обратного распространения с прямой связью в системе MATLAB и с использованием языка программирования Python с библиотекой Keras и с библиотекой Neurolab.

Применение функций пакета Neural Network Toolbox существенно упрощает построение, обучение и использование ИНС.

9