Merge pull request 'martysheva lab7 done' (#176) from martysheva_tamara_lab_7 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/176
This commit is contained in:
Alexey 2023-12-07 16:11:01 +04:00
commit 7b29763f93
4 changed files with 157 additions and 0 deletions

View File

@ -0,0 +1,95 @@
# Лабораторная работа 7. Рекуррентная нейронная сеть и задача генерациитекста
### Вариант № 18(четный)
Выбрать художественный текст (четные варианты –русскоязычный, нечетные –англоязычный) и обучить на нем рекуррентную нейронную сеть
для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.
Далее разбиться на пары четный-нечетный вариант, обменяться разработанными сетями ипроверить, как архитектура товарища справляется с вашим текстом.
В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов.
***
## *Как запустить лабораторную работу:*
Чтобы запустить программу, открываем файл lab7 в PyCharm и нажимаем на зеленый треугольник в правом верхнем углу.
***
## *Использованные технологии:*
**Keras** — это библиотека с открытым исходным кодом, предоставляющая интерфейс Python для искусственных нейронных сетей. Keras выступает в качестве интерфейса для библиотеки TensorFlow.
**TensorFlow** — это бесплатная библиотека программного обеспечения с открытым исходным кодом для машинного обучения и искусственного интеллекта. Его можно использовать для решения широкого спектра задач, но особое внимание уделяется обучению и выводу глубоких нейронных сетей.
**NumPy** — это фундаментальный пакет для научных вычислений на Python.
***
## *Что делает ЛР:*
В данной работе анализируется работа рекуррентных нейронных сетей и решается задача генерации текстов на русском и английском языках. Имеются 2 файла:
text_rus.txt - отрывок из книги на русском языке и text_eng.txt - на английском.
Метод tokenize готовит текстовые данные для обучения модели, преобразуя текст в числовые последовательности и подготавливая их в формат, пригодный для использования в нейронной сети.
При вызове метода train_model создается, компилируется и обучается рекуррентная нейонная сеть со следующими слоями:
* Embedding - слой, преобразующий целочисленные последовательности в плотные векторы.
* LSTM - слой с блоками долгой краткосрочной памятью.
* Dropout - обработчик разрыва.
* Dense - одномерный слой обычных нейронов.
В ходе экспериментов были подобраны оптимальные настройки для слоев сети, а также необходимое кол-во эпох для обучения сети.
При вызове метода generate_text генерируется текст с использованием необходимых переменных.
**Результатом работы программы** являются: сгенерированные тексты на русском и английском языках на основе исходных текстов (в консоли).
***
## *Пример выходных данных:*
### Русский текст:
>Вывод в консоли для русского текста (140 эпох обучения):
![](https://sun9-26.userapi.com/impg/XgE4yiMVmlkmPOCNxfjF-xHA96aRm0pcf_kjVQ/1eMoa9EzSfg.jpg?size=704x118&quality=96&sign=c5aeed8bc608950c86c211ab258daaf2&type=album)
*. . .*
![](https://sun9-61.userapi.com/impg/nDxqsiJf0Bu07Sh4rMyD4PHBm2lwSwB0XrYNSQ/EHhW-heGkiA.jpg?size=703x130&quality=96&sign=850c6f8d01f4d8ea2ebf23f26f716bc6&type=album)
>Исходный текст:
Кофе со специями сдобрен изрядным количеством меда, и все равно обжигает мне язык. Крессентия всегда заказывает
именно такой кофе. Мы сидим в павильоне, как и тысячу раз до этого, в руках у нас дымящиеся фарфоровые чашки —
холодным вечером о них так приятно греть ладони. Какое-то мгновение мне кажется, что все как прежде, мы мирно сидим
в полумраке и молчим. Мне не хватало наших бесед, но еще я скучала по этому уютному молчанию: мы всегда могли просто
посидеть вот так, не испытывая потребности заполнять тишину глупой светской болтовней. Но это же бессмысленно.
С чего мне скучать по Крессентии, если она сидит напротив меня?
>Сгенерированный текст:
Rus: Кофе со специями сдобрен изрядным количеством меда и все равно обжигает мне язык крессентия всегда заказывает
именно такой кофе мы сидим в павильоне как и тысячу раз до этого в руках у нас дымящиеся фарфоровые чашки —
холодным вечером о них так приятно греть ладони какое то мгновение мне кажется что все как прежде мы мирно сидим
в полумраке и молчим мне не хватало наших бесед но еще я скучала по этому уютному молчанию мы всегда могли просто
посидеть вот так не испытывая потребности заполнять тишину глупой светской болтовней но это же бессмысленно
с чего мне скучать по крессентии если она сидит напротив
### Английский текст:
>Вывод в консоли для английского текста (140 эпох обучения):
![](https://sun9-80.userapi.com/impg/c4PAhbmW2IwypFAx7CXdGgcLVzGosYGaVZggNw/b30mnuCCLco.jpg?size=696x116&quality=96&sign=93c7122a9ea7e2f83e03ccbf5b71a4e6&type=album)
*. . .*
![](https://sun9-73.userapi.com/impg/98igC5fDLCshairi_j8pgUBYfo_-LiNq5Ccl9w/Y31tYsl6jd0.jpg?size=699x130&quality=96&sign=643d64065661da347b4eecda07b7efb5&type=album)
>Исходный текст:
The spiced coffee is sweet on my tongue, made with a generous dollop of honey. The way Crescentia always orders it.
We sit on the pavilion like we have a thousand times before, steaming porcelain mugs cradled in our hands to ward off
the chill in the evening air. For a moment, it feels just like every time before, a comfortable silence hanging in the
dark air around us. Ive missed talking to her, but Ive missed this, too—how we could sit together and not feel the
need to fill the silence with meaningless small talk. But thats silly. How can I miss Cress when shes sitting right in front of me?
>Сгенерированный текст:
Eng: The spiced coffee is sweet on my tongue made with a generous dollop of honey the way crescentia always orders it
we sit on the pavilion like we have a thousand times before steaming porcelain mugs cradled in our hands to ward off
the chill in the evening air for a moment it feels just like every time before a comfortable silence hanging in the
dark air around us ive missed talking to her but ive missed this too—how we could sit together and not feel the
need to fill the silence with meaningless small talk but thats silly how can i miss
***
**Вывод**:
Сгенерированные тексты получились в точности похожими на оригинал (за исключением некоторых моментов), что говорит о правильно подобранной структуре рекуррентной нейронной
сети и количестве эпох для обучения сети. Русский текст получился практически дословным как и английский, только в английском немного съелся конец последнего предложения.
Для обеих моделей (для русского и английского текста) под конец обучения метрика точности модели достигла 1, а потери доведены до минимума.

View File

@ -0,0 +1,60 @@
import numpy as np
from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.utils import to_categorical
#Подготовка текста, получение данных для тренировки модели
def tokenize(filename):
with open(filename, encoding='utf-8') as file:
text = file.read()
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
uniq_words_amount = len(tokenizer.word_index) + 1
sequences = []
list_token = tokenizer.texts_to_sequences([text])[0]
for i in range(1, len(list_token)):
sequences.append(list_token[:i + 1])
max_seq_length = max([len(x) for x in sequences])
sequences = pad_sequences(sequences, maxlen=max_seq_length)
x, y = sequences[:, :-1], sequences[:, -1]
y = to_categorical(y, num_classes=uniq_words_amount)
return max_seq_length, uniq_words_amount, tokenizer, x, y
#Создание и тренировка модели
def train_model(max_seq_length, uniq_words_amount, x, y, epochs):
model = Sequential()
model.add(Embedding(uniq_words_amount, 128, input_length=max_seq_length-1))
model.add(LSTM(152, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(uniq_words_amount, activation='softmax'))
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x, y, epochs=epochs, verbose=1)
return model
#Генерация текста
def generate_text(text, tokenizer, model, max_seq_length):
i = 0
while(i < 100):
list_token = tokenizer.texts_to_sequences([text])[0]
token_list = pad_sequences([list_token], maxlen=max_seq_length-1, padding='pre')
predict = model.predict(token_list)
predict_index = np.argmax(predict, axis=-1)
word = tokenizer.index_word.get(predict_index[0])
text += " " + word
i = i+1
return text
msl, uwa, tokenizer, x, y = tokenize("text_rus.txt")
model = train_model(msl, uwa, x, y, 140)
print("Rus: ", generate_text("Кофе со специями", tokenizer, model, msl))
msl, uwa, tokenizer, x, y = tokenize("text_eng.txt")
model = train_model(msl, uwa, x, y, 140)
print("Eng: ", generate_text("The spiced coffee", tokenizer, model, msl))

View File

@ -0,0 +1 @@
The spiced coffee is sweet on my tongue, made with a generous dollop of honey. The way Crescentia always orders it. We sit on the pavilion like we have a thousand times before, steaming porcelain mugs cradled in our hands to ward off the chill in the evening air. For a moment, it feels just like every time before, a comfortable silence hanging in the dark air around us. Ive missed talking to her, but Ive missed this, too—how we could sit together and not feel the need to fill the silence with meaningless small talk. But thats silly. How can I miss Cress when shes sitting right in front of me?

View File

@ -0,0 +1 @@
Кофе со специями сдобрен изрядным количеством меда, и все равно обжигает мне язык. Крессентия всегда заказывает именно такой кофе. Мы сидим в павильоне, как и тысячу раз до этого, в руках у нас дымящиеся фарфоровые чашки — холодным вечером о них так приятно греть ладони. Какое-то мгновение мне кажется, что все как прежде, мы мирно сидим в полумраке и молчим. Мне не хватало наших бесед, но еще я скучала по этому уютному молчанию: мы всегда могли просто посидеть вот так, не испытывая потребности заполнять тишину глупой светской болтовней. Но это же бессмысленно. С чего мне скучать по Крессентии, если она сидит напротив меня?