практикум. Лабораторный практикум. Практикум санктпетербург 2021 2 Задание по практикуму
Скачать 2.07 Mb.
|
Листинг 10. Классификация MNIST сетью глубокого доверия 26 При вызове функции 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). Это сделано с учетом добавления контролируемого вы- ходного слоя. Лабораторная работа № 5 Построить ограниченную машину Больцмана для понижения раз- мерности обучающей выборки. В качестве последней возьмите 10 произ- вольных изображений. Для их предварительной обработки используйте функцию листинга 6, задавая размеры 100 х 100 пикселов. Подберите па- раметры RBM для получения удовлетворительного качества. Визуализи- руйте полученные результаты. Сформируйте стек ограниченных машин Больцмана с помощью функции StackRBM(). Проведите исследование с тем же набором изобра- жений. Подберите параметры стека для получения удовлетворительного качества. Визуализируйте полученные результаты. Проделайте сравнительный анализ возможностей, предоставляемых для понижения размерности обучающей выборки отдельной RBM и стеком из RBM. 27 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. Моделирование карт Кохонена 28 Как видно из листинга 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 Отчет должен содержать описание тестового набора, подготовку обучающих данных, выбор и обоснование количества кластеров. Пред- ставленный в отчете код должен иметь подробный комментарий. 29 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-ое изображе- ние. 30 Функция flow_images_from_data() запускает работу генератора ауг- ментации augmentation_generator, который затем используется в цикле для вывода 12 последовательных преобразований исходного изображения fnames[[9]]. Листинг 11. Приращение обучающего набора путем аугментации Результат работы скрипта листинга 11 представлен на рис. 13. Отсю- да видно, что трансформации параметров изображения осуществляются по случайному закону. 31 Рис. 13. Результат аугментации Получаемые изображения существенно дополняют палитру обучаю- щих данных, помогая справляться с проблемой переобучения нейронной сети. Визуализация промежуточных активаций помогает понять как пре- образуются входные данные по мере прохождения по слоям нейронной се- ти (вывод результата функций активации слоя называют его активацией). Карты признаков изучаемые сверточными нейронными сетями, легко под- даются визуализации благодаря тому, что представляют визуальные объ- екты. Визуализация активаций заключается в отображении карт признаков, которые выводятся разными сверточными и объединяющими слоями сети в ответ на определенные входные данные. Рассмотрим особенности использования функций, предоставляемых библиотекой keras для визуализации активаций. В качестве объекта иссле- дования можно загрузить любую сохраненную модель CNN. Это выполня- ется с помощью функции load_model_hdf5(). Загрузим обученную модель из [19] и создадим экземпляр модели из входного тензора и списка выход- ных тензоров (листинг 12 ). Листинг 12. Загрузка модели и создание экземпляра Характеристика слоев используемой нейронной сети приведены в табл. 6. По мере продвижения от входа к выходу размеры карт признаков постепенно уменьшаются, а их число увеличивается. Таблица 6 Характеристика слоев нейронной сети cats_and_dogs_small_1 Созданный с помощью функции keras_model() экземпляр модели ac- tivation_model позволяет сформировать активацию для любой карты при- Номер и тип слоя Размер карты признаков Число карт 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 32 знаков в каждом из восьми слоев. Для ее визуализации удобно использо- вать функцию plot_channel() представленную в листинге 13. Для анализа получаемых послойных активаций выберем произволь- ное входное изображение img из тестовой выборки, преобразуем его в тен- зор img_tensor размерности 1, 150, 150, 3 и нормализуем img_tensor = img_tensor / 255. Используя полученный img_tensor в качестве входного параметра функции predict() будем в цикле использовать функцию plot_channel(). Листинг 13. Функция визуализации карты признаков На рис. 14 приведены примеры визуализации одной, случайно вы- бранной карты признаков на каждом слое. Рис. 14. Примеры визуализации карты признаков по слоям Как видно из рисунка, по мере продвижения по слоям активации изображения становятся все более абстрактными, а их визуальная интер- претация становится сложней. По сути они начинают кодировать высоко- уровневые представления и несут все меньше информации об исходном изображении и все больше — о классе изображения. Последняя карта напоминает QR-код, в котором закодирована информация о классе при- надлежности изображения поданного на вход. Лабораторная работа № 7 Изучите особенности использования функции image_data_generator(). Продемонстрируйте возможности управления все- ми ее параметрами для формирования обучающих примеров. Какие пара- метры являются наиболее эффективными? Выберите несколько произвольных изображений относящихся к двум классам, сформируйте достаточный обучающий набор на базе функ- ции flow_images_from_data() и постройте простую сверточную нейронную сеть решающую задачу классификации. 33 Дополнительно: используя информацию из [19], визуализируйте все карты признаков построенной сети для произвольного входного изображе- ния. 34 5. ВАРИАЦИОННЫЕ АВТОКОДИРОВЩИКИ Классический автокодировщик учится представлять входные данные в скрытом пространстве уменьшенных размеров. Он изучает произволь- ную функцию для выражения входных данных в сжатом скрытом пред- ставлении. Вариационный автокодировщик (VAE) вместо изучения произ- вольной функции изучает параметры распределения вероятностей сжатого представления. Если мы сможем выбирать точки из этого распределения, мы сможем сгенерировать новые данные. В этом смысле VAE относится к генеративным моделям нейросетей. Вариационный автокодировщик состоит из двух сетей: сети кодера и сети декодера (рис. 15). Кодер — это нейронная сеть, которая принимает входные данные x и выдает скрытое представление z. Целью сети кодера является для каждого x предсказать два значения — среднее значение и отклонение (дисперсию) нормального распределения, из которого сэм- плируются случайные образцы z. По сути, кодер в VAE изучает распреде- ление вероятностей P (z|x), где — параметр сети кодера. Рис. 15. Структура вариационного автокодировщика Целью сети декодера является восстановление входных данных x из случайного образца z (z принадлежит распределению с параметрами μ и σ). Его задача — предсказать распределение вероятностей Q ф (x|z), где ф — параметр сети декодера. В типичном VAE функция потерь состоит из двух частей: потери восстановления и потери регуляризатора. Для одного обучающего примера функция потерь задается следующим уравнением: 35 ( ) ( | ) [ ( | )) ( | )| ( ) Первый член уравнения — потери реконструкции, а второй — это расхождение Кульбака-Лейблера (KL) между изученным распределением вероятностей, и истинным распределением скрытой переменной,. В VAE предполагается, что скрытые переменные происходят из стандартного нормального распределения, то есть P (z) есть N (0, 1). Рассмотрим пример реализации вариационного автокодировщика для генерации изображений [18]. В качестве изображений используется набор данных Fashion MNIST, который поставляется вместе с библиотекой keras. В листинге 14 загружаются необходимые библиотеки и набор дан- ных разбивается на две части: для обучения x_train и тестирования x_test (строки 1 - 8). Листинг 14. Формирование вариационного автокодировщика 36 В листинге 14 представлены последовательные шаги формирования вариационного автокодировщика. На шаге 1 задаются параметры обучения – размер батча, размерности входа, параметров μ и σ и количество эпох. На шаге 2 определяется входной и скрытый слой сети кодера. Далее, на шаге 3 формируется скрытый слой для представления параметров μ и σ. На шаге 4 определяется функция сэмплирования, которая позволяет генерировать новую точку из скрытого пространства, а на шаге 5 форми- руется слой, в котором из параметров μ и σ скрытого распределения гене- рируется случайный образец z. На шаге 6 мы создаем два скрытых слоя для части декодера VAE и объединяем их, чтобы создать выходной слой. Наконец, на шаге 7 мы формируем вариационный автокодировщик. Используя функцию summary() можно изучить подробную структуру модели vae. Листинг 15. Обучение и тестирование 37 В листинге 15 описаны шаги, необходимые для обучения и тестиро- вания сформированного VAE. На шаге 8 и 9 создаются отдельные модели кодера и декодера, которые используются при реконструкции изображения из точки скрытого пространства случайного распределения. На шаге 10 определяется функция потерь vae_loss(), учитывающая как потери восста- новления, так и потери регуляризатора. На шаге 11, после компиляции, определяющей стандартный оптими- затор rmsprop и свою функцию потерь vae_loss(), проводится обучение VAE. График изменения потерь при обучении loss и тестировании val_loss от 2-ой до 10-ой эпохи приведен на рис. 16. 38 Рис. 16. Уменьшение потерь на 10 эпохах Проверка работоспособности VAE выполняется на шаге 11. Для пяти случайных точек скрытого пространства из random_distribution декодер в цикле формирует предсказания, то есть выходные векторы размерности 784 в переменной one_pred. Эти векторы преобразуются в матрицы раз- мерности 28 х 28, которые сохраняются в переменной predicted. Рис. 17. Изображения сгенерированные VAE С помощью функции grid.raster() сгенерированные VAE изображе- ния визуализируются (рис. 17). Лабораторная работа № 8 Изучить особенности работы вариационного автокодировщика. По- строить VAE для генерации рукописных цифр, используя набор MNIST. Подобрать параметры обучения для получения качественной реконструк- ции. 39 6. РЕКУРРЕНТНЫЕ СЕТИ НА БАЗЕ LSTM Рекуррентные сети часто используют для решения креативных задач. Рассмотрим пример использования модуля LSTM для реализации рекур- рентной сети, которая будет генерировать текст из заданного начального набора, состоящего из трех слов. Исходный текст или целый набор текстов при работе с языковыми моделями принято называть корпусом. Чтобы построить языковую модель, нужно «очистить» текст, ис- пользуемый для обучения, и разбить его на токены. Для этих целей удобно использовать токенизатор keras, который разбивает корпус на список то- кенов, удаляет все знаки препинания, преобразует слова в нижний регистр и строит внутренний словарь на основе введенного текста. Словарь гене- рируемый токенизатором, представляет собой индексированный список, в котором слова индексируются по их общей частоте в наборе данных. Возьмем в качестве исходного текста стихотворение К. Чуковского «Муха Цокотуха» и посмотрим насколько хорошо сеть может обучаться стихосложению. Подготовка исходных данных выполняется в листинге 16. |