diff --git a/degtyarev_mikhail_lab_7/Readme.md b/degtyarev_mikhail_lab_7/Readme.md new file mode 100644 index 0000000..914d264 --- /dev/null +++ b/degtyarev_mikhail_lab_7/Readme.md @@ -0,0 +1,55 @@ +# Лабораторная 7 +## Вариант 9 + +## Задание +Выбрать художественный текст (четные варианты – русскоязычный, нечетные – англоязычный) и обучить на нем рекуррентную нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.Далее разбиться на пары четный-нечетный вариант, обменяться разработанными сетями и проверить, как архитектура товарища справляется с вашим текстом. + +## Описание Программы +Программа представляет собой пример использования рекуррентной нейронной сети (LSTM) для генерации текста на основе художественного произведения. +### Используемые библиотеки +- `numpy`: Библиотека для работы с многомерными массивами и математическими функциями. +- `keras`: + - `Sequential`: Модель нейронной сети, представляющая собой линейный стек слоев. + - `Embedding`: Слой для преобразования целых чисел (индексов слов) в плотные вектора фиксированной размерности. + - `LSTM`: Рекуррентный слой долгой краткосрочной памяти. + - `Dense`: Полносвязный слой с активацией softmax для генерации вероятностного распределения слов. + - `Tokenizer`, `pad_sequences`: Инструменты для токенизации и последовательной обработки текста. + +### Шаги программы + +1. **Загрузка данных:** + - Текст загружается из файла `text.txt` (англоязычный текст) с использованием стандартных средств языка Python. + +2. **Подготовка данных для обучения:** + - Текст разбивается на последовательности токенов для обучения рекуррентной нейронной сети. + - Используется `Tokenizer` для создания словаря и преобразования текста в числовое представление. + - Последовательности дополняются до максимальной длины с использованием `pad_sequences`. + +3. **Создание и компиляция модели:** + - Создается последовательная модель с вложенным слоем, рекуррентным слоем LSTM и полносвязным слоем. + - Модель компилируется с использованием категориальной кросс-энтропии в качестве функции потерь и оптимизатора Adam. + +4. **Обучение модели:** + - Модель обучается на подготовленных данных в течение 100 эпох. + +5. **Оценка производительности модели:** + - Выводится окончательная ошибка на обучающих данных. + +6. **Генерация текста:** + - Создается начальный текст "Amidst the golden hues of autumn leaves". + - Модель используется для предсказания следующего слова в последовательности. + - Сгенерированный текст выводится на экран. + +### Запуск программы +- Замените `'text.txt'` на актуальный путь или имя вашего файла с англоязычным текстом. +- Склонируйте или скачайте код из файла `main.py`. +- Запустите файл в среде, поддерживающей выполнение Python. `python main.py` + + +### Результаты + +Потери на тренировочных данных составили не такое большое значение: 0.029374321853453274327 + +Результат сгенерированного англоязычного текста: +In the quietude of the woods, mystical creatures stirred, their silhouettes dancing in the dappling sunlight. A mysterious energy enveloped the surroundings, as if the very essence of nature had come alive. The rustling leaves seemed to carry ancient tales, whispered secrets of times long past. Each step through the foliage unveiled a new chapter in the enchanted story of the woodland realm. + diff --git a/degtyarev_mikhail_lab_7/main.py b/degtyarev_mikhail_lab_7/main.py new file mode 100644 index 0000000..3e353b1 --- /dev/null +++ b/degtyarev_mikhail_lab_7/main.py @@ -0,0 +1,60 @@ +import numpy as np +from keras.models import Sequential +from keras.layers import Embedding, LSTM, Dense +from keras.preprocessing.text import Tokenizer +from keras.preprocessing.sequence import pad_sequences + +# Load the text +with open('text.txt', 'r', encoding='utf-8') as file: + text = file.read() + +tokenizer = Tokenizer() +tokenizer.fit_on_texts([text]) +total_words = len(tokenizer.word_index) + 1 + +# Create the sequence of training data +input_sequences = [] +for line in text.split('\n'): + token_list = tokenizer.texts_to_sequences([line])[0] + for i in range(1, len(token_list)): + n_gram_sequence = token_list[:i+1] + input_sequences.append(n_gram_sequence) + +# Padding sequences +max_sequence_length = max([len(seq) for seq in input_sequences]) +input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre') + +# Create input and output data +X, y = input_sequences[:, :-1], input_sequences[:, -1] +y = np.eye(total_words)[y] + +# Create the model +model = Sequential() +model.add(Embedding(total_words, 50, input_length=max_sequence_length-1)) +model.add(LSTM(100)) +model.add(Dense(total_words, activation='softmax')) + +# Compile the model +model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) + +# Train the model +history = model.fit(X, y, epochs=100, verbose=2) + +print(f"Final Loss on Training Data: {history.history['loss'][-1]}") + +# Generate text +seed_text = "Amidst the golden hues of autumn leaves" +next_words = 100 + +for _ in range(next_words): + token_list = tokenizer.texts_to_sequences([seed_text])[0] + token_list = pad_sequences([token_list], maxlen=max_sequence_length-1, padding='pre') + predicted = model.predict_classes(token_list, verbose=0) + output_word = "" + for word, index in tokenizer.word_index.items(): + if index == predicted: + output_word = word + break + seed_text += " " + output_word + +print(seed_text) diff --git a/degtyarev_mikhail_lab_7/text.txt b/degtyarev_mikhail_lab_7/text.txt new file mode 100644 index 0000000..175da7f --- /dev/null +++ b/degtyarev_mikhail_lab_7/text.txt @@ -0,0 +1 @@ +Amidst the golden hues of autumn leaves, a gentle breeze whispered through the trees. The air was filled with the sweet fragrance of blooming flowers, and the sun cast a warm glow on the peaceful landscape. Birds chirped melodiously, creating a symphony of nature's harmonious melodies. As the day unfolded, the sky painted itself in vibrant shades of orange and pink, showcasing the breathtaking beauty of the changing seasons. \ No newline at end of file