IIS_2023_1/mashkova_margarita_lab_7/README.md

96 lines
7.2 KiB
Markdown
Raw Normal View History

2023-11-30 09:27:04 +04:00
# Лабораторная работа №6
## ПИбд-42 Машкова Маргарита (Вариант 19)
## Задание
Выбрать англоязычный и русскоязычный художественные тексты и обучить на нем рекуррентную нейронную сеть для решения задачи генерации.
Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.
### Данные:
Художественные тексты в файлах `english_text.txt` и `russian_text.txt`.
## Запуск программы
Для запуска программы необходимо запустить файл main.py
## Используемые технологии
> **Язык программирования:** python
>
> **Библиотеки:**
> - `keras` - библиотека для глубокого обучения. Она предоставляет простой и интуитивно понятный интерфейс для создания
и обучения различных моделей машинного обучения, включая нейронные сети.
> - `numpy` - предоставляет мощные инструменты для работы с многомерными массивами и выполнения математических операций над ними.
## Описание работы программы
Т.к. нейронная сеть принимает на вход числа, необходимо закодировать исходные тексты.
Сделать это можно с помощью Tokenizer. Метод `fit_on_texts()` создает словарь вида (слово - индекс)
на основе частоты использования слов. Чем меньше индекс, тем чаще встречается слово.
Метод `texts_to_sequences()` преобразовывает текст в последовательность чисел.
Таким образом каждое слово принимает целочисленное значение.
![Результат кодирования текста](tokenize.png)
Затем создаются входные и выходные последовательности, инициализируется, настраивается и компилируется модель.
Модель обучается на данных и генерирует текст на основе начальной фразы.
## Тесты
### Варьирование количества слоев и эпох обучения для русскоязычного текста:
1 слой и 50 эпох обучения:
![1 слой 50 эпох](1lstm50ep.png)
Присутствуют осмысленные словосочетания, например, `преобразившейся природе`, `бодрящей свежести`,
`ветерок поднимающийся изредка пощипывает лицо уши` (хоть это должен быть и морозец, но все же)
2 слоя и 50 эпох обучения (1 вариант):
![2 слоя 50 эпох_1вариант](2lstm50ep_v1.png)
Присутствуют осмысленные словосочетания, например, `снежинки кружатся`, `наполняет чувством`,
`в воздухе кружатся`, `невольно наполняет`, `морозец он колюч приятен`
2 слоя и 50 эпох обучения (2 вариант):
![2 слоя 50 эпох_2вариант](2lstm50ep_v2.png)
Помимо некоторых осмысленных словосочетаний, если исключить повторы слов, можно прочесть вполне осмысленную фразу:
`невольно улыбаешься, хочется сказать дружески этому зимнему утру "здравствуй зима"`
2 слоя и 100 эпох обучения:
![2 слоя 100 эпох](2lstm100ep.png)
В данном случае присутствуют осмысленные словосочетания, и при этом эпитеты стоят рядом с нужными существительными
(подходящим по тематике),
т.е., например, снежинки - `мягкие`, `нежные`, `кружатся`, морозец - `колюч`, магазины - `окна`,
солнце - `переливается слепящим блеском` и т.д.
2 слоя и 500 эпох обучения:
![2 слоя 500 эпох](2lstm500ep.png)
Увеличение количества эпох снизило качество генерации текста.
### Варьирование количества слоев и эпох обучения для англоязычного текста:
1 слой и 50 эпох обучения:
![1 слой 50 эпох](1lstm50ep_eng.png)
2 слоя и 50 эпох обучения:
![2 слоя 50 эпох](2lstm50ep_eng.png)
2 слоя и 100 эпох обучения:
![2 слоя 100 эпох](2lstm100ep_eng.png)
2 слоя и 500 эпох обучения:
![2 слоя 500 эпох](2lstm500ep_eng.png)
В данном случае видно, что увеличение количество слоев и эпох положительно влияет на генерацию текста.
**Вывод:** т.к. кодировались в числа не буквы, а слово, для оценки работы модели нужно обращать внимание
на осмысленность условных предложений, а не самих слов. Увелечение количества слоев привело к более хорошему результату
для обоих текстов.
Для русскоязычного текста увеличение количества эпох обучения не сильно улучшает результат, а иногда даже ухудшает.
Скорее всего, потому что данных не так много и они разнообразные, и размер потерь не сильно уменьшается в каждой
эпохе обучения.
Для англоязычного текста увеличение количества эпох привело к сильному улучшению результата
(как минимум, сократились повторения одних и тех же слов подряд).
Скорее всего, потому что частота встречаемости слов, таких как, например, `gingerbread`, `cookies`, слишком большая,
и поэтому малообученная модель их часто использует.
Для русскоязычного текста генерация текста выполнилась сильно лучше, чем для англоязычного.