
Готовые отчеты (2021) / Лабораторная работа 3
.pdfФедеральное агентство связи ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет инфокоммуникационных сетей и систем Кафедра программной инженерии и вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА №3 по дисциплине «Системы искусственного интеллекта»
Выполнил: студент 3-го курса дневного отделения группы ИКПИ-85
Коваленко Леонид Александрович Преподаватель:
доцент кафедры ПИиВТ Белая Татьяна Иоанновна
Санкт-Петербург
2021
Цель работы Изучение возможности аппроксимации с помощью нейронной сети
прямого распространения.
Задание Индивидуальное задание согласно варианту представлено в табл. 1.
Таблица 1 — Индивидуальное задание
№ вв. |
|
Функция |
Промежуток нахождения решения |
|
|
|
|
|
|
14 |
|
cos (x−0.5) |
|
x [−10 , 0 ) (0 , 10] |
|
|x| |
|||
|
|
|
Теоретические сведения Аппроксимация — замена одних математических объектов другими, в
том или ином смысле близкими к исходным.
Аппроксимация может сводиться к нахождению функциональной зависимости по имеющемуся набору точек.
В нашем случае функциональная зависимость будет представлена в нейросетевом базисе, т. е. через комбинацию активационных функций нейронных сетей.
Согласно теореме, доказанной в 1989 г. Л. Фунахаши, произвольно сложная функция может быть аппроксимирована двуслойной нейронной сетью, имеющей произвольные активационные функции. Поэтому классически для решения задачи аппроксимации используют многослойный персептрон. В данной лабораторной работе для решения задачи аппроксимации будем использовать четырехслойную нейронную сеть.
|
|
|
Практическая часть |
Табличные значения заданной функции генерируются: |
|||
|
X={A+ |
(B− A) 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