# Лабораторная работа №7. Рекуррентная нейронная сеть и задача генерации текста ## 12 вариант ___ ### Задание: Выбрать художественный текст на языке по варианту и обучить на нём рекуррентную нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату. Далее разбиться на пары чётный-нечётный вариант, обменяться разработанными сетями и проверить, как архитектура товарища справляется с вашим текстом. В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов. ### Вариант: - Язык текста: **русский** ### Художественный текст: - Отрывок из книги Ф.М. Достоевского — "Белые ночи" (в формате .txt) ___ ### Запуск - Запустить файл lab7.py ### Используемые технологии - Язык программирования **Python** - Среда разработки **PyCharm** - Библиотеки: * numpy * keras * os ### Описание программы Здесь представлена модель глубокого обучения для генерации текста с помощью библиотеки Keras и алгоритма LSTM. Чтобы построить модель генерации художественного текста, требуются некоторые текстовые данные. В качестве набора данных здесь используется отрывок из книги великого русского писателя-реалиста в формате текстового файла. **Шаги написания программы:** 1. **Предварительная обработка данных** 1. Перевод символов в нижний регистр 2. Формирование уникального набора использующихся в тексте символов 3. Преобразование текстовых данных в числовые значения 4. Создание последовательности символов (X - значений, Y - следующий символ) 5. Преобразование данных в массив логических значений 2. **Построение базовой модели** 1. Инициализация модели **Sequential**. это простой стек слоев, с помощью которого нельзя представить произвольную модель. 2. Три слоя **LSTM** (по 200 единиц в каждом): - В первом слое входная форма. - Во втором слое параметр *return_sequences=True* для обработки тех же последовательностей - В третьем слое ничего лишнего 2. Три слоя **Dropout** с вероятностью 20% для проверки переобучения. Dropout предполагает случайный кик нейронов из процесса обучения. Он обеспечивает, чтобы нейронная сеть не стала слишком зависимой от любого одного узла. 3. Один "плотный" слой **Dense** в конце, который даёт вывод символов. Dense обрабатывает каждый элемент предыдущего слоя, выполняя матричное перемножение этих элементов со своими весами. 4. Конфигурация модели для категориальной классификации. 3. **Обучение модели** 1. **epochs=50** (одна эпоха = один проход вперёд и один проход назад всех обучающих примеров) 2. **batch_size=100** (количество обучающих примеров за один проход вперёд/назад. Чем больше размер пакета, тем больше памяти лучше использовать. 4. **Сохранение модели** (во избежание повторного обучения и ради экономии времени) 5. **Генерация текста на основе сохранённой модели** 1. Загрузка модели 2. Выбор случайной стартовой точки в исходном тексте 3. Генерация назначенного количества символов --- ### Пример работы *В ходе прогона программы было зафиксировано несколько результатов генерации 200 символов. Примеры приведены ниже.* ![Graphics](result_1.jpg) ![Graphics](result_2.jpg) ![Graphics](result_3.jpg) ![Graphics](result_4.jpg) --- ### Вывод Итак, рекуррентная нейронная сеть справилась с задачей генерации текста. Если говорить о качестве, то требуется более глубокое обучение и больше текста. И тогда нейросеть сможет писать даже в стиле Достоевского. Но по времени это слишком затратно. Однако в рамках лабораторной работы результат вышел приемлемый.