Merge pull request 'podkorytova_yulia_lab_7 is ready' (#201) from podkorytova_yulia_lab_7 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/201
This commit is contained in:
Alexey 2023-12-07 16:11:53 +04:00
commit 9c3fcd8cf3
8 changed files with 122 additions and 0 deletions

View File

@ -0,0 +1,44 @@
# Лабораторная работа 7. Рекуррентная нейронная сеть и задача генерации текста
### Задание на лабораторную:
Выбрать художественный текст (русскоязычный и англоязычный) и обучить на нем рекуррентную нейронную сеть для решения задачи генерации.
Подобрать архитектуру, справляющуюся достаточно хорошо с обоими видами текстов, и параметры так, чтобы приблизиться к максимально осмысленному результату.
***
### Как запустить лабораторную работу:
Для запуска лабораторной работы необходимо открыть файл `lr7.py`, нажать на ПКМ и в выпадающем списке выбрать опцию "Run".
***
### Технологии:
**NumPy (Numerical Python)** - это библиотека Python, которую применяют для математических вычислений: начиная с базовых функций и заканчивая линейной алгеброй.
**TensorFlow** - это библиотека для машинного обучения, группы технологий, которая позволяет обучать искусственный интеллект решению разных задач.
**Keras** - это библиотека для языка программирования Python, которая предназначена для глубокого машинного обучения. Она позволяет быстрее создавать и настраивать модели — схемы, по которым распространяется и подсчитывается информация при обучении.
**Keras Preprocessing** - это модуль предварительной обработки и дополнения данных библиотеки глубокого обучения Keras. Он предоставляет утилиты для работы с данными изображения, текстовыми данными и данными последовательности.
**Tokenizer** - это инструмент, предоставляемый библиотекой Keras, который используется для токенизации текста (разделения текста на отдельные токены или слова). Токенизатор в Keras предоставляет функции для преобразования текста в последовательности числовых индексов.
***
### Что делает лабораторная работа:
В лабораторной работе сначала данные считываются из файла, указанного в переменной *file_path*, создается экземпляр *Tokenizer*, который обучается на тексте из файла.
Далее текст преобразуется в последовательности чисел с помощью функции *texts_to_sequences*, создаются обучающие данные путем создания последовательностей из слов и производится предобработка данных, чтобы все последовательности имели одинаковую длину, используя функцию *pad_sequences*.
Данные разделяются на входные и выходные, создается модель рекуррентной нейронной сети с использованием *Sequential* и слоев *Embedding* (преобразует индексы слов в плотные векторные представления), *LSTM* ( рекуррентный слой, который обрабатывает последовательности данных с учетом долгосрочных зависимостей), *Dropout* (применяет случайное обнуление некоторых элементов входных данных во время обучения) и *Dense* (слой нейронной сети, в котором каждый нейрон связан со всеми нейронами предыдущего слоя).
Модель компилируется с оптимизатором *'adam'*, функцией потерь *'sparse_categorical_crossentropy'* и метрикой *'accuracy'* и обучается на входных и выходных данных и на 150 эпохах.
После генерируется текст на основе заданного начального предложения с помощью обученной модели. В функции генерации начальный текст преобразуется в последовательность чисел с помощью токенизатора, производится предобработка последовательности чисел, предсказывается следующее слово и выбирается наиболее вероятное, после этого предсказанное слово добавлется к начальному тексту.
Результатом работы являются сгенерированные тексты из 25 слов на русском и английском языках, которые начинаются со слов *'Зима'* и *'Winter'* и составляются на основе исходных текстов из файлов `rus.txt` и `eng.txt` соответсвенно.
***
### Пример выходных данных:
***Пример работы и сгенерированный русский текст***
![](rusRes1.JPG)
...
![](rusRes2.JPG)
Сгенерированный текст: "Зима лучшее время года зима это самое холодное время года она волшебная потому что всё укрыто белым снегом и это похоже на сказку зимой".
***Пример работы и сгенерированный английский текст***
![](engRes1.JPG)
...
![](engRes2.JPG)
Сгенерированный текст: "Winter is the best time of the year winter is the coldest time of the year it is magical because everything is covered with white snow".
***
**Вывод**: результатом лабораторной работы стали сгенерированные при помощи рекурентной нейронной сети, обученной на 150 эпохах, тексты из 25 слов на русском и английском языках.
Программа сгенеририровала достаточно осмысленный текст, очень похожий на исходный, как на русском, так и на английском языках. Это говорит о правильно подобранных архитектуре и параметрах.

View File

@ -0,0 +1,5 @@
Winter is the best time of the year.
Winter is the coldest time of the year. It is magical because everything is covered with white snow and it looks like a fairy tale. In winter, the nights are longer and the days are shorter, but this does not prevent children from having fun and enjoying this time of year.
Children usually spend time outside in winter playing snowballs, sledding, skating or skiing and just playing with friends. There are many holidays in winter, one of which is Christmas, when families spend time together and give each other gifts. I think that winter is a wonderful time of the year.

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -0,0 +1,68 @@
import numpy as np
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# функция подготовки текста, создания и тренировки модели
def train_model(file_path, epochs):
# cчитывание данных из файла
f = open(file_path, encoding='utf-8')
data = f.read()
f.close()
# создание токенизатора
tokenizer = Tokenizer()
tokenizer.fit_on_texts([data])
# преобразование текста в последовательности чисел
sequences = tokenizer.texts_to_sequences([data])
# создание обучающих данных
input_sequences = []
for sequence in sequences:
for i in range(1, len(sequence)):
n_gram_sequence = sequence[:i+1]
input_sequences.append(n_gram_sequence)
# предобработка для получения одинаковой длины последовательностей
max_sequence_len = max([len(sequence) for sequence in input_sequences])
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre')
# разделение на входные и выходные данные
x = input_sequences[:, :-1]
y = input_sequences[:, -1]
# создание модели рекуррентной нейронной сети
model = keras.Sequential()
model.add(keras.layers.Embedding(len(tokenizer.word_index)+1, 100, input_length=max_sequence_len-1))
model.add(keras.layers.Dropout(0.2))
model.add(keras.layers.LSTM(150))
model.add(keras.layers.Dense(len(tokenizer.word_index)+1, activation='softmax'))
# компиляция и обучение модели
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=epochs, verbose=1)
return model, tokenizer, max_sequence_len
# функция генерации текста
def generate_text(model, tokenizer, max_sequence_len, seed_text, next_words):
for _ in range(next_words):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
predicted = model.predict(token_list)
predict_index = np.argmax(predicted, axis=-1)
word = tokenizer.index_word.get(predict_index[0])
seed_text += " " + word
return seed_text
# русский текст
model, tokenizer, max_sequence_len = train_model('rus.txt', 150)
rus_text = generate_text(model, tokenizer, max_sequence_len, "Зима", 25)
print(rus_text)
# английский текст
model, tokenizer, max_sequence_len = train_model('eng.txt', 150)
eng_text = generate_text(model, tokenizer, max_sequence_len, "Winter", 25)
print(eng_text)

View File

@ -0,0 +1,5 @@
Зима лучшее время года.
Зима это самое холодное время года. Она волшебная, потому что всё укрыто белым снегом и это похоже на сказку. Зимой ночи длиннее, а дни короче, но это не мешает детям развлекаться и наслаждаться этим временем года.
Обычно зимой дети проводят время на улице, играя в снежки, катаясь на санках, коньках или лыжах и просто играя с друзьями. Зимой много праздников, одним из которых является рождество, когда семьи проводят время вместе и дарят друг другу подарки. Я считаю, что зима это чудесное время года.

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB