Merge pull request 'kutygin_andrey_lab_7_ready' (#155) from kutygin_andrey_lab_7 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/155
This commit is contained in:
commit
4ee41e6d61
51
kutygin_andrey_lab_7/README.md
Normal file
51
kutygin_andrey_lab_7/README.md
Normal file
@ -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 слов, но довольно похожим и несущим примерный смысл той истории, которая находится в файле.
|
58
kutygin_andrey_lab_7/main.py
Normal file
58
kutygin_andrey_lab_7/main.py
Normal file
@ -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)
|
11
kutygin_andrey_lab_7/rus.txt
Normal file
11
kutygin_andrey_lab_7/rus.txt
Normal file
@ -0,0 +1,11 @@
|
||||
Жил-был мальчик по имени Тимофей. Он жил в маленьком домике на краю леса. У него была большая мечта – стать лучшим рыцарем во всей стране.
|
||||
|
||||
Каждый день Тимофей тренировался с мечом, прыгал через препятствия и никогда не терял надежды. Он знал, что для достижения своей мечты, нужно много работать и верить в себя.
|
||||
|
||||
Однажды, когда Тимофей был в лесу, он услышал громкий крик. Он поспешил к месту откуда раздавался крик и увидел, что дракон похитил принцессу. Тимофей решил спасти её и стать настоящим героем.
|
||||
|
||||
Он с силой размахнулся мечом и атаковал дракона. Они долго сражались, но Тимофей был очень храбрым и не сдавался. В конечном итоге, он победил дракона и освободил принцессу.
|
||||
|
||||
Весь город был очень благодарен Тимофею за его мужество и отвагу. Тимофей стал настоящим героем и его мечта сбылась – он стал лучшим рыцарем во всей стране.
|
||||
|
||||
И они жили долго и счастливо.
|
Loading…
Reference in New Issue
Block a user