This commit is contained in:
BossMouseFire 2023-10-31 00:50:28 +04:00
parent 9613109f32
commit c344eb7300
6 changed files with 124 additions and 0 deletions

View File

@ -0,0 +1,39 @@
# Лабораторная работа №7
### Рекуррентная нейронная сеть и задача генерации текста
## ПИбд-41 Абанин Даниил
### Как запустить лабораторную работу:
* установить python, numpy, keras, tensorflow
* запустить проект (стартовая точка lab7)
### Какие технологии использовались:
* Язык программирования `Python`, библиотеки numpy, keras, tensorflow
* Среда разработки `PyCharm`
### Что делает лабораторная работа:
* На основе выбранных художественных текстов происходит обучение рекуррентной нейронной сети для решения задачи генерации.
* Необходимо подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.
### Тест
* Чтение текста из файлов .txt (eng_text.txt, rus_text.txt)
* Вызов функция get_model_data, из которой мы получаем входные, выходные данные (X, y), размер словаря и токенайзер. Используем Tokenizer с настройкой char_level=True, что позволяет упразднить использование Embedding слоя далее
* Создание объекта Sequential (последовательная рекуррентная нейронная сеть) и добавление двух слоёв LSTM. LSTM (Long Short-Term Memory) представляет собой разновидность рекуррентной нейронной сети, которая эффективно работает с последовательными данными. Использование нескольких слоёв даёт большую гибкость. Dropout — это метод регуляризации для нейронных сетей и моделей глубокого обучения, решение проблемы переобучения. Слой Dense с функцией активации softmax используется для предсказания следующего слова
* Компилирование модели с использованием sparse_categorical_crossentropy
* Обучение модели на 100 эпохах (оптимальный вариант)
* Генерация текста
Сгенерированные тексты
* ENG: I must be getting somewhere near the centre of the earth. how funny it'll seem to come out among the people that walk with their heads downward! the antipathies, i think—' (for, you see, alice had learnt several things of this
* RUS: господин осматривал свою комнату, внесены были его пожитки: прежде всего чемодан из белой кожи, несколько поистасканный, показывавший, что был не в первый раз в дороге. чемодан внесли кучер селифан отправился на конюшню вози
![Rus](result_rus.png)
![Eng](result_eng.png)
По итогу, программа способна сгенерировать осмысленный текст в каждом из случаев

View File

@ -0,0 +1,7 @@
Either the well was very deep, or she fell very slowly, for she had plenty of time as she went down to look about her and to wonder what was going to happen next. First, she tried to look down and make out what she was coming to, but it was too dark to see anything; then she looked at the sides of the well, and noticed that they were filled with cupboards and book-shelves; here and there she saw maps and pictures hung upon pegs. She took down a jar from one of the shelves as she passed; it was labelled 'ORANGE MARMALADE', but to her great disappointment it was empty: she did not like to drop the jar for fear of killing somebody, so managed to put it into one of the cupboards as she fell past it.
'Well!' thought Alice to herself, 'after such a fall as this, I shall think nothing of tumbling down stairs! How brave they'll all think me at home! Why, I wouldn't say anything about it, even if I fell off the top of the house!' (Which was very likely true.)
Down, down, down. Would the fall NEVER come to an end! 'I wonder how many miles I've fallen by this time?' she said aloud. 'I must be getting somewhere near the centre of the earth. Let me see: that would be four thousand miles down, I think—' (for, you see, Alice had learnt several things of this sort in her lessons in the schoolroom, and though this was not a VERY good opportunity for showing off her knowledge, as there was no one to listen to her, still it was good practice to say it over) '—yes, that's about the right distance—but then I wonder what Latitude or Longitude I've got to?' (Alice had no idea what Latitude was, or Longitude either, but thought they were nice grand words to say.)
Presently she began again. 'I wonder if I shall fall right THROUGH the earth! How funny it'll seem to come out among the people that walk with their heads downward! The Antipathies, I think—' (she was rather glad there WAS no one listening, this time, as it didn't sound at all the right word) '—but I shall have to ask them what the name of the country is, you know. Please, Ma'am, is this New Zealand or Australia?' (and she tried to curtsey as she spoke—fancy CURTSEYING as you're falling through the air!

View File

