96 lines
7.2 KiB
Markdown
96 lines
7.2 KiB
Markdown
|
# Лабораторная работа №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`, слишком большая,
|
|||
|
и поэтому малообученная модель их часто использует.
|
|||
|
|
|||
|
Для русскоязычного текста генерация текста выполнилась сильно лучше, чем для англоязычного.
|