ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.12.2023

Просмотров: 218

Скачиваний: 16

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ «САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ им. проф. М. А. БОНЧ-БРУЕВИЧА» (СПбГУТ) Ф.В. Филиппов НЕЙРОСЕТЕВЫЕ ТЕХНОЛОГИИ ЛАБОРАТОРНЫЙ ПРАКТИКУМ САНКТ-ПЕТЕРБУРГ 2021 2 УДК 004.31(004.42) ББК 32.973-018.2я73 Рецензент кандидат технических наук, доцент кафедры конструирования и производства радиоэлектронных средств Т.В. Матюхина Утверждено редакционно-издательским советом СПбГУТ в качестве лабораторного практикума Филиппов, Ф.В. Нейросетевые технологии: лабораторный практикум / Ф. В. Филиппов; СПбГУТ, – СПб., 2021. – 48 с. Приведены методические материалы для выполнения лабораторных работ. Сформулированы задания к лабораторным работам и практиче- ским занятиям. Изложение материала ведется с примерами, реализован- ными в среде RStudio с использованием широкого круга библиотек. Пособие предназначено для бакалавров направления 09.03.02 Инфор- мационные системы и технологии и будет полезно при изучении дисци- плин «Нейросетевые технологии» и «Технологии обработки информа- ции». © Филиппов Ф.В., 2021 ©Федеральное государственное образовательное бюджетное учреждение высшего образования «Санкт-Петербургский государственный университет телекоммуникаций им. проф. М. А. Бонч-Бруевича», 2021 3 СОДЕРЖАНИЕ ВВЕДЕНИЕ ............................................................................................................................... 4ЛАБОРАТОРНЫЕ РАБОТЫ .................................................................................................. 5 1. ПЕРСЕПТРОНЫ .............................................................................................................. 5 Аппроксимация функций .................................................................................................... 6Лабораторная работа № 1 ................................................................................................ 9Прогнозирование временных рядов ................................................................................. 10Лабораторная работа № 2 .............................................................................................. 14Классификация объектов ................................................................................................... 14Лабораторная работа № 3 .............................................................................................. 17Построение автокодировщиков ........................................................................................ 18Лабораторная работа № 4 .............................................................................................. 20 2. ОГРАНИЧЕННЫЕ МАШИНЫ БОЛЬЦМАНА .......................................................... 21 Лабораторная работа № 5 .............................................................................................. 25 3. СЕТИ КОХОНЕНА ........................................................................................................ 26 Лабораторная работа № 6 .............................................................................................. 27 4. СВЕРТОЧНЫЕ СЕТИ .................................................................................................... 28 Лабораторная работа № 7 .............................................................................................. 31 5. ВАРИАЦИОННЫЕ АВТОКОДИРОВЩИКИ ............................................................. 32 Лабораторная работа № 8 .............................................................................................. 35 6. РЕКУРРЕНТНЫЕ СЕТИ НА БАЗЕ LSTM .................................................................. 36 Лабораторная работа № 9 .............................................................................................. 39ЗАДАНИЯ ДЛЯ ПРАКТИКИ ............................................................................................... 40Задание № 1: Моделирование логической функции ....................................................... 40Задание № 2: Классификация входных данных .............................................................. 40Задание № 3: Построение карты Кохонена ..................................................................... 41Задание № 4: Распознавание и классификация объектов ............................................... 42Задание № 5: Сжатие данных ............................................................................................ 43Задание № 6: Составление прогноза ................................................................................ 43Задание № 7: Классификация объектов ........................................................................... 44Задание № 8: Распознавание изображений ...................................................................... 45Задание № 9: Классификация изображений .................................................................... 46Задание № 10: Прогнозирование аварий сетевого оборудования ................................. 47ЗАКЛЮЧЕНИЕ ...................................................................................................................... 47СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ............................................................. 48 4 ВВЕДЕНИЕ Для решения широкого круга задач, когда не удается найти алгорит- мического решения используются нейронные сети. Способность нейронных сетей обучаться позволяет переложить сложности поиска решения на их плечи. Успех качественного обучения нейронных сетей зависит от многих факторов, но главными из них являются два – формирование хорошей обу- чающей выборки и выбор модели сети адекватной для конкретной задачи. Если подбор и подготовка данных для обучения является общей процеду- рой, зависящей от целей обучения, то выбор надлежащей архитектуры сети, во многом зависит от характера решаемой задачи. За период от начала практического использования нейронных сетей до настоящего времени сложились обоснованные предпочтения выбора конкретной архитектуры для задач определенного класса. Тем не менее про- цесс создания и апробирования новых моделей продолжается. Создано большое число библиотек, позволяющих легко экспериментировать и нахо- дить наилучшие решения. Лабораторный практикум предназначен для получения навыков ра- боты с моделями нейронных сетей при решении широкого класса задач. Его со- держимое будет предельно понятно, если предварительно ознакомиться с одноименным учебным пособием [1]. Практикум содержит лабораторные работы и задания для самостоятельной практики. Изучение относительно простых архитектур нейронных сетей осно- вано на использовании классических моделей персептронов, ограниченных машин Больцмана и сетей Кохонена. Все эти модели реализованы в виде функций, которые позволяют варьировать большое число параметров, не- обходимых для их адаптации к решаемой задачи и получения адекватных результатов. Для построения более сложных архитектур с различным числом и назначением слоев, а также с введением специфических модулей, типа LSTM, здесь используется библиотека keras. При выполнении лабораторных работ рекомендуется детально изу- чить листинги, предваряющие задание, и выполнить их в среде RStudio. За- дания для самостоятельной практики взяты из веб-ресурсов, с которыми возможно следует познакомиться. Выполнение этих заданий носит характер небольшого исследования. Поскольку предлагаемые здесь примеры и задания используют язык программирования R, полезно также получить некоторые навыки его ис- пользования, например, изучив базовые структуры и функции из [2]. Для тех, кто знаком с языком Python, предлагается выполнять представленные здесь задания в среде Colab [3]. 5 ЛАБОРАТОРНЫЕ РАБОТЫ 1. ПЕРСЕПТРОНЫ Главной особенностью моделей нейронных сетей, объединенных под названием персептрон, являются полносвязные слои. В них нейрон преды- дущего слоя связан со всеми нейронами следующего слоя. В среде RStudio используется три модели персептрона, реализованные в виде функций nnet(), neuralnet() и mlp() [4]. Каждая из этих функций имеет много парамет- ров, большинству из которых присвоены значения по умолчанию: nnet(x, y, weights, size, Wts, mask, linout = FALSE, entropy = FALSE, softmax = FALSE, censored = FALSE, skip = FALSE, rang = 0.7, decay = 0, maxit = 100, Hess = FALSE, trace = TRUE, MaxNWts = 1000, abstol = 1.0e-4, reltol = 1.0e-8) neuralnet(formula, data, hidden = 1, threshold = 0.01, stepmax = 1e+05, rep = 1, startweights = NULL, learningrate.limit = NULL, learningrate=NULL, learningrate.factor = list(minus = 0.5, plus = 1.2), lifesign = «none», lifesign.step = 1000, algorithm = «rprop+», err.fct = «sse», act.fct = «logistic», linear.output = TRUE, exclude = NULL, constant.weights = NULL, likelihood = FALSE) mlp(x, y, size = c(5), maxit = 100, initFunc = «Randomize_Weights», initFuncParams = c(-0.3, 0.3), learnFunc = «Std_Backpropagation», learnFuncParams = c(0.2, 0), updateFunc = «Topological_Order», updateFuncParams = c(0), hiddenActFunc = «Act_Logistic», shufflePatterns = T, linOut = FALSE, inputsTest = NULL, targetsTest = NULL, pruneFunc = NULL, pruneFuncParams = NULL) Обилие параметров предоставляет широкие возможности по настройке или, как часто говорят, по подгонке выбранной модели для опти- мального решения задачи. Известно, что персептроны удобно применять в решении практиче- ских задач, связанных с классификацией и аппроксимацией (или регрес- сией): • сеть с одним скрытым слоем, содержащим N нейронов со ступенчатой функцией активации, способна осуществить произвольную классифи- кацию Nd точек d-мерного пространства (то есть классифицировать Nd примеров); • одного скрытого слоя нейронов с сигмоидной функцией активации достаточно для аппроксимации любой функции со сколь угодно вы- сокой точностью. Рассмотрим примеры использования различных моделей персептро- нов для решения различных задач. 6 Аппроксимация функций Рассмотрим простой пример аппроксимации функции y = 2cos x + 8 на отрезке [0, 8]. В листинге 1 приведен код для решения этой задачи с исполь- зованием модели neuralnet(). Сначала формируется фрейм данных learn для обучения сети (строка 6). Затем загружается библиотека neuralnet и формируется сеть netcos. В функции neuralnet() мы определяем минимальное число парамет- ров: задаем формулу y x, определяем число нейронов в скрытом слое hid-den = 4 и указываем имя фрейма learn с набором данных для обучения. Остальные параметры заданы по умолчанию (строка 10). Запуск функции на исполнение осуществляет обучение сети netcos. Листинг 1. Аппроксимация функции y = 2cos x + 8 7 Для проверки работы обученной сети создаем фрейм test (строка 16) с тестовыми данными. Функция predict() вычисляет реакцию обученной сети netcos в переменной yp. На рис. 1 приведен график моделируемой функции y, представленной 50 зелеными точками, и функции yp, сформированной се- тью и представленной на графике 5000 черных точек. График демонстри- рует полное совпадение функций. Рис. 1. Моделируемая и результирующая функция С помощью функции plot(netcos) получаем архитектуру полученной сети (рис. 2). Полную информацию о построенной сети можно получить с помощью функции print(netcos). Рис. 2. Архитектура сети netcos 8 Интересно посмотреть аналитическое представление функции реали- зованной сетью netcos для исходной моделируемой функции. Для этого представим функции, реализуемые нейронами скрытого слоя (строка 24 – 27, листинг 1) и построим их графики (рис.3). Рис. 3. Функции, реализуемые нейронами скрытого слоя Функцию y, реализованную сетью netcos, получаем из этих функций следующим образом (округляем значения весов до сотых долей): ???? =−0.17 1 + ????!"#.%&'!"(.)&+5.82 1 + ????!*.(('+,.",+5.43 1 + ????*.-.'!**.(-+5.07 1 + ????*.,#'!#.%%− 0.04 Постройте график y (строка 39, листинг 1) и убедитесь в том, что на отрезке [0, 8] эта функция практически тождественна исходной функции y = 2cos x + 8. Обратите внимание на использование в листинге функций set.seed(), которые задают начальную фазу генератора случайных чисел. Их необхо- димо использовать для повторной воспроизводимости полученных резуль- татов. Из многочисленного числа параметров для решения задач приведен- ного ниже задания достаточно будет правильно сформировать обучающие и проверочные данные, подобрать структуру сети и число повторений (эпох) обучения. Данные для обучения и тестирования должны быть сформированы в виде фреймов. Для правильного подбора структуры необходимо подобрать число скрытых слоев и число нейронов каждого скрытого слоя. В ряде заданий будет достаточно одного скрытого слоя, как в примере листинга 1. При необходимости использования двух слоев параметр hidden нужно опреде- лять как двухкомпонентный вектор, например, hidden = c(6,2) определяет два скрытых слоя с 6 нейронами в первом и 2 нейронами во втором слое. 9 Число эпох обучения задается параметром rep, который по умолча- нию имеет значение 1. Обычно, когда сеть не может достигнуть заданной точности за одну эпоху, выдается предупреждение «Algorithm did not converge in 1 of 1 repetition(s) within the stepmax». Задание'>Лабораторная работа № 1 Работа состоит из двух заданий, необходимо выполнить оба задания. Задание 1. Смоделировать заданную функцию на отрезке [0, 8] с ис- пользованием библиотеки neuralnet. Отчет должен содержать подготовку данных для обучения сети. Обоснование выбранной архитектуры. Струк- турную схему обученной сети с указанием весов. Графики моделируемой и смоделированной функций. Варианты заданий приведены в табл.1 (номер варианта определяется последней цифрой номера зачетки). Таблица 1 Варианты задания Вариант Моделируемая функция 0 y = cos x / (sin 2x + 2) 1 y = sin x(arctg 0.5x) + cos x 2 y = 0.5 sin x + cos 2x + √???? 3 y = cos x + x – sin 2x 4 y = 4 arctg x + sin x 5 y = sin x / (cos 2x + 2) 6 y = sin x + x – cos 2x 7 y = 0.4 cos x + sin 3x + √???? 8 y = 0.5 cos x + 1.5 arctg 0.2x + √???? 9 y = sin 0.3x2 + √???? Задание 2. Подобрать структуру hidden и порог функции ошибки threshold для точной аппроксимации заданных последовательностей им- пульсов. Отчет по работе должен содержать структурную схему обученной сети без указания весов. Графики аппроксимируемой и полученной после- довательности для нескольких приближений параметров hidden и threshold. Варианты заданий приведены в табл.2. Таблица 2 Варианты задания Вариант Последовательность импульсов Четная цифра x = seq(from = -9.5, to = 10, by = 0.5) y = rep(c(1,1,1,1,1,0,0,0,0,0), 4) Нечетная цифра x = seq(from = 0, to = 3.15, by = 0.05) y = rep(c(1,1,1,1,0,0,0,0), 8) 10 Графики должны быть в виде наложения полученной последователь- ности на аппроксимируемую. Пример построения графиков приведен на рис. 4. Для получения нескольких графиков в одном окне используйте ко- манду типа par(mfrow = c(3, 2)), которая указывает, что окно делится на 3 части по горизонтали и на две по вертикали, где будет размещено 6 графи- ков. Рис. 4. Пример построения графиков Для изображения нескольких кривых на одном графике используется две функции plot() и lines(). Функция plot() для первого графика, а функции lines() для последующих. Например, на рис. 4 для построения желтых кри- вых использован plot(x, y, type = ‘l’, col = “yellow”, lwd = 9), а для наложения черных lines(x, y1).Прогнозирование временных рядов В большинстве случаев основой для прогнозирования служат ретро- спективные данные в виде временных рядов. В Data Mining существует спе- циальное понятие временного ряда (Time-Series). Анализ временных рядов от анализа случайных выборок отличается предположением о равных про- межутках времени между наблюдениями и наличием хронологического по- рядка. Привязка наблюдений ко времени играет здесь ключевую роль, тогда как при анализе случайной выборки она не имеет никакого значения. Рис. 5. Временной ряд а10 11 Возьмем в качестве примера временного ряда данные a10 из библио- теки fpp2 [8]. Файл a10 включает данные о количестве выписанных ежеме- сячных рецептов на фармацевтические продукты, подпадающие под код A10, согласно данным Австралийской комиссии по страхованию здоровья. Данные представлены за период с июля 1991 по июнь 2008 год. Характер изменения значений этого временного ряда представлен на рис. 5. Задача состоит в том, чтобы путем анализа временного ряда опреде- лить тенденции динамики его изменения на основе ретроспективных значе- ний. Обучающая выборка строится на основе разбиения данных на равные периоды, для каждого из которых правильным значением на выходе уста- навливается первое следующее за ним значение. На практике строится мат- рица наблюдений с числом столбцов, равным длине периода наблюдения плюс единица. На рис. 6 представлено подобное разбиение для временного ряда а10. Периодом наблюдения является 12 месяцев, поэтому входной вектор X обу- чающей выборки имеет размерность 12, а выходной вектор Y является од- норазмерным. На рис. 6 показано построение первых пяти обучающих набо- ров. Первый набор представляет из себя 13 первых элементов ряда а10, где 12 элементов образуют входной вектор, а 13-ый элемент выходной вектор. Второй набор образован из тринадцати элементов ряда а10, начиная со вто- рого элемента и также разбит на 12+1 и так далее. Например, пятый набор сформирован из 13 элементов ряда а10, начиная с пятого элемента и разбит на 12+1. Рис. 6. Заполнение матрицы наблюдений Решение задачи прогнозирования представлено в листинге 2. Рассмот- рим его особенности. Сначала загружаются необходимые библиотеки fpp2 и nnet, данные а10 считываются в переменную scripts и подсчитывается их число n. Далее готовится матрица наблюдений LearnSeq с числом столбцов 13 и строк n – 12. Матрица заполняется данными в соответствии с рассмотрен- ным выше способом (строка 12, листинг 2). В качестве модели персептрона будем использовать функцию nnet(). Следует отметить, что эта функция допускает наличие только одного скры- того слоя, поэтому параметр size может задавать число нейронов только в одном слое. Перед заданием параметров и запуском на обучение сети не 12 забываем зафиксировать начальную фазу генератора случайных чисел set.seed(55). Выбираем число нейронов size = 60, разрешаем в качестве функции активации выходного нейрона линейную функцию linout = TRUE. Для пер- воначальных случайных весов выбираем значение rang = 0.1 и задаем мак- симальное число итераций maxit = 300. Интересно, как правильно осуществ- лять выбор параметров нейронной сети, значения которых, заданные по умолчанию, явно не подойдут. Прежде всего следует понимать какие пара- метры могут повлиять на работу сети для конкретной задачи. В данном слу- чае решается задача прогнозирования временного ряда, поэтому параметр decay = 0 можно оставить без внимания, так как шумы отсутствуют. Глав- ными в этом случае являются size, rang и maxit. Два первых проще всего находить подбором, а число итераций чем больше, тем лучше. При обуче- нии сети, когда по умолчанию включен параметр trace = TRUE, можно уви- деть реальное число необходимых эпох.   1   2   3   4

Листинг 2. Прогнозирование временного ряда Попробуйте изменять значения параметров сети Nnet, заданные в ли- стинге 2, изучая их влияние на качество прогнозирования. Будет несложно заметить, как меняется качество прогноза непосредственно на результиру- ющем графике (рис. 7). 13 Здесь результирующий график построен с использованием функции ggplot(), которая предоставляет гораздо больше возможностей по сравне- нию с функцией plot(). Для качественной визуализации результатов любых исследований знание возможностей, которые предоставляют эти функции, и приобретение навыков их применения чрезвычайно полезно. Достаточно просто и кратко необходимые сведения об этих функция изложены в 5 и 6 разделах веб-ресурса [5]. На графике рис. 5 прогноз, сделанный сетью представлен тонкой жел- той кривой поверх синего графика временного ряда а10. Можно заметить, что его начало сдвинуто на 12 месяцев. Рис. 7. График числа рецептов а10 (синий) и предсказанный сетью (желтый) Можно воспользоваться функцией plotnet() из библиотеки NeuralNetTools и отобразить архитектуру обученной сети Nnet (рис. 8). Си- наптические связи с положительными весами выделены на рис. 8 красным цветом, а с отрицательными – синим. Рис. 7. Архитектура сети Nnet 14 Лабораторная работа № 2 Составить прогноз для заданного временного ряда с использованием библиотеки nnet. Отчет должен содержать подготовку данных для обучения сети. Обоснование выбранной архитектуры. Структурную схему обученной сети без указания весов. Варианты заданий приведены в табл. 3, где указаны названия временных рядов, которые доступны из библиотеки fpp2 [8]. Таблица 3 Варианты задания Вариант Временной ряд 0 auscafe 1 austourists 2 calls 3 debitcards 4 departures (resshort) 5 elecequip 6 qauselec 7 qcement 8 qgas 9 departures (visshort) Графики прогнозируемого и спрогнозированного временного ряда по- строить с использованием функции ggplot(). Классификация объектов Задача классификации очень часто встречается на практике. Если рас- познаются только два класса, то в выходном слое персептрона находится только один нейрон, который обладает двумя реакциями. Если классов больше двух, то для каждой группы устанавливается свой нейрон. Рассмотрим основные приемы часто используемые при анализе дан- ных для множественной классификации. Проще всего их продемонстри- ровать на классическом примере классификации сортов ирисов. Набор iris [4], который включает 150 измерений параметров длины и ширины чашели- стика (sepal) и лепестка (petal) трех сортов ирисов Фишера: щетинистого (Setosa), виргинского (Virginica) и разноцветного (Versicolor), по 50 измере- ний для каждого сорта. Функция summary(), запущенная в консоли RStudio, позволяет ознако- миться с основными параметрами этого набора данных iris: 15 Отсюда видно, что имеется четыре входных параметра (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) и три категории сорта (species) ири- сов. Исходя из этого, можно предложить архитектуру персептрона, изобра- женную на рис. 8, где в скрытом слое условно изображено 6 нейронов. Рис. 8. Архитектураперсептрона для классификации данных iris При подготовке наборов данных (data set) весь набор делят на две ча- сти – обучающий или тренировочный набор (train set) и проверочный или тестовый набор (test set). Часто соотношение составляет 70-75% и 30-25%. Несмотря на то, что набор данных iris состоит всего из 150 векторов, сде- лаем такое разбиение. Важно здесь то, что нужно разбить весь набор на две части так, чтобы в любой из них представители из каждой категории или класса были в равных долях. В листинге 3, решающем задачу классифика- ции данных на основе модели nnet, это разбиение выполняется в строке 14, где в samp формируется по 35 случайных номеров векторов из каждой кате- гории для обучающего набора. Обратите внимание на интересный прием, который используется для формирования тестового набора. Если в обучающий наборtrain.set включа- ются все векторы с номерами из samp (строка 17), то в тестовый набор test.set – все остальные векторы и это записывается следующим образом data.iris[-samp,] (строка 18). В листинге 3 использовано всего 2 нейрона в скрытом слое size = 2 и, как мы увидим их вполне достаточно для решения этой простой задачи. Кроме наборов входных train.set и выходных targets[samp,] обучающих век- торов и значения size, которые всегда необходимо формировать, задан только один параметр maxit, определенный по умолчанию. Его значение по умолчанию равно maxit = 100, а мы задали значение maxit = 500. 16 Листинг 3. Классификация набора irisПоскольку, по умолчанию параметр trace = TRUE, визуальное отсле- живание процесса обучения сети включено и мы увидим следующее: > net.iris <- nnet(train.set,targets[samp,], size = 2, maxit = 500) # weights: 19 initial value 78.686545 iter 10 value 43.022535 iter 20 value 25.951476 iter 30 value 24.543711 iter 40 value 24.161124iter 50 value 23.892634 iter 60 value 22.477187 iter 70 value 22.342019 iter 80 value 22.106268 iter 90 value 21.860257 iter 100 value 21.258000 iter 110 value 20.159820 iter 120 value 19.850850 iter 130 value 19.684387 iter 140 value 19.446336 iter 150 value 19.419291 final value 19.418854 converged 17 Мы видим, что сформированная функцией nnet() сеть net.iris включает 19 обучаемых весов (объясните почему) и ошибка обучения или потери уменьшаются в процессе итераций. В итоге, для сходимости процесса обу- чения в нашем случае потребовалось 150 итераций. Таким образом, следует уяснить, что сеть закончит обучение либо выполнив число итераций, задан- ное параметром maxit,либо достигнув заданной точности (параметрами ab-stol и reltol). Для оценки качества классификации удобно использовать провероч- ную матрицу, которая показывает, как сеть справилась с задачей. Для по- строения такой матрицы можно использовать две функции table() и max.col(), а в качестве параметров то, что требовалось получить на выходе сети и то, что она получила. В нашем случае результат выполнения кода строки 28 будет следующим: > table(max.col(targets[-samp,]), max.col(net.pred)) 1 2 3 1 14 0 1 2 0 15 0 3 0 0 15 Номера строк и столбцов соответствуют трем классам, на которые сеть должна разбить входные векторы. Очевидно, поскольку в тестовом наборе мы оставили по 15 векторов каждого класса, идеальным результатом является диагональная матрица с элементами 15, 15, 15. Полученный ре- зультат говорит о том, что сеть выдала только одно неверное предсказание, отнеся вектор первого класса к третьему. Попробуйте устранить этот недо- чет и поделитесь полученным результатом. Лабораторная работа № 3 Для выполнения лабораторной работы воспользуемся данными до- ступными на ресурсе http://archive.ics.uci.edu/ml/datasets/Vertebral+Column. Загрузите архив vertebral_column_data.zip и выберите из этого архива файл column_3C.dat. Файл содержит результаты рентгенологического исследования 310 пациентов. Каждый пациент представлен в наборе данных шестью парамет- рами, определяемыми формой и ориентацией таза и поясничного отдела по- звоночника в следующем порядке: угол падения таза, наклон таза, угол по- ясничного лордоза, наклон крестца, радиус таза и степень спондилолистеза. Для обозначений классов используется следующее соглашение: DH (грыжа диска), спондилолистез (SL) и нормальный (NO). Подготовить набор данных используя файл column_3C.dat. Построить и обучить сеть для классификации диагноза пациентов. Отчет должен 18 содержать подготовку данных для обучения сети. Обоснование выбранной архитектуры. Проверочную матрицу для оценки качества классификации. Построение автокодировщиков Автокодировщики представляют интересный тип нейронных сетей, задачей которых является максимально возможное сжатие входного вектора и его воссоздание из этого сжатого представления. В связи с этим, характер- ной особенностью автокодировщиков является совпадение количества нейронов на входном и выходном слое. Сама по себе способность сжимать данные используется редко, однако автокодировщики можно использовать для предобучения, например, когда стоит задача классификации, а разме- ченных пар слишком мало, либо когда просто надо научиться различать по- лезные свойства входного сигнала. Рассмотрим пример построения, обучения и проверки автокодиров- щика для букв латинского алфавита в стилизации art1_letters.pat из набора данных snnsData библиотеки RSSNS. Для построения используем модель персептрона neuralnet с числом входов и выходов 35 и числом нейронов в скрытом слое hidden = 10. Число входов и выходов сети определяется дли- ной вектора представления букв 7х5 = 35, а число нейронов скрытого слоя определялось в процессе обучения. Листинг 4. Автокодировщик букв латинского алфавита art1_letters.pat Подготовка обучающей выборки в данном случае не составляет труда, так как входной и выходной наборы совпадают и взяты 19 непосредственно из библиотеки (строка 4 – 6, листинг 4). Для визуа- лизации алфавита использована функция print.alphabet(), ее содержа- ние раскрыто в листинге 5. Обратите особое внимание на способ формирования формул для входов и выходов автокодировщика. Поскольку их размерность равна 35, то вручную записывать такие последовательности трудоемко. По- этому удобно воспользоваться функциями конкатенации paste0() и as.formula() (строка 9 – 11, листинг 4), результатом использования ко- торых получена необходимая формула. Для проверки правильности формирования формулы посмотрим содержимое переменной form: > form in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + in9 + in10 + in11 + in12 + in13 + in14 + in15 + in16 + in17 + in18 + in19 + in20 + in21 + in22 + in23 + in24 + in25 + in26 + in27 + in28 + in29 + in30 + in31 + in32 + in33 + in34 + in35 in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + in9 + in10 + in11 + in12 + in13 + in14 + in15 + in16 + in17 + in18 + in19 + in20 + in21 + in22 + in23 + in24 + in25 + in26 + in27 + in28 + in29 + in30 + in31 + in32 + in33 + in34 + in35 Как видим, сначала сформированы имена выходов, объединен- ные знаком «+», а затем, после знака «», имена входов. Правда, здесь они совпадают. Следует отметить, что функция neuralnet() позволяет подбирать оптимальные значения для более, чем десятка параметров. Здесь мы задаем только два: число нейронов в скрытом слое hidden = 10 и до- статочно низкий порог функции ошибки threshold = 0.0006. Обученный автокодировщик тестируем на том же входном наборе, на котором обучали с помощью функции predict(). Листинг 5. Функция визуализации алфавита Для визуализации результатов обучения удобно использовать описанную выше функцию print.alphabet(). На рис. 9 приведен резуль- тат работы обученной сети в сравнении с обучающей выборкой. 20 Рис. 9. Обучающая выборка и восстановленный алфавит при сжатии 3.5 В скрытом слое было использовано 10 нейронов, поэтому коэффици- ент сжатия входного вектора равен 35/10 = 3.5. Попробуйте менять пара- метры сети (hidden и threshold) с тем, чтобы получить качественное восста- новление для других коэффициентов сжатия. Лабораторная работа № 4 Построить автокодировщик для заданной обучающей выборки. Отчет должен содержать подготовку данных для обучения сети. Формирование формул для входа и выхода. Визуализацию обучающей выборки и восста- новленного образца. Структурную схему обученной сети без указания ве- сов. Варианты заданий приведены в табл. 4, где указаны названия файлов с обучающей выборкой, которые доступны из библиотеки RSNNS [4]. Таблица 4 Варианты задания Вариант Обучающая выборка Четная цифра snnsData$letters_auto.pat Нечетная цифра snnsData$artmap_test.pat Оценку максимально возможного сжатия производить визуально. Ви- зуализировать обучающие выборки можно с использованием функции ли- стинга 5, выполняя вызовы print.alphabet(snnsData$letters_auto.pat,14) и print.alphabet(snnsData$artmap_test.pat,8) 21 2. ОГРАНИЧЕННЫЕ МАШИНЫ БОЛЬЦМАНА Ограниченные машины Больцмана (restricted Boltzmann machine - RBM) являются особым видом генеративных стохастических нейронных се- тей, которые обучаются методом градиентного спуска с контрастивной ди- вергенцией [12]. На практике RBM используются для снижения размерности данных, классификации и выделения признаков. Большой практический ин- терес представляют также сети глубокого доверия (deep belief network - DBN), которые строятся путем специального каскадирования RBM. Изучение моделей RBM и DBN построим на базе функций библиотеки Timo Matzen из [13]. Функции RBM() и StackRBM() позволяют изучать соответствующие модели, а функции ReconstructRBM() и PredictRBM() предоставляют воз- можность визуализировать реконструированные векторы и оценить каче- ство классификации. Листинг 6. Функция подготовки изображенийЧасто в качестве обучающего набора используются изображения. Ко- гда подобные наборы формируются самостоятельно, удобно иметь автома- тизированное средство для подобной подготовительной работы. В качестве подобного средства предлагается функция подготовки изображений 22 image_conversion(), представленная в листинге 6. Функция обрабатывает все изображения размещенные в некотором директории, выполняя следующие действия: приводит размеры изображения к заданным (width х height), пре- образует в черно-белое, представляет как вектор и формирует результирую- щую матрицу всех изображений. Возвращаемая матрица имеет размеры – число строк равно числу обработанных изображений, число столбцов равно произведению width х height. Для использования функции image_conversion() необходимо предва- рительно заполнить выделенный директорий файлами с изображениями. Данная функция построена на базе возможностей предоставляемых библио- теками EBImage и pbapply. На рис. 10 приведен результат использования этой функции (первый ряд – приведение к размеру 28х28, второй ряд – пе- ревод в черно-белое изображение). Рис. 10. Преобразование изображений Рассмотрим варианты использования функций библиотеки RBM для понижения размерности обучающей выборки изображений. В качестве обу- чающей выборки загрузим изображения котят из веб-ресурса https://ru.wallpaper.mob.org/ и разместим их в рабочем директории в папке Cats (пример части загруженных изображений на рис. 10). Указанный ре- сурс является свободно распространяемым и может быть использован для загрузки изображений различных категорий. Библиотека RBM предоставляет как функцию RBM(), моделирующую отдельно взятую ограниченную машину Больцмана, так и функцию StackRBM(), позволяющую формировать стек из этих машин. В листинге 7 приведен пример использования обеих функций RBM() и StackRBM(). После загрузки необходимых библиотек с помощью описанной выше функции image_conversion() формируется обучающая выборка изображе- ний размером 28х28 пикселей. Для ограниченной машины Больцмана зада- ется скрытый слой из 196 нейронов и устанавливается 400 итераций (эпох) обучения. Чтобы обеспечить наглядное сравнение результатов обучения отдель- ной ограниченной машины Больцмана и стека из этих машин вводится па- раметр mflow = c(2,10) задающий печать двух строк по 10 изображений. 23 Для стека ограниченных машин Больцмана задается три скрытых слоя с числом нейронов 392, 196 и 98. В качестве дополнительных параметров задается мини-батч размером 10, а также скорость обучения и коэффици- енты lambda и momentum. Листинг 7. Обучение ограниченных машин БольцманаДля того, чтобы обеспечить вывод в цикле произвольного числа ре- конструированных изображений оригинальная функция ReconstructRBM(), представленная в листинге 8, была частично изменена и обозначена Re-sultRBM() (листинг 9). Листинг 8. Оригинальная функция печати реконструированных изображений 24 Измененные части в оригинальной и измененной версии функции вы- делены желтым цветом. Листинг 9. Измененная функция печати реконструированных изображенийРезультат работы сети mod, моделирующей ограниченную машину Больцмана и modCat, моделирующей стек ограниченных машин, приведены на рис. 11. Рис. 11. Результат работы нейронной сети mod и modCatФункция DBN() обучает сеть глубокого доверия, начиная с предвари- тельно обученного стека неконтролируемых RBM, используя функцию StackRBM(), а затем добавляется контролируемый выходной слой. Резуль- тирующая сеть DBN настраивается по контролируемому критерию с ис- пользованием обратного распространения. Качество обучения позволяет оценить функция PredictDBN(). Рассмотрим использование сети глубокого доверия для классифика- ции образов на примере функции DBN(). В качестве обучающей и тестовой выборки возьмем классический набор MNIST (листинг 10). Листинг 10. Классификация MNIST сетью глубокого доверия 25 При вызове функции DBN() использовано много входных параметров, определяющих особенности обучения модели modDBN. Для предваритель- ного тренинга (предобучения со скоростью 0.1) задано 150 эпох для каж- дого уровня RBM. Обучение на основе градиентного спуска определено на 10000 эпохах со скоростью 0.5. Размер батча установлен равным 10. Пара- метр verbose = TRUE разрешает визуализацию процесса обучения – печать значения потерь (cost) на каждой эпохе. Для оценки результата классификации сетью глубокого доверия ис- пользована функция PredictDBN(), которая показывает достаточно не- плохую точность 0.916: Следует пояснить, почему при использовании функции PredictDBN() указан параметр layers = 4, хотя сеть modDBN включает три слоя nodes = c(500, 300, 150). Это сделано с учетом добавления контролируемого выход- ного слоя. 1   2   3   4

Лабораторная работа № 5 Построить ограниченную машину Больцмана для понижения размер- ности обучающей выборки. В качестве последней возьмите 10 произволь- ных изображений. Для их предварительной обработки используйте функ- цию листинга 6, задавая размеры 100 х 100 пикселов. Подберите параметры RBM для получения удовлетворительного качества. Визуализируйте полу- ченные результаты. Сформируйте стек ограниченных машин Больцмана с помощью функ- ции StackRBM(). Проведите исследование с тем же набором изображений. Подберите параметры стека для получения удовлетворительного качества. Визуализируйте полученные результаты. Проделайте сравнительный анализ возможностей, предоставляемых для понижения размерности обучающей выборки отдельной RBM и стеком из RBM. 26 3. СЕТИ КОХОНЕНА Сети Кохонена – это одна из разновидностей нейросетевых алгорит- мов. Алгоритм функционирования самообучающихся карт SOM (Self Organizing Maps) представляет собой один из вариантов кластеризации мно- гомерных векторов [10]. Для моделирования сетей Кохонена используются функции somgrid() и som() из пакета kohonen. Для обученной сети с помощью функции plot() становится доступным для визуализации следующий комплект карт: codes - показывается распределение по решетке соотношения долей участия отдельных исходных переменных; counts - число исходных объектов в каждом узле сети; mapping - координаты исходных объектов на сформированной карте; property, quality, dist.neighbours - различными цветами изображается целый набор свойств каждого узла: доли участия отдельных исходных пе- ременных, меры парных или средних расстояний между нейронами и т.д. Рассмотрим пример, в котором используем три указанные функции. В качестве исходных данных для анализа используем фрейм данных wines, по- ставляемый с библиотекой kohonen. Фрейм wines, включает 177 строк и три- надцать столбцов, где приведены результаты химического анализа вин, вы- ращенных в одном и том же регионе Италии (Пьемонт), но полученных из трех разных сортов винограда: Неббиоло, Барбера (Barbera) и Гриньолино (Grignolino). Вино из винограда сорта Неббиоло называется Бароло (Barolo). Данные содержат количества нескольких компонентов, присут- ствующих в каждом вине, а также некоторые спектроскопические перемен- ные. Для каждой строки фрейма wines переменная vintages содержит метки классов, соответствующие винтажам Barbera, Grignolino и Barolo. Листинг 10. Моделирование карт Кохонена 27 Как видно из листинга 10 перед кластеризацией исходные данные от- масштабированы функцией scale(). Для карты функцией somgrid() сформи- рована сетка размером 10 х 17 и задана структура «шестиугольник». С помощью функции cutree() мы осуществили разбиение всех вин на три кластера и с помощью функции plot() построили карту Кохонена (рис. 12). Дополнительная прорисовка кластеров выполнена с помощью функции add.cluster.boundaries(). Рис. 12. Карта Кохонена для трех кластеров Карта дополнена информацией о всех компонентах анализируемых векторов, с указанием названия компоненты и цвета отведенного для ее представления. Это позволяет визуально оценить качество кластеризации и принять решение об изменении числа кластеров для оптимизации разбие- ния. Лабораторная работа № 6 Построить карты Кохонена для тестовых наборов из ресурса Wine Quality (http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/) репозитария [6]. Варианты заданий приведены в табл. 5. Таблица 5 Варианты задания Вариант Обучающая выборка Четная цифра winequality-red.csv Нечетная цифра winequality-white.csv Отчет должен содержать описание тестового набора, подготовку обу- чающих данных, выбор и обоснование количества кластеров. Представлен- ный в отчете код должен иметь подробный комментарий. 28 4. СВЕРТОЧНЫЕ СЕТИ Сверточные нейронные сети (CNN – Convolutional Neural Networks) используют две основные операции – свертки и пулинга. В архитектуре сети слои, которые выполняют их, следуют друг за другом, постепенно извлекая и выделяя характерные признаки анализируемых данных. Когда признаки достаточно выделены, требуемый результат формируется с помощью пол- носвязного слоя, в котором осуществляется анализ их взаимовлияния на итог исследования. В отличие от классических нейронных сетей, для которых разрабо- тано большое число моделей, сверточные сети требуют «индивидуального» подхода к архитектуре. Поэтому для формирования CNN используют биб- лиотеки, предоставляющие возможность формирования и объединения между собой отдельных слоев - свертки, пулинга и полносвязного слоя. Несмотря на то, что CNN специализирована для задач компьютерного зрения и распознавания изображений, она также оказалась полезной во мно- гих других приложениях и часто используется на практике. Достаточно ин- тересное погружение в сверточные сети можно найти на ресурсе [11]. Здесь мы остановимся на двух аспектах, связанных с использованием моделей CNN – это переобучение и визуализация промежуточных актива-ций. Переобучение - распространенная проблема когда имеется только не- сколько образцов данных, на которых можно учиться. Это мешает модели хорошо обучиться. Один из методов, который помогает справиться с этой проблемой – приращение (augmentation) данных. Этот метод уменьшает пе- реобучение за счет генерации большего количества обучающих данных из существующих выборок с помощью нескольких случайных преобразова- ний, создающих правдоподобные изображения. Для модификации применя- ются такие операции, как сдвиг, переворачивание, масштабирование и тому подобные. Библиотека keras предоставляет удобные функции для реализа- ции метода аугментации в реальном времени. Пример использования данных функций представлен в листинге 11. В качестве образцов для аугментации выбран директорий cats-dogs, включа- ющий jpeg изображения кошек и собак. Функция image_data _generator() позволяет определить необходимые диапазоны изменений параметров ис- ходного изображения. В листинге 11 для этой функции использованы да- леко не все доступные возможности настройки, подробно с назначением каждого параметра можно ознакомиться, например в [17]. Изображения из директория приводятся к одинаковому размеру 150х150 пикселов и преобразуются в тензор размерности 1,150,150,3. В строке 14 листинга 11, для простоты задается только одно 9-ое изображение. Функция flow_images_from_data() запускает работу генератора ауг- ментации augmentation_generator, который затем используется в цикле для 29 вывода 12 последовательных преобразований исходного изображения fnames[[9]]. Листинг 11. Приращение обучающего набора путем аугментацииРезультат работы скрипта листинга 11 представлен на рис. 13. Отсюда видно, что трансформации параметров изображения осуществляются по случайному закону. Рис. 13. Результат аугментации 30 Получаемые изображения существенно дополняют палитру обучаю- щих данных, помогая справляться с проблемой переобучения нейронной сети. Визуализация промежуточных активаций помогает понять как пре- образуются входные данные по мере прохождения по слоям нейронной сети (вывод результата функций активации слоя называют его активацией). Карты признаков изучаемые сверточными нейронными сетями, легко под- даются визуализации благодаря тому, что представляют визуальные объ- екты. Визуализация активаций заключается в отображении карт признаков, которые выводятся разными сверточными и объединяющими слоями сети в ответ на определенные входные данные. Рассмотрим особенности использования функций, предоставляемых библиотекой keras для визуализации активаций. В качестве объекта иссле- дования можно загрузить любую сохраненную модель CNN. Это выполня- ется с помощью функции load_model_hdf5(). Загрузим обученную модель из [19] и создадим экземпляр модели из входного тензора и списка выходных тензоров (листинг 12 ). Листинг 12. Загрузка модели и создание экземпляра Характеристика слоев используемой нейронной сети приведены в табл. 6. По мере продвижения от входа к выходу размеры карт признаков постепенно уменьшаются, а их число увеличивается. Таблица 6 Характеристика слоев нейронной сети cats_and_dogs_small_1Созданный с помощью функции keras_model() экземпляр модели acti-vation_model позволяет сформировать активацию для любой карты призна- ков в каждом из восьми слоев. Для ее визуализации удобно использовать функцию plot_channel() представленную в листинге 13. Номер и тип слоя Размер карты признаков Число карт 1 Свертка 148 х 148 32 2 Пулинг 74 х 74 32 3 Свертка 72 х 72 64 4 Пулинг 36 х 36 64 5 Свертка 34 х 34 128 6 Пулинг 17 х 17 128 7 Свертка 15 х 15 128 8 Пулинг 7 х 7 128 31 Для анализа получаемых послойных активаций выберем произволь- ное входное изображение img из тестовой выборки, преобразуем его в тен- зор img_tensor размерности 1, 150, 150, 3 и нормализуем img_tensor = img_tensor / 255. Используя полученный img_tensor в качестве входного па- раметра функции predict() будем в цикле использовать функцию plot_chan-nel(). Листинг 13. Функция визуализации карты признаков На рис. 14 приведены примеры визуализации одной, случайно вы- бранной карты признаков на каждом слое. Рис. 14. Примеры визуализации карты признаков по слоям Как видно из рисунка, по мере продвижения по слоям активации изоб- ражения становятся все более абстрактными, а их визуальная интерпрета- ция становится сложней. По сути они начинают кодировать высокоуровне- вые представления и несут все меньше информации об исходном изображе- нии и все больше — о классе изображения. Последняя карта напоминает QR-код, в котором закодирована информация о классе принадлежности изображения поданного на вход. Лабораторная работа № 7 Изучите особенности использования функции image_data_generator(). Продемонстрируйте возможности управления всеми ее параметрами для формирования обучающих примеров. Какие параметры являются наиболее эффективными? Выберите несколько произвольных изображений относящихся к двум классам, сформируйте достаточный обучающий набор на базе функции flow_images_from_data() и постройте простую сверточную нейронную сеть решающую задачу классификации. Дополнительно: используя информацию из [19], визуализируйте все карты признаков построенной сети для произвольного входного изображе- ния. 32 5. ВАРИАЦИОННЫЕ АВТОКОДИРОВЩИКИ Классический автокодировщик учится представлять входные данные в скрытом пространстве уменьшенных размеров. Он изучает произвольную функцию для выражения входных данных в сжатом скрытом представле- нии. Вариационный автокодировщик (VAE) вместо изучения произвольной функции изучает параметры распределения вероятностей сжатого представ- ления. Если мы сможем выбирать точки из этого распределения, мы сможем сгенерировать новые данные. В этом смысле VAE относится к генеративным моделям нейросетей. Вариационный автокодировщик состоит из двух сетей: сети кодера и сети декодера (рис. 15). Кодер — это нейронная сеть, которая принимает входные данные x и выдает скрытое представление z. Целью сети кодера является для каждого x предсказать два значения — среднее значение µ и отклонение (дисперсию) sнормального распределения, из которого сэм- плируются случайные образцы z. По сути, кодер в VAE изучает распределе- ние вероятностей Pq(z|x), где q — параметр сети кодера. Рис. 15. Структура вариационного автокодировщика Целью сети декодера является восстановление входных данных x из случайного образца z (z принадлежит распределению с параметрами μ и σ). Его задача — предсказать распределение вероятностей Qф(x|z), где ф — па- раметр сети декодера. В типичном VAE функция потерь состоит из двух частей: потери вос- становления и потери регуляризатора. Для одного обучающего примера функция потерь задается следующим уравнением: ????(????, ????) = ????!#!(????|????)+log ????'(????|????1) − ????????[????((????|????)|????(0, ????)] 33 Первый член уравнения — потери реконструкции, а второй — это рас- хождение Кульбака-Лейблера (KL) между изученным распределением веро- ятностей, и истинным распределением скрытой переменной,. В VAE пред- полагается, что скрытые переменные происходят из стандартного нормаль- ного распределения, то есть P (z) есть N (0, 1). Рассмотрим пример реализации вариационного автокодировщика для генерации изображений [18]. В качестве изображений используется набор данных Fashion MNIST, который поставляется вместе с библиотекой keras. В листинге 14 загружаются необходимые библиотеки и набор данных раз- бивается на две части: для обучения x_train и тестирования x_test (строки 1 - 8). Листинг 14. Формирование вариационного автокодировщика В листинге 14 представлены последовательные шаги формирования вариационного автокодировщика. 34 На шаге 1 задаются параметры обучения – размер батча, размерности входа, параметров μ и σ и количество эпох. На шаге 2 определяется входной и скрытый слой сети кодера. Далее, на шаге 3 формируется скрытый слой для представления параметров μ и σ. На шаге 4 определяется функция сэмплирования, которая позволяет генерировать новую точку из скрытого пространства, а на шаге 5 формиру- ется слой, в котором из параметров μ и σ скрытого распределения генериру- ется случайный образец z. На шаге 6 мы создаем два скрытых слоя для части декодера VAE и объединяем их, чтобы создать выходной слой. Наконец, на шаге 7 мы фор- мируем вариационный автокодировщик. Используя функцию summary() можно изучить подробную структуру модели vae. Листинг 15. Обучение и тестирование 35 В листинге 15 описаны шаги, необходимые для обучения и тестирова- ния сформированного VAE. На шаге 8 и 9 создаются отдельные модели ко- дера и декодера, которые используются при реконструкции изображения из точки скрытого пространства случайного распределения. На шаге 10 опре- деляется функция потерь vae_loss(), учитывающая как потери восстановле- ния, так и потери регуляризатора. На шаге 11, после компиляции, определяющей стандартный оптими- затор rmsprop и свою функцию потерь vae_loss(), проводится обучение VAE. График изменения потерь при обучении loss и тестировании val_loss от 2-ой до 10-ой эпохи приведен на рис. 16. Рис. 16. Уменьшение потерь на 10 эпохах Проверка работоспособности VAE выполняется на шаге 11. Для пяти случайных точек скрытого пространства из random_distribution декодер в цикле формирует предсказания, то есть выходные векторы размерности 784 в переменной one_pred. Эти векторы преобразуются в матрицы размерности 28 х 28, которые сохраняются в переменной predicted. Рис. 17. Изображения сгенерированные VAE С помощью функции grid.raster() сгенерированные VAE изображения визуализируются (рис. 17). Лабораторная работа № 8 Изучить особенности работы вариационного автокодировщика. По- строить VAE для генерации рукописных цифр, используя набор MNIST. По- добрать параметры обучения для получения качественной реконструкции. 36 6. РЕКУРРЕНТНЫЕ СЕТИ НА БАЗЕ LSTM Рекуррентные сети часто используют для решения креативных задач. Рассмотрим пример использования модуля LSTM для реализации рекур- рентной сети, которая будет генерировать текст из заданного начального набора, состоящего из трех слов. Исходный текст или целый набор текстов при работе с языковыми моделями принято называть корпусом. Чтобы построить языковую модель, нужно «очистить» текст, исполь- зуемый для обучения, и разбить его на токены. Для этих целей удобно ис- пользовать токенизатор keras, который разбивает корпус на список токенов, удаляет все знаки препинания, преобразует слова в нижний регистр и строит внутренний словарь на основе введенного текста. Словарь генерируемый токенизатором, представляет собой индексированный список, в котором слова индексируются по их общей частоте в наборе данных. Возьмем в качестве исходного текста стихотворение К. Чуковского «Муха Цокотуха» и посмотрим насколько хорошо сеть может обучаться стихосложению. Подготовка исходных данных выполняется в листинге 16. Листинг 16. Подготовка обучающих данных 37 Здесь исходный текст преобразовывается в последовательность токе- нов. Обратите внимание, что аргумент num_words функции text_tokenizer() определяет максимальное количество сохраняемых слов в зависимости от их частоты. Это означает, что в закодированной последовательности сохра- няются только первые n часто встречающихся слов, в нашем случае 350. Далее обучающая выборка формируется в виде матриц X и Y. Каждая строка входной матрицы X содержит три последовательные слова из текста, представленные соответствующими им токенами, а в матрице Y записыва- ется токен слова, следующего за этими тремя. Длина начального набора inp_len выбрана нами равной трем, но может быть любой. Скрипт формирования и обучения LSTM модели представлен в ли- стинге 17. Структура модели строится с помощью четырех функций – встра- ивания layer_embedding(), определения числа модулей layer_lstm(), форми- рования полносвязного слоя layer_dense() и задания функции активации layer_activation(). Сначала мы инициализировали последовательную мо- дель, а затем добавили к ней слой внедрения. Далее мы добавили слой LSTM с 50 модулями. Поскольку предсказание слова – это проблема классифика- ции, при которой следующее слово выбирается из словаря, мы добавили полносвязный слой с числом нейронов, равным количеству слов в словаре и с функцией активации softmax. 1   2   3   4


ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ
БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ
им. проф. М. А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Ф.В. Филиппов
НЕЙРОСЕТЕВЫЕ
ТЕХНОЛОГИИ
ЛАБОРАТОРНЫЙ
ПРАКТИКУМ
САНКТ-ПЕТЕРБУРГ
2021

2
УДК 004.31(004.42)
ББК 32.973-018.2я73
Рецензент кандидат технических наук, доцент кафедры конструирования и производства радиоэлектронных средств
Т.В. Матюхина
Утверждено редакционно-издательским советом СПбГУТ
в качестве лабораторного практикума
Филиппов, Ф.В.
Нейросетевые технологии: лабораторный практикум / Ф. В. Филиппов;
СПбГУТ, – СПб., 2021. – 48 с.
Приведены методические материалы для выполнения лабораторных работ. Сформулированы задания к лабораторным работам и практиче- ским занятиям. Изложение материала ведется с примерами, реализован- ными в среде RStudio с использованием широкого круга библиотек.
Пособие предназначено для бакалавров направления 09.03.02 Инфор- мационные системы и технологии и будет полезно при изучении дисци- плин «Нейросетевые технологии» и «Технологии обработки информа- ции».
©
Филиппов Ф.В., 2021
©Федеральное государственное образовательное бюджетное учреждение высшего образования
«Санкт-Петербургский государственный университет телекоммуникаций им. проф. М. А. Бонч-Бруевича»,
2021

3
СОДЕРЖАНИЕ
ВВЕДЕНИЕ ............................................................................................................................... 4
ЛАБОРАТОРНЫЕ РАБОТЫ .................................................................................................. 5 1.
ПЕРСЕПТРОНЫ .............................................................................................................. 5
Аппроксимация функций .................................................................................................... 6
Лабораторная работа № 1 ................................................................................................ 9
Прогнозирование временных рядов ................................................................................. 10
Лабораторная работа № 2 .............................................................................................. 14
Классификация объектов ................................................................................................... 14
Лабораторная работа № 3 .............................................................................................. 17
Построение автокодировщиков ........................................................................................ 18
Лабораторная работа № 4 .............................................................................................. 20 2.
ОГРАНИЧЕННЫЕ МАШИНЫ БОЛЬЦМАНА .......................................................... 21
Лабораторная работа № 5 .............................................................................................. 25 3.
СЕТИ КОХОНЕНА ........................................................................................................ 26
Лабораторная работа № 6 .............................................................................................. 27 4.
СВЕРТОЧНЫЕ СЕТИ .................................................................................................... 28
Лабораторная работа № 7 .............................................................................................. 31 5.
ВАРИАЦИОННЫЕ АВТОКОДИРОВЩИКИ ............................................................. 32
Лабораторная работа № 8 .............................................................................................. 35 6.
РЕКУРРЕНТНЫЕ СЕТИ НА БАЗЕ LSTM .................................................................. 36
Лабораторная работа № 9 .............................................................................................. 39
ЗАДАНИЯ ДЛЯ ПРАКТИКИ ............................................................................................... 40
Задание № 1: Моделирование логической функции ....................................................... 40
Задание № 2: Классификация входных данных .............................................................. 40
Задание № 3: Построение карты Кохонена ..................................................................... 41
Задание № 4: Распознавание и классификация объектов ............................................... 42
Задание № 5: Сжатие данных ............................................................................................ 43
Задание № 6: Составление прогноза ................................................................................ 43
Задание № 7: Классификация объектов ........................................................................... 44
Задание № 8: Распознавание изображений ...................................................................... 45
Задание № 9: Классификация изображений .................................................................... 46
Задание № 10: Прогнозирование аварий сетевого оборудования ................................. 47
ЗАКЛЮЧЕНИЕ ...................................................................................................................... 47
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ............................................................. 48

4
ВВЕДЕНИЕ
Для решения широкого круга задач, когда не удается найти алгорит- мического решения используются нейронные сети. Способность нейронных сетей обучаться позволяет переложить сложности поиска решения на их плечи. Успех качественного обучения нейронных сетей зависит от многих факторов, но главными из них являются два – формирование хорошей обу- чающей выборки и выбор модели сети адекватной для конкретной задачи.
Если подбор и подготовка данных для обучения является общей процеду- рой, зависящей от целей обучения, то выбор надлежащей архитектуры сети, во многом зависит от характера решаемой задачи.
За период от начала практического использования нейронных сетей до настоящего времени сложились обоснованные предпочтения выбора конкретной архитектуры для задач определенного класса. Тем не менее про- цесс создания и апробирования новых моделей продолжается. Создано большое число библиотек, позволяющих легко экспериментировать и нахо- дить наилучшие решения.
Лабораторный практикум предназначен для получения навыков ра- боты с моделями нейронных сетей при решении широкого класса задач. Его со- держимое будет предельно понятно, если предварительно ознакомиться с одноименным учебным пособием [1]. Практикум содержит лабораторные работы и задания для самостоятельной практики.
Изучение относительно простых архитектур нейронных сетей осно- вано на использовании классических моделей персептронов, ограниченных машин Больцмана и сетей Кохонена. Все эти модели реализованы в виде функций, которые позволяют варьировать большое число параметров, не- обходимых для их адаптации к решаемой задачи и получения адекватных результатов.
Для построения более сложных архитектур с различным числом и назначением слоев, а также с введением специфических модулей, типа
LSTM, здесь используется библиотека keras.
При выполнении лабораторных работ рекомендуется детально изу- чить листинги, предваряющие задание, и выполнить их в среде RStudio. За- дания для самостоятельной практики взяты из веб-ресурсов, с которыми возможно следует познакомиться. Выполнение этих заданий носит характер небольшого исследования.
Поскольку предлагаемые здесь примеры и задания используют язык программирования R, полезно также получить некоторые навыки его ис- пользования, например, изучив базовые структуры и функции из [2]. Для тех, кто знаком с языком Python, предлагается выполнять представленные здесь задания в среде Colab [3].

5
ЛАБОРАТОРНЫЕ РАБОТЫ
1. ПЕРСЕПТРОНЫ
Главной особенностью моделей нейронных сетей, объединенных под названием персептрон, являются полносвязные слои. В них нейрон преды- дущего слоя связан со всеми нейронами следующего слоя. В среде RStudio используется три модели персептрона, реализованные в виде функций
nnet(), neuralnet() и mlp() [4]. Каждая из этих функций имеет много парамет- ров, большинству из которых присвоены значения по умолчанию: nnet(x, y, weights, size, Wts, mask, linout = FALSE, entropy = FALSE, softmax = FALSE, censored = FALSE, skip = FALSE, rang = 0.7, decay = 0, maxit = 100, Hess = FALSE, trace = TRUE, MaxNWts = 1000, abstol = 1.0e-4, reltol = 1.0e-8) neuralnet(formula, data, hidden = 1, threshold = 0.01, stepmax = 1e+05, rep = 1, startweights = NULL, learningrate.limit = NULL, learningrate=NULL, learningrate.factor = list(minus = 0.5, plus = 1.2), lifesign = «none», lifesign.step = 1000, algorithm = «rprop+», err.fct = «sse», act.fct = «logistic», linear.output = TRUE, exclude = NULL, constant.weights = NULL, likelihood = FALSE) mlp(x, y, size = c(5), maxit = 100, initFunc = «Randomize_Weights», initFuncParams = c(-0.3, 0.3), learnFunc = «Std_Backpropagation», learnFuncParams = c(0.2, 0), updateFunc = «Topological_Order», updateFuncParams = c(0), hiddenActFunc = «Act_Logistic», shufflePatterns = T, linOut = FALSE, inputsTest = NULL, targetsTest = NULL, pruneFunc = NULL, pruneFuncParams = NULL)
Обилие параметров предоставляет широкие возможности по настройке или, как часто говорят, по подгонке выбранной модели для опти- мального решения задачи.
Известно, что персептроны удобно применять в решении практиче- ских задач, связанных с классификацией и аппроксимацией (или регрес- сией):
• сеть с одним скрытым слоем, содержащим N нейронов со ступенчатой функцией активации, способна осуществить произвольную классифи- кацию Nd точек d-мерного пространства (то есть классифицировать
Nd примеров);
• одного скрытого слоя нейронов с сигмоидной функцией активации достаточно для аппроксимации любой функции со сколь угодно вы- сокой точностью.
Рассмотрим примеры использования различных моделей персептро- нов для решения различных задач.

6
Аппроксимация функций
Рассмотрим простой пример аппроксимации функции y = 2cos x + 8 на отрезке [0, 8]. В листинге 1 приведен код для решения этой задачи с исполь- зованием модели neuralnet().
Сначала формируется фрейм данных learn для обучения сети (строка
6). Затем загружается библиотека neuralnet и формируется сеть netcos.
В функции neuralnet() мы определяем минимальное число парамет- ров: задаем формулу y x, определяем число нейронов в скрытом слое hid-
den = 4 и указываем имя фрейма learn с набором данных для обучения.
Остальные параметры заданы по умолчанию (строка 10). Запуск функции на исполнение осуществляет обучение сети netcos.
Листинг 1. Аппроксимация функции y = 2cos x + 8

7
Для проверки работы обученной сети создаем фрейм test (строка 16) с тестовыми данными. Функция predict() вычисляет реакцию обученной сети
netcos в переменной yp. На рис. 1 приведен график моделируемой функции
y, представленной 50 зелеными точками, и функции yp, сформированной се- тью и представленной на графике 5000 черных точек. График демонстри- рует полное совпадение функций.
Рис. 1. Моделируемая и результирующая функция
С помощью функции plot(netcos) получаем архитектуру полученной сети (рис. 2). Полную информацию о построенной сети можно получить с помощью функции print(netcos).
Рис. 2. Архитектура сети netcos

8
Интересно посмотреть аналитическое представление функции реали- зованной сетью netcos для исходной моделируемой функции. Для этого представим функции, реализуемые нейронами скрытого слоя (строка 24 –
27, листинг 1) и построим их графики (рис.3).
Рис. 3. Функции, реализуемые нейронами скрытого слоя
Функцию y, реализованную сетью netcos, получаем из этих функций следующим образом (округляем значения весов до сотых долей):
???? =
−0.17 1 + ????
!"#.%&'!"(.)&
+
5.82 1 + ????
!*.(('+,.",
+
5.43 1 + ????
*.-.'!**.(-
+
5.07 1 + ????
*.,#'!#.%%
− 0.04
Постройте график y (строка 39, листинг 1) и убедитесь в том, что на отрезке [0, 8] эта функция практически тождественна исходной функции y
= 2cos x + 8.
Обратите внимание на использование в листинге функций set.seed(), которые задают начальную фазу генератора случайных чисел. Их необхо- димо использовать для повторной воспроизводимости полученных резуль- татов.
Из многочисленного числа параметров для решения задач приведен- ного ниже задания достаточно будет правильно сформировать обучающие и проверочные данные, подобрать структуру сети и число повторений
(эпох) обучения.
Данные для обучения и тестирования должны быть сформированы в виде фреймов.
Для правильного подбора структуры необходимо подобрать число скрытых слоев и число нейронов каждого скрытого слоя. В ряде заданий будет достаточно одного скрытого слоя, как в примере листинга 1. При необходимости использования двух слоев параметр hidden нужно опреде- лять как двухкомпонентный вектор, например, hidden = c(6,2) определяет два скрытых слоя с 6 нейронами в первом и 2 нейронами во втором слое.

9
Число эпох обучения задается параметром rep, который по умолча- нию имеет значение 1. Обычно, когда сеть не может достигнуть заданной точности за одну эпоху, выдается предупреждение «Algorithm did not
converge in 1 of 1 repetition(s) within the stepmax».
Задание'>Лабораторная работа № 1
Работа состоит из двух заданий, необходимо выполнить оба задания.
Задание 1. Смоделировать заданную функцию на отрезке [0, 8] с ис- пользованием библиотеки neuralnet. Отчет должен содержать подготовку данных для обучения сети. Обоснование выбранной архитектуры. Струк- турную схему обученной сети с указанием весов. Графики моделируемой и смоделированной функций. Варианты заданий приведены в табл.1 (номер варианта определяется последней цифрой номера зачетки).
Таблица 1
Варианты задания
Вариант
Моделируемая функция
0
y = cos x / (sin 2x + 2)
1
y = sin x(arctg 0.5x) + cos x
2
y = 0.5 sin x + cos 2x + √????
3
y = cos x + x – sin 2x
4
y = 4 arctg x + sin x
5
y = sin x / (cos 2x + 2)
6
y = sin x + x – cos 2x
7
y = 0.4 cos x + sin 3x + √????
8
y = 0.5 cos x + 1.5 arctg 0.2x + √????
9
y = sin 0.3x
2
+ √????
Задание 2. Подобрать структуру hidden и порог функции ошибки
threshold для точной аппроксимации заданных последовательностей им- пульсов. Отчет по работе должен содержать структурную схему обученной сети без указания весов. Графики аппроксимируемой и полученной после- довательности для нескольких приближений параметров hidden и threshold.
Варианты заданий приведены в табл.2.
Таблица 2
Варианты задания
Вариант
Последовательность импульсов
Четная цифра
x = seq(from = -9.5, to = 10, by = 0.5)
y = rep(c(1,1,1,1,1,0,0,0,0,0), 4)
Нечетная цифра
x = seq(from = 0, to = 3.15, by = 0.05)
y = rep(c(1,1,1,1,0,0,0,0), 8)

10
Графики должны быть в виде наложения полученной последователь- ности на аппроксимируемую. Пример построения графиков приведен на рис. 4. Для получения нескольких графиков в одном окне используйте ко- манду типа par(mfrow = c(3, 2)), которая указывает, что окно делится на 3 части по горизонтали и на две по вертикали, где будет размещено 6 графи- ков.
Рис. 4. Пример построения графиков
Для изображения нескольких кривых на одном графике используется две функции plot() и lines(). Функция plot() для первого графика, а функции
lines() для последующих. Например, на рис. 4 для построения желтых кри- вых использован plot(x, y, type = ‘l’, col = “yellow”, lwd = 9), а для наложения черных lines(x, y1).
Прогнозирование временных рядов
В большинстве случаев основой для прогнозирования служат ретро- спективные данные в виде временных рядов. В Data Mining существует спе- циальное понятие временного ряда (Time-Series). Анализ временных рядов от анализа случайных выборок отличается предположением о равных про- межутках времени между наблюдениями и наличием хронологического по- рядка. Привязка наблюдений ко времени играет здесь ключевую роль, тогда как при анализе случайной выборки она не имеет никакого значения.
Рис. 5. Временной ряд а10

11
Возьмем в качестве примера временного ряда данные a10 из библио- теки fpp2 [8]. Файл a10 включает данные о количестве выписанных ежеме- сячных рецептов на фармацевтические продукты, подпадающие под код
A10, согласно данным Австралийской комиссии по страхованию здоровья.
Данные представлены за период с июля 1991 по июнь 2008 год. Характер изменения значений этого временного ряда представлен на рис. 5.
Задача состоит в том, чтобы путем анализа временного ряда опреде- лить тенденции динамики его изменения на основе ретроспективных значе- ний. Обучающая выборка строится на основе разбиения данных на равные периоды, для каждого из которых правильным значением на выходе уста- навливается первое следующее за ним значение. На практике строится мат- рица наблюдений с числом столбцов, равным длине периода наблюдения плюс единица.
На рис. 6 представлено подобное разбиение для временного ряда а10.
Периодом наблюдения является 12 месяцев, поэтому входной вектор X обу- чающей выборки имеет размерность 12, а выходной вектор Y является од- норазмерным. На рис. 6 показано построение первых пяти обучающих набо- ров.
Первый набор представляет из себя 13 первых элементов ряда а10, где
12 элементов образуют входной вектор, а 13-ый элемент выходной вектор.
Второй набор образован из тринадцати элементов ряда а10, начиная со вто- рого элемента и также разбит на 12+1 и так далее. Например, пятый набор сформирован из 13 элементов ряда а10, начиная с пятого элемента и разбит на 12+1.
Рис. 6. Заполнение матрицы наблюдений
Решение задачи прогнозирования представлено в листинге 2. Рассмот- рим его особенности.
Сначала загружаются необходимые библиотеки fpp2 и nnet, данные
а10 считываются в переменную scripts и подсчитывается их число n.
Далее готовится матрица наблюдений LearnSeq с числом столбцов 13 и строк n – 12. Матрица заполняется данными в соответствии с рассмотрен- ным выше способом (строка 12, листинг 2).
В качестве модели персептрона будем использовать функцию nnet().
Следует отметить, что эта функция допускает наличие только одного скры- того слоя, поэтому параметр size может задавать число нейронов только в одном слое. Перед заданием параметров и запуском на обучение сети не

12 забываем зафиксировать начальную фазу генератора случайных чисел
set.seed(55).
Выбираем число нейронов size = 60, разрешаем в качестве функции активации выходного нейрона линейную функцию linout = TRUE. Для пер- воначальных случайных весов выбираем значение rang = 0.1 и задаем мак- симальное число итераций maxit = 300. Интересно, как правильно осуществ- лять выбор параметров нейронной сети, значения которых, заданные по умолчанию, явно не подойдут. Прежде всего следует понимать какие пара- метры могут повлиять на работу сети для конкретной задачи. В данном слу- чае решается задача прогнозирования временного ряда, поэтому параметр
decay = 0 можно оставить без внимания, так как шумы отсутствуют. Глав- ными в этом случае являются size, rang и maxit. Два первых проще всего находить подбором, а число итераций чем больше, тем лучше. При обуче- нии сети, когда по умолчанию включен параметр trace = TRUE, можно уви- деть реальное число необходимых эпох.
  1   2   3   4


Листинг 2. Прогнозирование временного ряда
Попробуйте изменять значения параметров сети Nnet, заданные в ли- стинге 2, изучая их влияние на качество прогнозирования. Будет несложно заметить, как меняется качество прогноза непосредственно на результиру- ющем графике (рис. 7).

13
Здесь результирующий график построен с использованием функции
ggplot(), которая предоставляет гораздо больше возможностей по сравне- нию с функцией plot(). Для качественной визуализации результатов любых исследований знание возможностей, которые предоставляют эти функции, и приобретение навыков их применения чрезвычайно полезно. Достаточно просто и кратко необходимые сведения об этих функция изложены в 5 и 6 разделах веб-ресурса [5].
На графике рис. 5 прогноз, сделанный сетью представлен тонкой жел- той кривой поверх синего графика временного ряда а10. Можно заметить, что его начало сдвинуто на 12 месяцев.
Рис. 7. График числа рецептов а10 (синий) и предсказанный сетью (желтый)
Можно воспользоваться функцией plotnet() из библиотеки
NeuralNetTools и отобразить архитектуру обученной сети Nnet (рис. 8). Си- наптические связи с положительными весами выделены на рис. 8 красным цветом, а с отрицательными – синим.
Рис. 7. Архитектура сети Nnet

14
Лабораторная работа № 2
Составить прогноз для заданного временного ряда с использованием библиотеки nnet. Отчет должен содержать подготовку данных для обучения сети. Обоснование выбранной архитектуры. Структурную схему обученной сети без указания весов. Варианты заданий приведены в табл. 3, где указаны названия временных рядов, которые доступны из библиотеки fpp2 [8].
Таблица 3
Варианты задания
Вариант
Временной ряд
0
auscafe
1
austourists
2
calls
3
debitcards
4
departures (resshort)
5
elecequip
6
qauselec
7
qcement
8
qgas
9
departures (visshort)
Графики прогнозируемого и спрогнозированного временного ряда по- строить с использованием функции ggplot().
Классификация объектов
Задача классификации очень часто встречается на практике.
Если рас- познаются только два класса, то в выходном слое персептрона находится только один нейрон, который обладает двумя реакциями. Если классов больше двух, то для каждой группы устанавливается свой нейрон.
Рассмотрим основные приемы часто используемые при анализе дан- ных для множественной классификации. Проще всего их продемонстри- ровать на классическом примере классификации сортов ирисов.
Набор iris
[4], который включает 150 измерений параметров длины и ширины чашели- стика (sepal) и лепестка (petal) трех сортов ирисов Фишера: щетинистого
(Setosa), виргинского (Virginica) и разноцветного (Versicolor), по 50 измере- ний для каждого сорта.
Функция summary(), запущенная в консоли RStudio, позволяет ознако- миться с основными параметрами этого набора данных iris:

15
Отсюда видно, что имеется четыре входных параметра (Sepal.Length,
Sepal.Width, Petal.Length, Petal.Width) и три категории сорта (species) ири- сов. Исходя из этого, можно предложить архитектуру персептрона, изобра- женную на рис. 8, где в скрытом слое условно изображено 6 нейронов.
Рис. 8. Архитектураперсептрона для классификации данных iris
При подготовке наборов данных (data set) весь набор делят на две ча- сти – обучающий или тренировочный набор (train set) и проверочный или тестовый набор (test set). Часто соотношение составляет 70-75% и 30-25%.
Несмотря на то, что набор данных iris состоит всего из 150 векторов, сде- лаем такое разбиение. Важно здесь то, что нужно разбить весь набор на две части так, чтобы в любой из них представители из каждой категории или класса были в равных долях. В листинге 3, решающем задачу классифика- ции данных на основе модели nnet, это разбиение выполняется в строке 14, где в samp формируется по 35 случайных номеров векторов из каждой кате- гории для обучающего набора.
Обратите внимание на интересный прием, который используется для формирования тестового набора. Если в обучающий набор
train.set включа- ются все векторы с номерами из samp (строка 17), то в тестовый набор
test.set – все остальные векторы и это записывается следующим образом
data.iris[-samp,] (строка 18).
В листинге 3 использовано всего 2 нейрона в скрытом слое size = 2 и, как мы увидим их вполне достаточно для решения этой простой задачи.
Кроме наборов входных train.set и выходных targets[samp,] обучающих век- торов и значения size, которые всегда необходимо формировать, задан только один параметр maxit, определенный по умолчанию. Его значение по умолчанию равно maxit = 100, а мы задали значение maxit = 500.

16
Листинг 3. Классификация набора iris
Поскольку, по умолчанию параметр trace = TRUE, визуальное отсле- живание процесса обучения сети включено и мы увидим следующее:
> net.iris <- nnet(train.set,targets[samp,], size = 2, maxit = 500)
# weights: 19 initial value 78.686545 iter 10 value 43.022535 iter 20 value 25.951476 iter 30 value 24.543711 iter 40 value 24.161124
iter 50 value 23.892634 iter 60 value 22.477187 iter 70 value 22.342019 iter 80 value 22.106268 iter 90 value 21.860257 iter 100 value 21.258000 iter 110 value 20.159820 iter 120 value 19.850850 iter 130 value 19.684387 iter 140 value 19.446336 iter 150 value 19.419291 final value 19.418854 converged

17
Мы видим, что сформированная функцией nnet() сеть net.iris включает
19 обучаемых весов (объясните почему) и ошибка обучения или потери уменьшаются в процессе итераций. В итоге, для сходимости процесса обу- чения в нашем случае потребовалось 150 итераций. Таким образом, следует уяснить, что сеть закончит обучение либо выполнив число итераций, задан- ное параметром maxit,либо достигнув заданной точности (параметрами ab-
stol и reltol).
Для оценки качества классификации удобно использовать провероч- ную матрицу, которая показывает, как сеть справилась с задачей. Для по- строения такой матрицы можно использовать две функции table() и
max.col(), а в качестве параметров то, что требовалось получить на выходе сети и то, что она получила. В нашем случае результат выполнения кода строки 28 будет следующим:
> table(max.col(targets[-samp,]), max.col(net.pred))
1 2 3 1 14 0 1 2 0 15 0 3 0 0 15
Номера строк и столбцов соответствуют трем классам, на которые сеть должна разбить входные векторы. Очевидно, поскольку в тестовом наборе мы оставили по 15 векторов каждого класса, идеальным результатом является диагональная матрица с элементами 15, 15, 15. Полученный ре- зультат говорит о том, что сеть выдала только одно неверное предсказание, отнеся вектор первого класса к третьему. Попробуйте устранить этот недо- чет и поделитесь полученным результатом.
Лабораторная работа № 3
Для выполнения лабораторной работы воспользуемся данными до- ступными на ресурсе http://archive.ics.uci.edu/ml/datasets/Vertebral+Column.
Загрузите архив vertebral_column_data.zip и выберите из этого архива файл
column_3C.dat.
Файл содержит результаты рентгенологического исследования 310 пациентов. Каждый пациент представлен в наборе данных шестью парамет- рами, определяемыми формой и ориентацией таза и поясничного отдела по- звоночника в следующем порядке: угол падения таза, наклон таза, угол по- ясничного лордоза, наклон крестца, радиус таза и степень спондилолистеза.
Для обозначений классов используется следующее соглашение: DH (грыжа диска), спондилолистез (SL) и нормальный (NO).
Подготовить набор данных используя файл column_3C.dat. Построить и обучить сеть для классификации диагноза пациентов. Отчет должен

18 содержать подготовку данных для обучения сети. Обоснование выбранной архитектуры. Проверочную матрицу для оценки качества классификации.
Построение автокодировщиков
Автокодировщики представляют интересный тип нейронных сетей, задачей которых является максимально возможное сжатие входного вектора и его воссоздание из этого сжатого представления. В связи с этим, характер- ной особенностью автокодировщиков является совпадение количества нейронов на входном и выходном слое.
Сама по себе способность сжимать данные используется редко, однако автокодировщики можно использовать для предобучения, например, когда стоит задача классификации, а разме- ченных пар слишком мало, либо когда просто надо научиться различать по- лезные свойства входного сигнала.
Рассмотрим пример построения, обучения и проверки автокодиров- щика для букв латинского алфавита в стилизации art1_letters.pat из набора данных snnsData библиотеки RSSNS. Для построения используем модель персептрона neuralnet с числом входов и выходов 35 и числом нейронов в скрытом слое hidden = 10. Число входов и выходов сети определяется дли- ной вектора представления букв 7х5 = 35, а число нейронов скрытого слоя определялось в процессе обучения.
Листинг 4. Автокодировщик букв латинского алфавита art1_letters.pat
Подготовка обучающей выборки в данном случае не составляет труда, так как входной и выходной наборы совпадают и взяты

19 непосредственно из библиотеки (строка 4 – 6, листинг 4). Для визуа- лизации алфавита использована функция print.alphabet(), ее содержа- ние раскрыто в листинге 5.
Обратите особое внимание на способ формирования формул для входов и выходов автокодировщика. Поскольку их размерность равна
35, то вручную записывать такие последовательности трудоемко. По- этому удобно воспользоваться функциями конкатенации paste0() и
as.formula() (строка 9 – 11, листинг 4), результатом использования ко- торых получена необходимая формула. Для проверки правильности формирования формулы посмотрим содержимое переменной form:
> form in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + in9 + in10 + in11 + in12 + in13 + in14 + in15 + in16 + in17 + in18 + in19 + in20 + in21 + in22 + in23 + in24 + in25 + in26 + in27 + in28 + in29 + in30 + in31 + in32 + in33 + in34 + in35 in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8 + in9 + in10 + in11 + in12 + in13 + in14 + in15 + in16 + in17 + in18 + in19 + in20 + in21 + in22 + in23 + in24 + in25 + in26 + in27 + in28 + in29 + in30 + in31 + in32 + in33 + in34 + in35
Как видим, сначала сформированы имена выходов, объединен- ные знаком «+», а затем, после знака «», имена входов. Правда, здесь они совпадают.
Следует отметить, что функция neuralnet() позволяет подбирать оптимальные значения для более, чем десятка параметров. Здесь мы задаем только два: число нейронов в скрытом слое hidden = 10 и до- статочно низкий порог функции ошибки threshold = 0.0006.
Обученный автокодировщик тестируем на том же входном наборе, на котором обучали с помощью функции predict().
Листинг 5. Функция визуализации алфавита
Для визуализации результатов обучения удобно использовать описанную выше функцию print.alphabet(). На рис. 9 приведен резуль- тат работы обученной сети в сравнении с обучающей выборкой.

20
Рис. 9. Обучающая выборка и восстановленный алфавит при сжатии 3.5
В скрытом слое было использовано 10 нейронов, поэтому коэффици- ент сжатия входного вектора равен 35/10 = 3.5. Попробуйте менять пара- метры сети (hidden и threshold) с тем, чтобы получить качественное восста- новление для других коэффициентов сжатия.
Лабораторная работа № 4
Построить автокодировщик для заданной обучающей выборки. Отчет должен содержать подготовку данных для обучения сети. Формирование формул для входа и выхода. Визуализацию обучающей выборки и восста- новленного образца. Структурную схему обученной сети без указания ве- сов. Варианты заданий приведены в табл. 4, где указаны названия файлов с обучающей выборкой, которые доступны из библиотеки RSNNS [4].
Таблица 4
Варианты задания
Вариант
Обучающая выборка
Четная цифра
snnsData$letters_auto.pat
Нечетная цифра
snnsData$artmap_test.pat
Оценку максимально возможного сжатия производить визуально. Ви- зуализировать обучающие выборки можно с использованием функции ли- стинга 5, выполняя вызовы print.alphabet(snnsData$letters_auto.pat,14) и
print.alphabet(snnsData$artmap_test.pat,8)

21
2. ОГРАНИЧЕННЫЕ МАШИНЫ БОЛЬЦМАНА
Ограниченные машины Больцмана (r
estricted Boltzmann machine -
RBM)
являются особым видом генеративных стохастических нейронных се- тей, которые обучаются методом градиентного спуска с контрастивной ди- вергенцией [12]. На практике RBM используются для снижения размерности данных, классификации и выделения признаков. Большой практический ин- терес представляют также сети глубокого доверия (deep belief network -
DBN), которые строятся путем специального каскадирования RBM.
Изучение моделей RBM и DBN построим на базе функций библиотеки
Timo Matzen из [13].
Функции RBM() и StackRBM() позволяют изучать соответствующие модели, а функции ReconstructRBM() и PredictRBM() предоставляют воз- можность визуализировать реконструированные векторы и оценить каче- ство классификации.
Листинг 6. Функция подготовки изображений
Часто в качестве обучающего набора используются изображения. Ко- гда подобные наборы формируются самостоятельно, удобно иметь автома- тизированное средство для подобной подготовительной работы. В качестве подобного средства предлагается функция подготовки изображений

22
image_conversion(), представленная в листинге 6. Функция обрабатывает все изображения размещенные в некотором директории, выполняя следующие действия: приводит размеры изображения к заданным (width х height), пре- образует в черно-белое, представляет как вектор и формирует результирую- щую матрицу всех изображений. Возвращаемая матрица имеет размеры – число строк равно числу обработанных изображений, число столбцов равно произведению width х height.
Для использования функции image_conversion() необходимо предва- рительно заполнить выделенный директорий файлами с изображениями.
Данная функция построена на базе возможностей предоставляемых библио- теками EBImage и pbapply. На рис. 10 приведен результат использования этой функции (первый ряд – приведение к размеру 28х28, второй ряд – пе- ревод в черно-белое изображение).
Рис. 10. Преобразование изображений
Рассмотрим варианты использования функций библиотеки RBM для понижения размерности обучающей выборки изображений. В качестве обу- чающей выборки загрузим изображения котят из веб-ресурса
https://ru.wallpaper.mob.org/ и разместим их в рабочем директории в папке
Cats (пример части загруженных изображений на рис. 10). Указанный ре- сурс является свободно распространяемым и может быть использован для загрузки изображений различных категорий.
Библиотека RBM предоставляет как функцию RBM(), моделирующую отдельно взятую ограниченную машину Больцмана, так и функцию
StackRBM(), позволяющую формировать стек из этих машин. В листинге 7 приведен пример использования обеих функций RBM() и StackRBM().
После загрузки необходимых библиотек с помощью описанной выше функции image_conversion() формируется обучающая выборка изображе- ний размером 28х28 пикселей. Для ограниченной машины Больцмана зада- ется скрытый слой из 196 нейронов и устанавливается 400 итераций (эпох) обучения.
Чтобы обеспечить наглядное сравнение результатов обучения отдель- ной ограниченной машины Больцмана и стека из этих машин вводится па- раметр mflow = c(2,10) задающий печать двух строк по 10 изображений.

23
Для стека ограниченных машин Больцмана задается три скрытых слоя с числом нейронов 392, 196 и 98. В качестве дополнительных параметров задается мини-батч размером 10, а также скорость обучения и коэффици- енты lambda и momentum.
Листинг 7. Обучение ограниченных машин Больцмана
Для того, чтобы обеспечить вывод в цикле произвольного числа ре- конструированных изображений оригинальная функция ReconstructRBM(), представленная в листинге 8, была частично изменена и обозначена Re-
sultRBM() (листинг 9).
Листинг 8. Оригинальная функция печати реконструированных изображений

24
Измененные части в оригинальной и измененной версии функции вы- делены желтым цветом.
Листинг 9. Измененная функция печати реконструированных изображений
Результат работы сети mod, моделирующей ограниченную машину
Больцмана и modCat, моделирующей стек ограниченных машин, приведены на рис. 11.
Рис. 11. Результат работы нейронной сети mod и modCat
Функция DBN() обучает сеть глубокого доверия, начиная с предвари- тельно обученного стека неконтролируемых RBM, используя функцию
StackRBM(), а затем добавляется контролируемый выходной слой. Резуль- тирующая сеть DBN настраивается по контролируемому критерию с ис- пользованием обратного распространения. Качество обучения позволяет оценить функция PredictDBN().
Рассмотрим использование сети глубокого доверия для классифика- ции образов на примере функции DBN(). В качестве обучающей и тестовой выборки возьмем классический набор MNIST (листинг 10).
Листинг 10. Классификация MNIST сетью глубокого доверия

25
При вызове функции DBN() использовано много входных параметров, определяющих особенности обучения модели modDBN. Для предваритель- ного тренинга (предобучения со скоростью 0.1) задано 150 эпох для каж- дого уровня RBM. Обучение на основе градиентного спуска определено на
10000 эпохах со скоростью 0.5. Размер батча установлен равным 10. Пара- метр verbose = TRUE разрешает визуализацию процесса обучения – печать значения потерь (cost) на каждой эпохе.
Для оценки результата классификации сетью глубокого доверия ис- пользована функция PredictDBN(), которая показывает достаточно не- плохую точность 0.916:
Следует пояснить, почему при использовании функции PredictDBN() указан параметр layers = 4, хотя сеть modDBN включает три слоя nodes =
c(500, 300, 150). Это сделано с учетом добавления контролируемого выход- ного слоя.
1   2   3   4


Лабораторная работа № 5
Построить ограниченную машину Больцмана для понижения размер- ности обучающей выборки. В качестве последней возьмите 10 произволь- ных изображений. Для их предварительной обработки используйте функ- цию листинга 6, задавая размеры 100 х 100 пикселов. Подберите параметры
RBM для получения удовлетворительного качества. Визуализируйте полу- ченные результаты.
Сформируйте стек ограниченных машин Больцмана с помощью функ- ции StackRBM(). Проведите исследование с тем же набором изображений.
Подберите параметры стека для получения удовлетворительного качества.
Визуализируйте полученные результаты.
Проделайте сравнительный анализ возможностей, предоставляемых для понижения размерности обучающей выборки отдельной RBM и стеком из RBM.

26
3. СЕТИ КОХОНЕНА
Сети Кохонена – это одна из разновидностей нейросетевых алгорит- мов. Алгоритм функционирования самообучающихся карт SOM (Self
Organizing Maps) представляет собой один из вариантов кластеризации мно- гомерных векторов [10].
Для моделирования сетей Кохонена используются функции somgrid() и som() из пакета kohonen. Для обученной сети с помощью функции plot() становится доступным для визуализации следующий комплект карт:
codes - показывается распределение по решетке соотношения долей участия отдельных исходных переменных;
counts - число исходных объектов в каждом узле сети;
mapping - координаты исходных объектов на сформированной карте;
property, quality, dist.neighbours - различными цветами изображается целый набор свойств каждого узла: доли участия отдельных исходных пе- ременных, меры парных или средних расстояний между нейронами и т.д.
Рассмотрим пример, в котором используем три указанные функции. В качестве исходных данных для анализа используем фрейм данных wines, по- ставляемый с библиотекой kohonen. Фрейм wines, включает 177 строк и три- надцать столбцов, где приведены результаты химического анализа вин, вы- ращенных в одном и том же регионе Италии (Пьемонт), но полученных из трех разных сортов винограда: Неббиоло, Барбера (Barbera) и Гриньолино
(Grignolino). Вино из винограда сорта Неббиоло называется Бароло
(Barolo). Данные содержат количества нескольких компонентов, присут- ствующих в каждом вине, а также некоторые спектроскопические перемен- ные.
Для каждой строки фрейма wines переменная vintages содержит метки классов, соответствующие винтажам Barbera, Grignolino и Barolo.
Листинг 10. Моделирование карт Кохонена

27
Как видно из листинга 10 перед кластеризацией исходные данные от- масштабированы функцией scale(). Для карты функцией somgrid() сформи- рована сетка размером 10 х 17 и задана структура «шестиугольник».
С помощью функции cutree() мы осуществили разбиение всех вин на три кластера и с помощью функции plot() построили карту Кохонена (рис.
12). Дополнительная прорисовка кластеров выполнена с помощью функции
add.cluster.boundaries().
Рис. 12. Карта Кохонена для трех кластеров
Карта дополнена информацией о всех компонентах анализируемых векторов, с указанием названия компоненты и цвета отведенного для ее представления. Это позволяет визуально оценить качество кластеризации и принять решение об изменении числа кластеров для оптимизации разбие- ния.
Лабораторная работа № 6
Построить карты Кохонена для тестовых наборов из ресурса Wine
Quality
(http://archive.ics.uci.edu/ml/machine-learning-databases/wine-
quality/) репозитария [6]. Варианты заданий приведены в табл. 5.
Таблица 5
Варианты задания
Вариант
Обучающая выборка
Четная цифра
winequality-red.csv
Нечетная цифра
winequality-white.csv
Отчет должен содержать описание тестового набора, подготовку обу- чающих данных, выбор и обоснование количества кластеров. Представлен- ный в отчете код должен иметь подробный комментарий.

28
4. СВЕРТОЧНЫЕ СЕТИ
Сверточные нейронные сети (CNNConvolutional Neural Networks) используют две основные операции – свертки и пулинга. В архитектуре сети слои, которые выполняют их, следуют друг за другом, постепенно извлекая и выделяя характерные признаки анализируемых данных. Когда признаки достаточно выделены, требуемый результат формируется с помощью пол- носвязного слоя, в котором осуществляется анализ их взаимовлияния на итог исследования.
В отличие от классических нейронных сетей, для которых разрабо- тано большое число моделей, сверточные сети требуют «индивидуального» подхода к архитектуре. Поэтому для формирования CNN используют биб- лиотеки, предоставляющие возможность формирования и объединения между собой отдельных слоев - свертки, пулинга и полносвязного слоя.
Несмотря на то, что CNN специализирована для задач компьютерного зрения и распознавания изображений, она также оказалась полезной во мно- гих других приложениях и часто используется на практике. Достаточно ин- тересное погружение в сверточные сети можно найти на ресурсе [11].
Здесь мы остановимся на двух аспектах, связанных с использованием моделей CNN – это переобучение и визуализация промежуточных актива-
ций.
Переобучение - распространенная проблема когда имеется только не- сколько образцов данных, на которых можно учиться. Это мешает модели хорошо обучиться. Один из методов, который помогает справиться с этой проблемой – приращение (augmentation) данных. Этот метод уменьшает пе- реобучение за счет генерации большего количества обучающих данных из существующих выборок с помощью нескольких случайных преобразова- ний, создающих правдоподобные изображения. Для модификации применя- ются такие операции, как сдвиг, переворачивание, масштабирование и тому подобные. Библиотека keras предоставляет удобные функции для реализа- ции метода аугментации в реальном времени.
Пример использования данных функций представлен в листинге 11. В качестве образцов для аугментации выбран директорий cats-dogs, включа- ющий jpeg изображения кошек и собак. Функция image_data _generator() позволяет определить необходимые диапазоны изменений параметров ис- ходного изображения. В листинге 11 для этой функции использованы да- леко не все доступные возможности настройки, подробно с назначением каждого параметра можно ознакомиться, например в [17].
Изображения из директория приводятся к одинаковому размеру
150х150 пикселов и преобразуются в тензор размерности 1,150,150,3. В строке 14 листинга 11, для простоты задается только одно 9-ое изображение.
Функция flow_images_from_data() запускает работу генератора ауг- ментации augmentation_generator, который затем используется в цикле для

29 вывода 12 последовательных преобразований исходного изображения
fnames[[9]].
Листинг 11. Приращение обучающего набора путем аугментации
Результат работы скрипта листинга 11 представлен на рис. 13. Отсюда видно, что трансформации параметров изображения осуществляются по случайному закону.
Рис. 13. Результат аугментации

30
Получаемые изображения существенно дополняют палитру обучаю- щих данных, помогая справляться с проблемой переобучения нейронной сети.
Визуализация промежуточных активаций помогает понять как пре- образуются входные данные по мере прохождения по слоям нейронной сети
(вывод результата функций активации слоя называют его активацией).
Карты признаков изучаемые сверточными нейронными сетями, легко под- даются визуализации благодаря тому, что представляют визуальные объ- екты. Визуализация активаций заключается в отображении карт признаков, которые выводятся разными сверточными и объединяющими слоями сети в ответ на определенные входные данные.
Рассмотрим особенности использования функций, предоставляемых библиотекой keras для визуализации активаций. В качестве объекта иссле- дования можно загрузить любую сохраненную модель CNN. Это выполня- ется с помощью функции load_model_hdf5(). Загрузим обученную модель из
[19] и создадим экземпляр модели из входного тензора и списка выходных тензоров (листинг 12 ).
Листинг 12. Загрузка модели и создание экземпляра
Характеристика слоев используемой нейронной сети приведены в табл. 6. По мере продвижения от входа к выходу размеры карт признаков постепенно уменьшаются, а их число увеличивается.
Таблица 6
Характеристика слоев нейронной сети cats_and_dogs_small_1
Созданный с помощью функции keras_model() экземпляр модели acti-
vation_model позволяет сформировать активацию для любой карты призна- ков в каждом из восьми слоев. Для ее визуализации удобно использовать функцию plot_channel() представленную в листинге 13.
Номер и тип слоя
Размер карты признаков Число карт
1 Свертка
148 х 148 32 2 Пулинг
74 х 74 32 3 Свертка
72 х 72 64 4 Пулинг
36 х 36 64 5 Свертка
34 х 34 128 6 Пулинг
17 х 17 128 7 Свертка
15 х 15 128 8 Пулинг
7 х 7 128

31
Для анализа получаемых послойных активаций выберем произволь- ное входное изображение img из тестовой выборки, преобразуем его в тен- зор img_tensor размерности 1, 150, 150, 3 и нормализуем img_tensor =
img_tensor / 255. Используя полученный img_tensor в качестве входного па- раметра функции predict() будем в цикле использовать функцию plot_chan-
nel().
Листинг 13. Функция визуализации карты признаков
На рис. 14 приведены примеры визуализации одной, случайно вы- бранной карты признаков на каждом слое.
Рис. 14. Примеры визуализации карты признаков по слоям
Как видно из рисунка, по мере продвижения по слоям активации изоб- ражения становятся все более абстрактными, а их визуальная интерпрета- ция становится сложней. По сути они начинают кодировать высокоуровне- вые представления и несут все меньше информации об исходном изображе- нии и все больше — о классе изображения. Последняя карта напоминает
QR-код, в котором закодирована информация о классе принадлежности изображения поданного на вход.
Лабораторная работа № 7
Изучите особенности использования функции image_data_generator().
Продемонстрируйте возможности управления всеми ее параметрами для формирования обучающих примеров. Какие параметры являются наиболее эффективными?
Выберите несколько произвольных изображений относящихся к двум классам, сформируйте достаточный обучающий набор на базе функции
flow_images_from_data() и постройте простую сверточную нейронную сеть решающую задачу классификации.
Дополнительно: используя информацию из [19], визуализируйте все карты признаков построенной сети для произвольного входного изображе- ния.

32
5. ВАРИАЦИОННЫЕ АВТОКОДИРОВЩИКИ
Классический автокодировщик учится представлять входные данные в скрытом пространстве уменьшенных размеров. Он изучает произвольную функцию для выражения входных данных в сжатом скрытом представле- нии. Вариационный автокодировщик (VAE) вместо изучения произвольной функции изучает параметры распределения вероятностей сжатого представ- ления. Если мы сможем выбирать точки из этого распределения, мы сможем сгенерировать новые данные. В этом смысле VAE относится к генеративным моделям нейросетей.
Вариационный автокодировщик состоит из двух сетей: сети кодера и сети декодера (рис. 15). Кодер — это нейронная сеть, которая принимает входные данные x и выдает скрытое представление z. Целью сети кодера является для каждого x предсказать два значения — среднее значение
µ
и отклонение (дисперсию) s
нормального распределения, из которого сэм- плируются случайные образцы z. По сути, кодер в VAE изучает распределе- ние вероятностей P
q
(z|x), где q
— параметр сети кодера.
Рис. 15. Структура вариационного автокодировщика
Целью сети декодера является восстановление входных данных x из случайного образца z (z принадлежит распределению с параметрами μ и σ).
Его задача — предсказать распределение вероятностей Q
ф
(x|z), где ф — па- раметр сети декодера.
В типичном VAE функция потерь состоит из двух частей: потери вос- становления и потери регуляризатора. Для одного обучающего примера функция потерь задается следующим уравнением:
????(????, ????) = ????
!#
!
(
????
|
????
)
+log ????
'
(????|????1) − ????????[????
(
(????|????)|????(0, ????)]

33
Первый член уравнения — потери реконструкции, а второй — это рас- хождение Кульбака-Лейблера (KL) между изученным распределением веро- ятностей, и истинным распределением скрытой переменной,. В VAE пред- полагается, что скрытые переменные происходят из стандартного нормаль- ного распределения, то есть P (z) есть N (0, 1).
Рассмотрим пример реализации вариационного автокодировщика для генерации изображений [18]. В качестве изображений используется набор данных Fashion MNIST, который поставляется вместе с библиотекой keras.
В листинге 14 загружаются необходимые библиотеки и набор данных раз- бивается на две части: для обучения x_train и тестирования x_test (строки 1
- 8).
Листинг 14. Формирование
вариационного автокодировщика
В листинге 14 представлены последовательные шаги формирования вариационного автокодировщика.

34
На шаге 1 задаются параметры обучения – размер батча, размерности входа, параметров μ и σ и количество эпох.
На шаге 2 определяется входной и скрытый слой сети кодера. Далее, на шаге 3 формируется скрытый слой для представления параметров μ и σ.
На шаге 4 определяется функция сэмплирования, которая позволяет генерировать новую точку из скрытого пространства, а на шаге 5 формиру- ется слой, в котором из параметров μ и σ скрытого распределения генериру- ется случайный образец z.
На шаге 6 мы создаем два скрытых слоя для части декодера VAE и объединяем их, чтобы создать выходной слой. Наконец, на шаге 7 мы фор- мируем вариационный автокодировщик. Используя функцию summary() можно изучить подробную структуру модели vae.
Листинг 15. Обучение и тестирование

35
В листинге 15 описаны шаги, необходимые для обучения и тестирова- ния сформированного VAE. На шаге 8 и 9 создаются отдельные модели ко- дера и декодера, которые используются при реконструкции изображения из точки скрытого пространства случайного распределения. На шаге 10 опре- деляется функция потерь vae_loss(), учитывающая как потери восстановле- ния, так и потери регуляризатора.
На шаге 11, после компиляции, определяющей стандартный оптими- затор rmsprop и свою функцию потерь vae_loss(), проводится обучение VAE.
График изменения потерь при обучении loss и тестировании val_loss от 2-ой до 10-ой эпохи приведен на рис. 16.
Рис. 16. Уменьшение потерь на 10 эпохах
Проверка работоспособности VAE выполняется на шаге 11. Для пяти случайных точек скрытого пространства из random_distribution декодер в цикле формирует предсказания, то есть выходные векторы размерности 784 в переменной one_pred. Эти векторы преобразуются в матрицы размерности
28 х 28, которые сохраняются в переменной predicted.
Рис. 17. Изображения сгенерированные VAE
С помощью функции grid.raster() сгенерированные VAE изображения визуализируются (рис. 17).
Лабораторная работа № 8
Изучить особенности работы вариационного автокодировщика. По- строить VAE для генерации рукописных цифр, используя набор MNIST. По- добрать параметры обучения для получения качественной реконструкции.

36
6. РЕКУРРЕНТНЫЕ СЕТИ НА БАЗЕ LSTM
Рекуррентные сети часто используют для решения креативных задач.
Рассмотрим пример использования модуля LSTM для реализации рекур- рентной сети, которая будет генерировать текст из заданного начального набора, состоящего из трех слов. Исходный текст или целый набор текстов при работе с языковыми моделями принято называть корпусом.
Чтобы построить языковую модель, нужно «очистить» текст, исполь- зуемый для обучения, и разбить его на токены. Для этих целей удобно ис- пользовать токенизатор keras, который разбивает корпус на список токенов, удаляет все знаки препинания, преобразует слова в нижний регистр и строит внутренний словарь на основе введенного текста. Словарь генерируемый токенизатором, представляет собой индексированный список, в котором слова индексируются по их общей частоте в наборе данных.
Возьмем в качестве исходного текста стихотворение К. Чуковского
«Муха Цокотуха» и посмотрим насколько хорошо сеть может обучаться стихосложению. Подготовка исходных данных выполняется в листинге 16.
Листинг 16. Подготовка обучающих данных

37
Здесь исходный текст преобразовывается в последовательность токе- нов. Обратите внимание, что аргумент num_words функции text_tokenizer() определяет максимальное количество сохраняемых слов в зависимости от их частоты. Это означает, что в закодированной последовательности сохра- няются только первые n часто встречающихся слов, в нашем случае 350.
Далее обучающая выборка формируется в виде матриц X и Y. Каждая строка входной матрицы X содержит три последовательные слова из текста, представленные соответствующими им токенами, а в матрице Y записыва- ется токен слова, следующего за этими тремя. Длина начального набора
inp_len выбрана нами равной трем, но может быть любой.
Скрипт формирования и обучения LSTM модели представлен в ли- стинге 17. Структура модели строится с помощью четырех функций – встра- ивания layer_embedding(), определения числа модулей layer_lstm(), форми- рования полносвязного слоя layer_dense() и задания функции активации
layer_activation(). Сначала мы инициализировали последовательную мо- дель, а затем добавили к ней слой внедрения. Далее мы добавили слой LSTM с 50 модулями. Поскольку предсказание слова – это проблема классифика- ции, при которой следующее слово выбирается из словаря, мы добавили полносвязный слой с числом нейронов, равным количеству слов в словаре и с функцией активации softmax.
1   2   3   4


Листинг 17. Формирование и обучение LSTM модели
Для компиляции модели заданы параметры определяющие функцию потерь, алгоритм оптимизации со скоростью обучения lr = 0.002 и функцию, используемую для оценки производительности обученной модели.

38
Для функции обучения fit() задан размер пакета batch_size = 10 и число эпох epochs = 100.
Проверить качество работы обученной модели можно с использова- нием специальной функции листинга 18. В качестве параметров выступает обученная модель, словарь токенов, длина начального набора, начальный набор и длина текста, который нужно сгенерировать.
Листинг 18. Функция генерации текста с использованием обученной модели
В листинге 19 представлена апробация обученной сети model с помо- щью функции gen_text(). Наша модель предсказывает следующее слово из исходных трех предыдущих слов. В первом примере начальный набор – это
«приходила к мухе», а предсказанное слово – «бабушка», таким образом со- здается последовательность из трех слов. В следующей берется последние три слова предложения «к мухе бабушка» и предсказывается следующее слово «пчела». Функция продолжает генерировать текст, пока не будет по- лучено n_next_words = 16 слов.
Листинг 19. Апробация обученной модели
Как видно из листинга 19, сеть отлично справилась с первым зада- нием. Для второго примера, с начальным набором «эй сороконожки бегите», в конце сгенерированной фразы получен лишний «бом». Объясните почему и как это исправить?

39
Лабораторная работа № 9
Выполните любой вариант работы.
Вариант 1
Сформируйте произвольный корпус и постройте рекуррентную сеть на базе модуля LSTM. Добейтесь максимальной точности предсказаний, пу- тем подбора оптимальных параметров архитектуры и обучения.
Отчет должен содержать структуру сети, сформированную функцией
summary(), графики изменения потерь (loss) и точности (acc). Примеры апробации работы сети, с использованием функции gen_text().
Вариант 2
Сформируйте произвольный корпус и постройте рекуррентную сеть на базе модуля GRU. Добейтесь максимальной точности предсказаний, пу- тем подбора оптимальных параметров архитектуры и обучения.
Отчет должен содержать структуру сети, сформированную функцией
summary(), графики изменения потерь (loss) и точности (acc). Примеры апробации работы сети, с использованием функции gen_text().


40
ЗАДАНИЯ ДЛЯ ПРАКТИКИ
Особенностью всех заданий для практики является самостоятельный выбор способа решения поставленной задачи. Совсем не обязательно полу- чить наилучшее решение, тем более, что никогда в этом нельзя быть уверен- ным при решении подобных задач.
Задание № 1: Моделирование логической функции
Научиться формировать обучающую выборку и тестовый набор дан- ных. Освоить способы создания, модификации и обучения простейшей нейронной сети. Создать нейронную сеть, моделирующую логическую функцию по предложенным вариантам (табл. 7).
Таблица 7
Варианты задания
Номер ва- рианта
Логическая функция
(цифра вначале означает число входов)
0
"4И"
1
"4И-НЕ"
2
"4ИЛИ"
3
"4ИЛИ-НЕ"
4 исключающее "4ИЛИ"
5 исключающее "4ИЛИ-НЕ"
6
"4И" с инверсией по первому входу
7
"4И-НЕ" с инверсией по первому входу
8
"4ИЛИ" с инверсией по первому входу
9
"4ИЛИ-НЕ" с инверсией по первому входу
Отчет должен содержать скрипт подготовки обучающих данных и обучения, топологию сети, входные данные, эталонные выходные данные, полученные выходные данные, выводы по результатам работы.
Задание № 2: Классификация входных данных
Входными данными является восьмиразрядный двоичный вектор.
Первые четыре разряда представляют исходный код, а последние четыре – исходный код, циклически сдвинутый на один разряд вправо или влево.
Необходимо построить нейронную сеть для определения направления дво- ичного сдвига. Для решения поставленной задачи, следует построить и обу- чить нейронную сеть, которая должна будет определять направление цик- лического двоичного сдвига. Сущность операции циклического двоичного сдвига заключается в том, что число представляется в двоичном коде, а

41 затем с полученной последовательностью производится операция цикличе- ского сдвига вправо или влево (табл. 8).
Таблица 8
Представление чисел при сдвигах
Число
Двоичный код
Сдвиг влево
Сдвиг вправо
1 0001 0010 1000 2
0010 0100 0001 3
0011 0110 1001 4
0100 1000 0010 5
0101 1010 1010 6
0110 1100 0011 7
0111 1110 1011 8
1000 0001 0100 9
1001 0011 1100 10 1010 0101 0101 11 1011 0111 1101 12 1100 1001 0110 13 1101 1011 1110 14 1110 1101 0111 15 1111 1111 1111
Очевидно, что для определения направления сдвига на входы нейрон- ной сети необходимо представить исходную четырехпозиционную двоич- ную последовательность и четырехпозиционную двоичную последователь- ность, которая получилась в результате сдвига.
Отчет должен содержать скрипт подготовки обучающих данных и обучения, топологию сети, входные данные, эталонные выходные данные, полученные выходные данные, выводы по результатам работы.
Задание № 3: Построение карты Кохонена
Изучить приемы работы с самообучающимися нейронными сетями и особенности их использования на примере самоорганизующейся сети Кохо- нена.Выполните оба варианта задания.
Вариант 1
Постройте сети Кохонена для кластеризации данных yeast (дрожжи), которые после загрузки библиотеки kohonen можно просто загрузить коман- дой data(yeast). Воспользуйтесь функцией supersom(). Объясните получен- ные результаты.
Вариант 2
На ресурсе http://www.instantr.com/wp-content/uploads/2013/01/eu-
rope.csv предоставлены данные о странах Европы. Исследуйте эти данные с помощью сети Кохонена. Объясните полученные результаты.