@ -0,0 +1,75 @@
from keras import Sequential
from keras.layers import LSTM, Dense, Dropout
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import numpy as np
with open('rus_text.txt', 'r', encoding='utf-8') as file:
text = file.read()
def create_sequences(text, seq_len):
sequences = []
next_chars = []
for i in range(0, len(text) - seq_len):
sequences.append(text[i:i + seq_len])
next_chars.append(text[i + seq_len])
return sequences, next_chars
def get_model_data(seq_length):
tokenizer = Tokenizer(char_level=True)
tokenizer.fit_on_texts([text])
token_text = tokenizer.texts_to_sequences([text])[0]
sequences, next_chars = create_sequences(token_text, seq_length)
vocab_size = len(tokenizer.word_index) + 1
x = pad_sequences(sequences, maxlen=seq_length)
y = np.array(next_chars)
return x, y, vocab_size, tokenizer
def model_build(model, vocab_size):
model.add(LSTM(256, input_shape=(seq_length, 1), return_sequences=True))
model.add(LSTM(128, input_shape=(seq_length, 1)))
model.add(Dropout(0.2, input_shape=(60,)))
model.add(Dense(vocab_size, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# Функция для генерации текста
def generate_text(seed_text, gen_length, tokenizer, model):
generated_text = seed_text
for _ in range(gen_length):
sequence = tokenizer.texts_to_sequences([seed_text])[0]
sequence = pad_sequences([sequence], maxlen=seq_length)
prediction = model.predict(sequence)[0]
predicted_index = np.argmax(prediction)
predicted_char = tokenizer.index_word[predicted_index]
generated_text += predicted_char
seed_text += predicted_char
seed_text = seed_text[1:]
return generated_text
seq_length = 10
seed_text = "господин осматривал свою"
# Создание экземпляра Tokenizer и обучение на тексте
X, y, vocab_size, tokenizer = get_model_data(seq_length)
model = Sequential()
model_build(model, vocab_size)
model.fit(X, y, epochs=100, verbose=1)
generated_text = generate_text(seed_text, 200, tokenizer, model)
print(generated_text)

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@ -0,0 +1,3 @@
В ворота гостиницы губернского города NN въехала довольно красивая рессорная небольшая бричка, в какой ездят холостяки: отставные подполковники, штабс-капитаны, помещики, имеющие около сотни душ крестьян, — словом, все те, которых называют господами средней руки. В бричке сидел господин, не красавец, но и не дурной наружности, ни слишком толст, ни слишком тонок; нельзя сказать, чтобы стар, однако ж и не так чтобы слишком молод. Въезд его не произвел в городе совершенно никакого шума и не был сопровожден ничем особенным; только два русские мужика, стоявшие у дверей кабака против гостиницы, сделали кое-какие замечания, относившиеся, впрочем, более к экипажу, чем к сидевшему в нем. «Вишь ты, — сказал один другому, — вон какое колесо! что ты думаешь, доедет то колесо, если б случилось, в Москву или не доедет?» — «Доедет», — отвечал другой. «А в Казань-то, я думаю, не доедет?» — «В Казань не доедет», — отвечал другой. Этим разговор и кончился. Да еще, когда бричка подъехала к гостинице, встретился молодой человек в белых канифасовых панталонах, весьма узких и коротких, во фраке с покушеньями на моду, из-под которого видна была манишка, застегнутая тульскою булавкою с бронзовым пистолетом. Молодой человек оборотился назад, посмотрел экипаж, придержал рукою картуз, чуть не слетевший от ветра, и пошел своей дорогой.
Когда экипаж въехал на двор, господин был встречен трактирным слугою, или половым, как их называют в русских трактирах, живым и вертлявым до такой степени, что даже нельзя было рассмотреть, какое у него было лицо. Он выбежал проворно, с салфеткой в руке, весь длинный и в длинном демикотонном сюртуке со спинкою чуть не на самом затылке, встряхнул волосами и повел проворно господина вверх по всей деревянной галдарее показывать ниспосланный ему Богом покой. Покой был известного рода, ибо гостиница была тоже известного рода, то есть именно такая, как бывают гостиницы в губернских городах, где за два рубля в сутки проезжающие получают покойную комнату с тараканами, выглядывающими, как чернослив, из всех углов, и дверью в соседнее помещение, всегда заставленную комодом, где устроивается сосед, молчаливый и спокойный человек, но чрезвычайно любопытный, интересующийся знать о всех подробностях проезжающего. Наружный фасад гостиницы отвечал ее внутренности: она была очень длинна, в два этажа; нижний не был выщекатурен и оставался в темно-красных кирпичиках, еще более потемневших от лихих погодных перемен и грязноватых уже самих по себе; верхний был выкрашен вечною желтою краскою; внизу были лавочки с хомутами, веревками и баранками. В угольной из этих лавочек, или, лучше, в окне, помещался сбитенщик с самоваром из красной меди и лицом так же красным, как самовар, так что издали можно бы подумать, что на окне стояло два самовара, если б один самовар не был с черною как смоль бородою.
Пока приезжий господин осматривал свою комнату, внесены были его пожитки: прежде всего чемодан из белой кожи, несколько поистасканный, показывавший, что был не в первый раз в дороге. Чемодан внесли кучер Селифан, низенький человек в тулупчике, и лакей Петрушка, малый лет тридцати, в просторном подержанном сюртуке, как видно с барского плеча, малый немного суровый на взгляд, с очень крупными губами и носом. Вслед за чемоданом внесен был небольшой ларчик красного дерева с штучными выкладками из карельской березы, сапожные колодки и завернутая в синюю бумагу жареная курица. Когда все это было внесено, кучер Селифан отправился на конюшню возиться около лошадей, а лакей Петрушка стал устраиваться в маленькой передней, очень темной конурке, куда уже успел притащить свою шинель и вместе с нею какой-то свой собственный запах, который был сообщен и принесенному вслед за тем мешку с разным лакейским туалетом. В этой конурке он приладил к стене узенькую трехногую кровать, накрыв ее небольшим подобием тюфяка, убитым и плоским, как блин, и, может быть, так же замаслившимся, как блин, который удалось ему вытребовать у хозяина гостиницы.