Compare commits

...

7 Commits

17 changed files with 332 additions and 0 deletions

View File

@ -0,0 +1,93 @@
# Лабораторная работа №7. Рекуррентная нейронная сеть и задача генерации текста
## 12 вариант
___
### Задание:
Выбрать художественный текст на языке по варианту и обучить на нём рекуррентную
нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры
так, чтобы приблизиться к максимально осмысленному результату. Далее разбиться
на пары чётный-нечётный вариант, обменяться разработанными сетями и проверить,
как архитектура товарища справляется с вашим текстом. В завершении подобрать
компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов.
### Вариант:
- Язык текста: **русский**
### Художественный текст:
- Отрывок из книги Ф.М. Достоевского — "Белые ночи" (в формате .txt)
___
### Запуск
- Запустить файл lab7.py
### Используемые технологии
- Язык программирования **Python**
- Среда разработки **PyCharm**
- Библиотеки:
* numpy
* keras
* os
### Описание программы
Здесь представлена модель глубокого обучения для генерации текста с помощью
библиотеки Keras и алгоритма LSTM. Чтобы построить модель генерации
художественного текста, требуются некоторые текстовые данные. В качестве набора
данных здесь используется отрывок из книги великого русского писателя-реалиста
в формате текстового файла.
**Шаги написания программы:**
1. **Предварительная обработка данных**
1. Перевод символов в нижний регистр
2. Формирование уникального набора использующихся в тексте символов
3. Преобразование текстовых данных в числовые значения
4. Создание последовательности символов (X - значений, Y - следующий символ)
5. Преобразование данных в массив логических значений
2. **Построение базовой модели**
1. Инициализация модели **Sequential**. это простой стек слоев,
с помощью которого нельзя представить произвольную модель.
2. Три слоя **LSTM** (по 200 единиц в каждом):
- В первом слое входная форма.
- Во втором слое параметр *return_sequences=True* для обработки тех же
последовательностей
- В третьем слое ничего лишнего
2. Три слоя **Dropout** с вероятностью 20% для проверки переобучения.
Dropout предполагает случайный кик нейронов из процесса обучения.
Он обеспечивает, чтобы нейронная сеть не стала слишком зависимой от
любого одного узла.
3. Один "плотный" слой **Dense** в конце, который даёт вывод символов.
Dense обрабатывает каждый элемент предыдущего слоя, выполняя матричное
перемножение этих элементов со своими весами.
4. Конфигурация модели для категориальной классификации.
3. **Обучение модели**
1. **epochs=50** (одна эпоха = один проход вперёд и один проход назад
всех обучающих примеров)
2. **batch_size=100** (количество обучающих примеров за один проход
вперёд/назад. Чем больше размер пакета, тем больше памяти лучше использовать.
4. **Сохранение модели** (во избежание повторного обучения и ради экономии времени)
5. **Генерация текста на основе сохранённой модели**
1. Загрузка модели
2. Выбор случайной стартовой точки в исходном тексте
3. Генерация назначенного количества символов
---
### Пример работы
*В ходе прогона программы было зафиксировано несколько результатов генерации
200 символов. Примеры приведены ниже.*
![Graphics](result_1.jpg)
![Graphics](result_2.jpg)
![Graphics](result_3.jpg)
![Graphics](result_4.jpg)
---
### Вывод
Итак, рекуррентная нейронная сеть справилась с задачей генерации текста.
Если говорить о качестве, то требуется более глубокое обучение и больше текста.
И тогда нейросеть сможет писать даже в стиле Достоевского. Но по времени это
слишком затратно. Однако в рамках лабораторной работы результат вышел приемлемый.

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,127 @@
"""
Выбрать художественный текст на языке по варианту и обучить на нём рекуррентную нейронную сеть для решения задачи
генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.
Далее разбиться на пары чётный-нечётный вариант, обменяться разработанными сетями и проверить, как архитектура товарища
справляется с вашим текстом.
В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов.
"""
# 12 вариант
# Вариант языка текста: русский
# Художественный текст: Книга "Ф.М. Достоевский — Преступление и наказание"
import os
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM
from keras.utils import to_categorical
FILE_NAME = 'belye-nochi.txt'
# Открытие файла
df_text = (open(FILE_NAME, encoding='utf-8').read())
"""""""""""""""""""""""""""""""""
ПРЕДВАРИТЕЛЬНАЯ ОБРАБОТКА ДАННЫХ
"""""""""""""""""""""""""""""""""
# Перевод всех символов в нижний регистр для упрощения обучения
df_text = df_text.lower()
# Формирование набора символов на основе текста
characters = sorted(list(set(df_text)))
print("\033[92m\n---> Итого символов: \033[00m", len(characters))
# Сопоставления символов к номеру
char_to_n = {char: n for n, char in enumerate(characters)}
# Массивы
X = [] # обучающий
Y = [] # целевой
# Длина исходного текста
length = len(df_text)
# Длина последовательности символов для предсказания конкретного символа
seq_length = 5
# Перебора полного текста
for i in range(0, length - seq_length, 1):
sequence = df_text[i:i + seq_length]
label = df_text[i + seq_length]
X.append([char_to_n[char] for char in sequence])
Y.append(char_to_n[label])
# Масштабирование целых чисел в диапазон от 0 до 1 для облегчения изучения шаблонов сетью
X_modified = np.reshape(X, (len(X), seq_length, 1))
X_modified = X_modified / float(len(characters))
Y_modified = to_categorical(Y)
"""""""""""""""""""""
ПОСТРОЕНИЕ МОДЕЛИ
"""""""""""""""""""""
# Инициализация модели
model = Sequential()
# Пополнение модели атрибутами
model.add(LSTM(700, input_shape=(X_modified.shape[1], X_modified.shape[2]), return_sequences=True)) # первый слой на 700 единиц с входной формой
model.add(Dropout(0.2)) # кик нейронов с вероятностью 20%
model.add(LSTM(700, return_sequences=True)) # второй слой на 700 единиц, обрабатывающий те же последовательности
model.add(Dropout(0.2))
model.add(LSTM(700)) # третий слой на 700 единиц
model.add(Dropout(0.2))
model.add(Dense(Y_modified.shape[1], activation='softmax')) # сеть с плотным слоем для вывода символов
# Конфигурация модели с вычислением категориальных потерь кроссэнтропии
model.compile(loss='categorical_crossentropy', optimizer='adam')
# Обучение модели, если сохранённая модель в текущей папке отсутствует
if not os.path.exists('save_text_generator_deeper_model.h5'):
# Обучение модели на 50 эпохах и 100 обучающих примерах за один проход
model.fit(X_modified, Y_modified, epochs=50, batch_size=100)
# Сохранение обученной модели в файл в текущей папке
model.save_weights('save_text_generator_deeper_model.h5')
"""""""""""""""""""""""""""""""""""""""""""""
Генерация текста
"""""""""""""""""""""""""""""""""""""""""""""
# Загрузка обученной модели с текущей папки
model.load_weights('save_text_generator_deeper_model.h5')
# Сопоставления номеров обратно к символам
n_to_char = dict((i, c) for i, c in enumerate(characters))
# Выбор случайной точки старта в тексте для генерации
start = np.random.randint(0, len(X) - 1)
# Последовательность этой точки
pattern = X[start]
txtxt = "" # строка результата
# сохранение старта в результат
for value in pattern:
txtxt += n_to_char[value]
print("\033[92m\n---> Точка старта: \033[00m", txtxt)
# Генерация 200 символов
for i in range(200):
# Масштабирование последовательности символов
x = np.reshape(pattern, (1, len(pattern), 1))
x = x / float((len(characters)))
prediction = model.predict(x, verbose=0) # прогноз вероятностей к каждому символу
index = np.argmax(prediction) # выбор индекса лучшего по вероятности
txtxt += n_to_char[index] # запись символа с таким индексом в результат
# сохранение индекса символа в конечную результирующую последовательность
pattern.append(index)
pattern = pattern[1:len(pattern)]
print("\033[92m\n[----------> Результат <----------]\033[00m")
print(txtxt)

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1 @@
Amidst the bustling cityscape, where the rhythm of life beats in harmony with the urban pulse, each dawn brings forth a cascade of city lights painting the skyline in hues of gold and amber. Strangers pass with nods and smiles, creating a tapestry of diverse connections. Skyscrapers line the streets, reflecting the vibrant energy of a metropolis in constant motion. As night falls, the city's heartbeat resonates in lively gatherings at eclectic eateries, where stories are exchanged, and the city's vibrant spirit comes alive.

View File

@ -0,0 +1 @@
In the bustling cityscape where the rhythm of life beats in harmony with the urban pulse each dawn brings forth a cascade of city lights painting the skyline in hues of gold and amber strangers pass with nods and smiles creating a tapestry of diverse connections skyscrapers line the streets reflecting the vibrant energy of a metropolis in constant motion as night falls the city's heartbeat resonates in lively gatherings at

BIN
verina_daria_lab_7/img.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 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 prepare_and_train_model(file_path, epochs):
# Считывание данных из файла
with open(file_path, encoding='utf-8') as f:
data = f.read()
# Создание токенизатора
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, y = input_sequences[:, :-1], input_sequences[:, -1]
# Создание модели рекуррентной нейронной сети
model = keras.Sequential([
keras.layers.Embedding(len(tokenizer.word_index) + 1, 100, input_length=max_sequence_len-1),
keras.layers.Dropout(0.2),
keras.layers.LSTM(150),
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_from_model(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_rus, tokenizer_rus, max_sequence_len_rus = prepare_and_train_model('russian.txt', 150)
rus_text_generated = generate_text_from_model(model_rus, tokenizer_rus, max_sequence_len_rus, "В", 55)
model_eng, tokenizer_eng, max_sequence_len_eng = prepare_and_train_model('english.txt', 150)
eng_text_generated = generate_text_from_model(model_eng, tokenizer_eng, max_sequence_len_eng, "In the", 69)
with open('russian_generated.txt', 'w', encoding='utf-8') as f_rus:
f_rus.write(rus_text_generated)
with open('english_generated.txt', 'w', encoding='utf-8') as f_eng:
f_eng.write(eng_text_generated)

View File

@ -0,0 +1,35 @@
# Генератор Текста на Рекуррентных Нейронных Сетях
## Общее задание
Выбран художественный англоязычный текст для обучения рекуррентной нейронной сети (RNN) с целью генерации текста. Задача включает подбор архитектуры и параметров для приближения к максимально осмысленным результатам. Далее предусмотрено обмен разработанными сетями с партнером, проверка, как архитектура товарища справляется с вашим текстом, и в конечном итоге подбор компромиссной архитектуры, справляющейся хорошо с обоими видами текстов.
## Задание по вариантам
Вариант: Нечетный вариант (художественный англоязычный текст).
Запуск программы
Программу можно запустить через файл app.py.
Технологии
Язык программирования: Python
Библиотеки: TensorFlow, Keras, Flask
## Описание работы программы
Программа реализует генерацию текста с использованием рекуррентных нейронных сетей (RNN) с помощью библиотек TensorFlow и Keras. Flask используется для создания веб-приложения, которое взаимодействует с моделью RNN. Пользователь вводит начальный текст (seed text) через веб-интерфейс, после чего программа отправляет запрос на сервер, который в свою очередь использует модель для генерации следующего участка текста, основываясь на введенном начальном тексте.
Входные данные
Текстовый файл (например, 'your_text_file.txt'), содержащий обучающие данные.
Веб-интерфейс для ввода начального текста.
Выходные данные
Сгенерированный текст, отображаемый в веб-интерфейсе.
## Вывод консоли:
![img_2.png](img_2.png)
![img_1.png](img_1.png)
![img.png](img.png)
## Получившийся текст:
In the bustling cityscape where the rhythm of life beats in harmony with the urban pulse each dawn brings forth a cascade of city lights painting the skyline in hues of gold and amber strangers pass with nods and smiles creating a tapestry of diverse connections skyscrapers line the streets reflecting the vibrant energy of a metropolis in constant motion as night falls the city's heartbeat resonates in lively gatherings at
## Вывод:
В результате выполнения лабораторной работы были успешно созданы и обучены рекуррентные нейронные сети (RNN) для генерации текста на русском и английском языках.

View File

@ -0,0 +1 @@
В захватывающем мире исследований глубокого космоса, где звезды танцуют свой бескрайний вальс, каждое утро начинается с таинственного свечения далеких галактик, окрашивая космическую панораму в оттенках изумрудных и сапфировых лучей. Космические путешественники встречают друг друга с уважением, обмениваясь впечатлениями о чудесах вселенной. Межзвездные аллеи украшены мерцающими астероидами, создавая ощущение бескрайнего волнения и удивления. По наступлении ночи исследователи созвездий собираются в космических кафе, где звездные истории обретают новые оттенки в мистической атмосфере.

View File

@ -0,0 +1 @@
В захватывающем мире исследований глубокого где где звезды танцуют свой бескрайний вальс каждое каждое начинается с таинственного свечения далеких галактик окрашивая космическую панораму в оттенках изумрудных и сапфировых лучей космические путешественники встречают друг друга с уважением обмениваясь впечатлениями о чудесах вселенной межзвездные аллеи украшены мерцающими астероидами создавая ощущение бескрайнего волнения и удивления по наступлении ночи исследователи