Merge pull request 'degtyarev_mikhail_lab_7_is_ready' (#286) from degtyarev_mikhail_lab_7 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/286
This commit is contained in:
Alexey 2023-12-28 10:36:23 +04:00
commit dfa7f803fd
3 changed files with 116 additions and 0 deletions

View File

@ -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.

View File

@ -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)

View File

@ -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.