diff --git a/kutygin_andrey_lab_7/README.md b/kutygin_andrey_lab_7/README.md new file mode 100644 index 0000000..50d70f5 --- /dev/null +++ b/kutygin_andrey_lab_7/README.md @@ -0,0 +1,51 @@ +**Задание** +*** +Выбрать художественный текст (четные варианты – русскоязычный, нечетные – англоязычный) и обучить на нем рекуррентную нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.Далее разбиться на пары четный-нечетный вариант, обменяться разработанными сетями и проверить, как архитектура товарища справляется с вашим текстом. + +**Как запустить лабораторную** +*** +Запустить файл main.py + +**Используемые технологии** +*** +Библиотеки tensorflow, numpy, их компоненты + +**Описание лабораторной (программы)** +*** +Данный код представляет собой пример использования рекуррентной нейронной сети LSTM (Long Short-Term Memory) с использованием библиотеки Keras для обучения модели генерации текста на русском языке. + +Описание работы кода: +1. Загрузка и предобработка данных: + - Импортируются необходимые библиотеки, включая TensorFlow, NumPy и Keras. + - Открывается файл с русским текстом "rus.txt" и считывается его содержимое в переменную "rus_text". + - Создается объект "tokenizer_rus" для токенизации текста на отдельные слова. + - Производится обучение токенизатора на предоставленном русском тексте. + - Вычисляется общий размер словаря на основе уникальных слов в тексте. + - Преобразование входных и выходных последовательностей текста в числовой формат, используя токенизатор. + - Выравнивание входных последовательностей до максимальной длины для обеспечения единой размерности. + +2. Построение модели: + - Создается объект модели Sequential. + - Добавляется слой Embedding для преобразования числовых представлений слов в векторные представления. + - Добавляется слой LSTM для анализа последовательности входных данных. + - Добавляется полносвязный слой Dense с функцией активации softmax для прогнозирования следующего слова. + - Компилируется модель с выбранным оптимизатором и функцией потерь. + +3. Обучение модели: + - Обучение модели на тренировочных данных с выбранными параметрами batch_size и epochs. + +4. Функция генерации текста: + - Создается функция generate_text, которая принимает модель, токенизатор, максимальную длину последовательности и начальный текст. + - В цикле генерируются следующие слова на основе текущего состояния модели и добавляются к выходному тексту. + - Функция возвращает сгенерированный текст. + +5. Генерация текста на основе обученной модели: + - Вызывается функция generate_text, передавая ей обученную модель, токенизатор, максимальную длину последовательности и начальный текст. + - Выводятся результаты, включая потери модели на тренировочных данных и сгенерированный текст на основе обученной модели. +**Результат** +*** +Результат сгенерированного текста на русском языке: Был мальчик по имени тимофей он жил в маленьком домике на краю леса у него была большая мечта – стать лучшим рыцарем во всей стране каждый день тимофей тренировался с мечом прыгал через препятствия и никогда не терял надежды он знал что для достижения своей мечты нужно много работать и верить в себя однажды когда тимофей был в лесу он услышал громкий крик он поспешил к месту откуда раздавался крик и увидел что дракон похитил принцессу тимофей решил спасти её и стать настоящим героем он с силой размахнулся мечом и атаковал дракона они долго сражались но тимофей был очень храбрым + +Потери на тренировочных данных: 0.026399850845336914 + +Вывод: текст получился немного сокращенным, так как стоит ограничение в 100 слов, но довольно похожим и несущим примерный смысл той истории, которая находится в файле. \ No newline at end of file diff --git a/kutygin_andrey_lab_7/main.py b/kutygin_andrey_lab_7/main.py new file mode 100644 index 0000000..19bcc8f --- /dev/null +++ b/kutygin_andrey_lab_7/main.py @@ -0,0 +1,58 @@ +import tensorflow as tf +import numpy as np +from keras.models import Sequential +from keras.layers import LSTM, Dense, Embedding +from keras.preprocessing.text import Tokenizer +from keras.preprocessing.sequence import pad_sequences + +# Загрузка и предобработка данных на русском языке +with open("rus.txt", "r", encoding="utf-8") as f: + rus_text = f.read() + +tokenizer_rus = Tokenizer() +tokenizer_rus.fit_on_texts([rus_text]) + +rus_vocab_size = len(tokenizer_rus.word_index) + 1 +rus_sequences = tokenizer_rus.texts_to_sequences([rus_text])[0] +rus_input_sequences = [] +rus_output_sequences = [] + +for i in range(1, len(rus_sequences)): + rus_input_sequences.append(rus_sequences[:i]) + rus_output_sequences.append(rus_sequences[i]) + +rus_max_sequence_len = max([len(seq) for seq in rus_input_sequences]) +rus_input_sequences = pad_sequences(rus_input_sequences, maxlen=rus_max_sequence_len) + +x_rus_train = rus_input_sequences +y_rus_train = tf.keras.utils.to_categorical(rus_output_sequences, num_classes=rus_vocab_size) + +# Построение модели для русского языка +rus_model = Sequential() +rus_model.add(Embedding(rus_vocab_size, 256, input_length=rus_max_sequence_len)) +rus_model.add(LSTM(512)) +rus_model.add(Dense(rus_vocab_size, activation='softmax')) + +rus_model.compile(loss='categorical_crossentropy', optimizer='adam') + +# Обучение модели для русского языка +rus_history = rus_model.fit(x_rus_train, y_rus_train, batch_size=128, epochs=200) + +def generate_text(model, tokenizer, max_sequence_len, seed_text): + output_text = seed_text + for _ in range(100): # Генерируем 100 слов + encoded_text = tokenizer.texts_to_sequences([output_text])[0] + pad_encoded = pad_sequences([encoded_text], maxlen=max_sequence_len, truncating='pre') + pred_word_index = np.argmax(model.predict(pad_encoded), axis=-1) + pred_word = tokenizer.index_word[pred_word_index[0]] + output_text += " " + pred_word + return output_text + +# Генерация текста для русской модели +rus_output_text = generate_text(rus_model, tokenizer_rus, rus_max_sequence_len, "Помню просторный") + +# Вывод результатов +print("Русская модель:") +print("Потери на тренировочных данных:", rus_history.history['loss'][-1]) +print("Сгенерированный текст:") +print(rus_output_text) diff --git a/kutygin_andrey_lab_7/rus.txt b/kutygin_andrey_lab_7/rus.txt new file mode 100644 index 0000000..636807a --- /dev/null +++ b/kutygin_andrey_lab_7/rus.txt @@ -0,0 +1,11 @@ +Жил-был мальчик по имени Тимофей. Он жил в маленьком домике на краю леса. У него была большая мечта – стать лучшим рыцарем во всей стране. + +Каждый день Тимофей тренировался с мечом, прыгал через препятствия и никогда не терял надежды. Он знал, что для достижения своей мечты, нужно много работать и верить в себя. + +Однажды, когда Тимофей был в лесу, он услышал громкий крик. Он поспешил к месту откуда раздавался крик и увидел, что дракон похитил принцессу. Тимофей решил спасти её и стать настоящим героем. + +Он с силой размахнулся мечом и атаковал дракона. Они долго сражались, но Тимофей был очень храбрым и не сдавался. В конечном итоге, он победил дракона и освободил принцессу. + +Весь город был очень благодарен Тимофею за его мужество и отвагу. Тимофей стал настоящим героем и его мечта сбылась – он стал лучшим рыцарем во всей стране. + +И они жили долго и счастливо.