реади1

This commit is contained in:
DmitriyAntonov 2023-10-12 21:19:26 +04:00
parent 9644582307
commit 3a868e5545
11 changed files with 202 additions and 0 deletions

View File

@ -0,0 +1,84 @@
# Лаб 7 RNN
Выбрать художественный текст (четные варианты русскоязычный,
нечетные англоязычный) и обучить на нем рекуррентную нейронную сеть
для решения задачи генерации. Подобрать архитектуру и параметры так,
чтобы приблизиться к максимально осмысленному результату. Далее
разбиться на пары четный-нечетный вариант, обменяться разработанными
сетями и проверить, как архитектура товарища справляется с вашим текстом.
В завершении подобрать компромиссную архитектуру, справляющуюся
достаточно хорошо с обоими видами текстов.
# Вариант 3
Рекуррентная нейронная сеть и задача
генерации текста
# Запуск
Выполнением скрипта файла (вывод в консоль).
# Описание модели:
Использованы библиотеки:
* numpy (np): популярная библиотека для научных вычислений.
* tensorflow (tf): библиотека для тренировки нейросетей.
* Sequential: тип Keras модель которая позволяет создавать нейросети слой за слоем.
* Embedding, LSTM, Dense: различные типы слоев в нейросетях.
* Tokenizer: класс для конвертации слов в числовой понятный для нейросети формат.
<p></p>
Каждая строка текста переводится в числа с помощью Tokernizer.
Класс Tokenizer в Keras - это утилита обработки текста, которая преобразует текст в
последовательность целых чисел. Он присваивает уникальное целое число (индекс) каждому слову
в тексте и создает словарь, который сопоставляет каждое слово с соответствующим индексом.
Это позволяет вам работать с текстовыми данными в формате, который может быть передан в нейронную сеть.
Все это записывается в input_sequences.
Строим RNN модель используя Keras:
* Embedding: Этот слой превращает числа в векторы плотности фиксированного размера. Так же известного
как "word embeddings". Вложения слов - это плотные векторные представления слов в непрерывном
векторном пространстве.Они позволяют нейронной сети изучать и понимать взаимосвязи между словами
на основе их контекста в содержании текста.
* LSTM: это тип рекуррентной нейронной сети (RNN), которая предназначена для обработки
зависимостей в последовательностях.
* Dense: полносвязный слой с множеством нейронов, нейронов столько же сколько и уникальных слов.
Он выводит вероятность следующего слова.
* Модель обучаем на разном количестве эпох, по умолчанию epochs = 100 (итераций по всему набору данных).
Определеяем функцию generate_text которая принимает стартовое слово, а также, число слов для генерации.
Модель генерирует текст путем многократного предсказания следующего слова на основе предыдущих слов в
начальном тексте.
* В конце мы получаем сгенерированную на основе текста последовательность.
# Задача генерации англоязычного текста
На вход подаем историю с похожими повторяющимися слова. Историю сохраняем в файл.
Задача проверить насколько сеть не станет повторять текст, а будет действительно генерировать
относительно новый текст.
# Результаты
Тестируется английский текст, приложенный в репозитории.
* на 50 эпохах ответ на I want
* I want to soar high up in the sky like to glide through the clouds feeling the wind beneath my wings i want to fly i want to fly i want to fly i want to fly i want to fly i want to fly i want to fly i want to
* на 100 эпох ответ на I want
* I want to fly i want to soar high up in the sky like a bird to glide through the clouds feeling the wind beneath my wings i want to fly i want to fly i want to spread my wings and soar into the open sky to glide far above the
* на 150 эпохах ответ на I want
* I want to fly i want to spread my wings and soar into the open sky to glide far above the earth unbounded by gravity i want to fly i want to fly i want to fly i want to soar high up in the sky like a bird to glide through
* на 220 эпохах ответ на I want
* I want to fly i want to soar high up in the sky like a bird to glide through the clouds feeling the wind beneath my wings i want to fly i want to fly i want to fly i want to fly i want to fly i want to fly i
* На 220 эпохах результаты хуже, это произошло скорее всего из-за переобучения(грубый повтор).
* На 50 эпохах нейронная сеть плохо обучена (из 1 места плюс повтор)
* На 100 эпохах средний результат (из 2 мест)
* На 150 эпохах нейронная сеть показывает наилучший результат (из 3 разных мест без повтора)
<p>
<div>Обучение</div>
<img src="screens/img_2.png" width="650" title="Обучение">
</p>
<p>
<div>Результат</div>
<img src="screens/img_3.png" width="650" title="Результат">
</p>

View File

