IIS_2023_1/istyukov_timofey_lab_7/README.md
2024-01-13 22:21:36 +04:00

93 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Лабораторная работа №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)
---
### Вывод
Итак, рекуррентная нейронная сеть справилась с задачей генерации текста.
Если говорить о качестве, то требуется более глубокое обучение и больше текста.
И тогда нейросеть сможет писать даже в стиле Достоевского. Но по времени это
слишком затратно. Однако в рамках лабораторной работы результат вышел приемлемый.