@ -0,0 +1,34 @@
import numpy as np
from keras.models import load_model
from keras_preprocessing.sequence import pad_sequences
from keras_preprocessing.text import Tokenizer
from antonov_dmitry_lab_7.lab7 import tokenizer, max_sequence_length
# Step 3: Load the pre-trained model
model = load_model('my_model.h5') # Replace with the actual path to your model file
# Recreate the Tokenizer and compile the model (in case the model was not compiled before saving)
with open('small.txt', 'r') as file:
text = file.read()
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
total_words = len(tokenizer.word_index) + 1
def generate_text(seed_text, next_words, model, max_sequence_length):
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 = np.argmax(model.predict(token_list), axis=-1)
output_word = ""
for word, index in tokenizer.word_index.items():
if index == predicted:
output_word = word
break
seed_text += " " + output_word
return seed_text
# Generate text using the loaded model (same as before)
generated_text = generate_text("Once upon a", 50, model, max_sequence_length)
print(generated_text)

View File

@ -0,0 +1,55 @@
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
# загрузка текста
with open('rus.txt', encoding='utf-8') as file:
text = file.read()
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
total_words = len(tokenizer.word_index) + 1
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)
max_sequence_length = max([len(x) for x in input_sequences])
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre')
predictors, labels = input_sequences[:, :-1], input_sequences[:, -1]
# создание RNN модели
model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_length - 1))
model.add(LSTM(150))
model.add(Dense(total_words, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# тренировка модели
model.fit(predictors, labels, epochs=200, verbose=1)
# генерация текста на основе модели
def generate_text(seed_text, next_words, model, max_sequence_length):
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 = np.argmax(model.predict(token_list), axis=-1)
output_word = ""
for word, index in tokenizer.word_index.items():
if index == predicted:
output_word = word
break
seed_text += " " + output_word
return seed_text
generated_text = generate_text("Я хочу", 50, model, max_sequence_length)
print(generated_text)

Binary file not shown.

View File

@ -0,0 +1,13 @@
"Я хочу летать",слушал рассказы старых пилотов. говорил маленький Макс каждый день, смотря в небо. Он рисовал птиц на листах бумаги и мечтал о крыльях, которые позволят ему подняться в воздух.
Каждый вечер, говорил маленький Макс каждый день. Макс шептал: "Я хочу летать". Он представлял себя парящим над зелеными полями и горизонтом, который казался бесконечным.
С годами, его желание не исчезло. Наоборот, оно стало все сильнее. Макс начал изучать авиацию, читал книги о пилотах и самолетах, мечтая о том дне, когда сможет взлететь.
Он посещал авиашоу и Каждый раз, когда он видел, как самолеты взмывали в небо, сердце его билось быстрее, а глаза сверкали от восторга.
Наконец, на свой двадцатый день рождения, Макс получил в подарок уроки пилотирования. Как только он впервые сел за штурвал, сердце его забилось так, словно оно само хотело взлететь.
С каждым новым уроком Макс приближался к своей мечте. Он учился управлять самолетом, понимать аэродинамику, чувствовать ветер и облака.
И вот однажды, на заключительном экзамене, Макс с уверенностью сел за штурвал. Он знал, что сейчас его мечта сбудется. Самолет начал набирать высоту, и в тот момент, когда он оторвался от земли, Макс почувствовал, что слова "Я хочу летать" стали его реальностью. Он стал пилотом.

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -0,0 +1,16 @@
I want to fly. I want to soar high up in the sky like a bird. To glide through the clouds, feeling the wind beneath my wings. I want to fly.
I imagine what it would be like, to be able to spread my arms and take off into the endless blue. To swoop and dive and twirl through the air unencumbered by gravity's pull. I want to fly.
I watch the birds outside my window, floating effortlessly on the breeze. How I wish I could join them up there. To break free of the bounds of this earth and taste the freedom of flight. I want to fly.
Over and over I dream of flying. I flap my arms but remain stuck to the ground. Still I gaze up hopefully at the sky. One day, I tell myself. One day I will fly. I want to fly.
I want to fly. I want to spread my wings and soar into the open sky. To glide far above the earth unbounded by gravity. I want to fly.
Ever since I was a child I've dreamed of flying. I would flap my arms trying in vain to take off. I envied the birds and their gift of flight. On windy days, I'd run with the breeze, hoping it would lift me up. But my feet stayed planted. Still my desire to fly remained.
As I grew up, my dreams of flying never left. I'd gaze out plane windows high above the earth and ache to sprout wings. I'd watch birds for hours wishing I could join their effortless flight. At night I'd have vivid dreams of gliding among the clouds. Then I'd awake still earthbound and sigh. My longing to fly unchanged.
I want to know what it feels like to swoop and dive through the air. To loop and twirl on the wind currents with ease. To soar untethered by gravity's grip. But I'm trapped on the ground, wings useless and weighted. Still I stare upwards hoping. Still I imagine what could be. Still I want to fly.
They say it's impossible, that humans aren't meant for flight. But I refuse to let go of this dream. I gaze up, envying the way the birds own the sky while my feet stay planted. I flap and I hope. And still I want to fly.