zhukova_alina_lab_7 is ready #283
120
zhukova_alina_lab_7/flask-server.py
Normal file
120
zhukova_alina_lab_7/flask-server.py
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
from sre_parse import Tokenizer
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
from flask import Flask
|
||||||
|
from keras.layers import Dense, LSTM, Embedding
|
||||||
|
from keras.models import load_model, Sequential
|
||||||
|
from keras_preprocessing.sequence import pad_sequences
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/")
|
||||||
|
def home():
|
||||||
|
return "<html>" \
|
||||||
|
"<h1>Жукова Алина ПИбд-41</h1>" \
|
||||||
|
"<h1>Лабораторная работа №7</h1>" \
|
||||||
|
"<table>" \
|
||||||
|
"<td>" \
|
||||||
|
"<form Action='http://127.0.0.1:5000/k4_1_task_7' Method=get>" \
|
||||||
|
"<input type=submit value='Генерация текста'>" \
|
||||||
|
"</form>" \
|
||||||
|
"</td>" \
|
||||||
|
"</table>" \
|
||||||
|
"</html>"
|
||||||
|
|
||||||
|
# Реккурентная нейронная сеть, генерация текста
|
||||||
|
# 10 вариант
|
||||||
|
@app.route("/k4_1_task_7", methods=['GET'])
|
||||||
|
def k4_1_task_7():
|
||||||
|
# Загрузка текста из файла
|
||||||
|
# Русский текст
|
||||||
|
# with open('lab_4_1__7_text_rus.txt', 'r', encoding='utf-8') as file:
|
||||||
|
# text = file.read()
|
||||||
|
# Анлглийский текст
|
||||||
|
with open('lab_4_1__7_text_eng.txt', 'r', encoding='utf-8') as file:
|
||||||
|
text = file.read()
|
||||||
|
|
||||||
|
# Создание Tokenizer и токенизация текста
|
||||||
|
tokenizer = Tokenizer(char_level=True)
|
||||||
|
tokenizer.fit_on_texts(text)
|
||||||
|
|
||||||
|
# Преобразование текста в последовательность чисел
|
||||||
|
sequences = tokenizer.texts_to_sequences(text)
|
||||||
|
|
||||||
|
# Подготовка обучающих данных
|
||||||
|
seq_length = 100
|
||||||
|
dataX, dataY = [], []
|
||||||
|
for i in range(0, len(sequences) - seq_length):
|
||||||
|
seq_in = sequences[i:i + seq_length]
|
||||||
|
seq_out = sequences[i + seq_length]
|
||||||
|
dataX.append(seq_in)
|
||||||
|
dataY.append(seq_out)
|
||||||
|
|
||||||
|
dataX = np.array(dataX)
|
||||||
|
dataY = np.array(dataY)
|
||||||
|
|
||||||
|
# Создание модели
|
||||||
|
vocab_size = len(tokenizer.word_index) + 1
|
||||||
|
embedding_dim = 256
|
||||||
|
rnn_units = 1024
|
||||||
|
|
||||||
|
model = Sequential()
|
||||||
|
model.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=seq_length))
|
||||||
|
model.add(LSTM(units=rnn_units))
|
||||||
|
model.add(Dense(units=vocab_size, activation='softmax'))
|
||||||
|
|
||||||
|
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')
|
||||||
|
|
||||||
|
# Загрузка модели
|
||||||
|
# РУсская модель
|
||||||
|
# model = load_model('lab_4_1__7_model.keras')
|
||||||
|
# Английская модель
|
||||||
|
model = load_model('lab_4_1__7_model_eng.keras')
|
||||||
|
print("Loaded model from disk")
|
||||||
|
|
||||||
|
|
||||||
|
# Обучение модели
|
||||||
|
# batch_size = 64
|
||||||
|
# model.fit(dataX, dataY, epochs=15, batch_size=batch_size)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_text(seed_text, gen_length):
|
||||||
|
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
|
||||||
|
|
||||||
|
# Пример использования
|
||||||
|
start_phraze = "Black cat"
|
||||||
|
# Русский
|
||||||
|
# generated_text = generate_text("Невероятный котик", 250)
|
||||||
|
# Английский
|
||||||
|
generated_text = generate_text(start_phraze, 250)
|
||||||
|
|
||||||
|
i = 10
|
||||||
|
|
||||||
|
# Сохранение модели
|
||||||
|
# Русская модель
|
||||||
|
# model.save('C:/Users/Alina/PycharmProjects/lab1/lab_4_1__7_model.keras')
|
||||||
|
# Английская модель
|
||||||
|
# model.save('C:/Users/Alina/PycharmProjects/lab1/lab_4_1__7_model_eng.keras')
|
||||||
|
# print("Saved model to disk")
|
||||||
|
|
||||||
|
return "<html>" \
|
||||||
|
"<h1></h1>" \
|
||||||
|
"<h2>Вариант 10. Задание 7 - Генерация текста</h2>" \
|
||||||
|
"<h2> Сгенерированный текст, начальная фраза " + start_phraze + ": " + str(generated_text) + " </h2>" \
|
||||||
|
"</html>"
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(debug=True)
|
BIN
zhukova_alina_lab_7/img_screen_1.png
Normal file
BIN
zhukova_alina_lab_7/img_screen_1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
zhukova_alina_lab_7/img_screen_2.png
Normal file
BIN
zhukova_alina_lab_7/img_screen_2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 19 KiB |
BIN
zhukova_alina_lab_7/img_screen_3.png
Normal file
BIN
zhukova_alina_lab_7/img_screen_3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
BIN
zhukova_alina_lab_7/img_screen_4.png
Normal file
BIN
zhukova_alina_lab_7/img_screen_4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
BIN
zhukova_alina_lab_7/img_screen_5.png
Normal file
BIN
zhukova_alina_lab_7/img_screen_5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
1
zhukova_alina_lab_7/lab_4_1__7_text_eng.txt
Normal file
1
zhukova_alina_lab_7/lab_4_1__7_text_eng.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Cats are wonderful pets that many people love. They come in different colors and sizes. Cats are known for being playful and sometimes a bit lazy. These furry friends have soft paws and sharp claws. They use their claws for various things, like scratching to keep their claws healthy and marking their territory. Cats also have a special ability to land on their feet if they fall, which is really impressive. Cats enjoy their independence. They often like to explore their surroundings and might hide in cozy spots. They clean themselves by licking their fur and are usually very clean animals. Cats like to communicate with us using different sounds, like meowing, purring, and even hissing if they’re scared. They also use their tails to show how they feel. A wagging tail might mean they’re excited, while a puffed-up tail can mean they’re scared. Playing with cats using toys like balls or strings is lots of fun, and it keeps them active. They also like to nap a lot during the day. If you’re thinking of having a cat as a pet, remember to give them love, care, and a cozy place to sleep. In short, cats are lovely pets with soft fur and sharp claws. They’re independent, playful, and great at keeping clean. Cats talk to us with sounds and tails, and they enjoy playing and napping. If you have a cat, make sure to give them care and affection. I have a cat. Her name is Matilda. She is seven years old. She is grey with a few dark spots. Matilda has green eyes. She is quite fluffy and big. When we brought Matilda home, she was a little two-month-old kitten. At first, she was scared to leave a little blanket that my mom laid for her in the kitchen. A few days later, she started to explore the surroundings. Matilda is a very smart pet. She is a bit shy and always hides somewhere when we have guests. She is very independent and likes solitude. When Matilda was a little kitten she loved to play with different toys, balls and strings. Now most of the time she spends lying on the sofa or the armchair. We buy her cat food in the shop because this is all she eats. Apart from that she is also fond of fresh cucumbers. There are two dishes for her in the kitchen. One is filled with food, and the other contains water. My cat eats three times a day and likes drinking directly from the tap. Matilda rarely shows affection. Sometimes it seems that my mom is her most loved person. She likes to climb my mom’s lap and stay there for some time. Matilda purrs when my mom strokes her. It is hard to make Matilda sit on somebody else’s lap. Nevertheless, I love Matilda very much! She is an amazing cat with immaculate manners.
|
1
zhukova_alina_lab_7/lab_4_1__7_text_rus.txt
Normal file
1
zhukova_alina_lab_7/lab_4_1__7_text_rus.txt
Normal file
File diff suppressed because one or more lines are too long
80
zhukova_alina_lab_7/readme.md
Normal file
80
zhukova_alina_lab_7/readme.md
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
## Задание
|
||||||
|
Рекуррентная нейронная сеть и задача генерации текста
|
||||||
|
Выбрать тексты на русском и английском языках.
|
||||||
|
Обучить нейронную сеть и подобрать параметры таким образом,
|
||||||
|
чтобы максимально приблизиться к осмысленному результату.
|
||||||
|
Интерпретировать результаты
|
||||||
|
|
||||||
|
Вариант №10
|
||||||
|
|
||||||
|
## Используемые технологии
|
||||||
|
В лабораторной были использованы библиотеки:
|
||||||
|
+ keras - используется для работы с реккурентной нейронной сетью и методами машинного обучения
|
||||||
|
+ numpy - позволяет работать с массивами и матрицами
|
||||||
|
+ Flask - предоставляет способ быстрого создания веб-страниц для визуализации работы приложения
|
||||||
|
|
||||||
|
## Используемые компоненты
|
||||||
|
+ Tokenizer - инструмент для токенизации текста, подсчитывает частоту вхождения слов
|
||||||
|
+ Sequential - предоставляет линейный набор слоев нейронной сети
|
||||||
|
+ Embedding - слой keras, который преобразует целочисленный последовательности
|
||||||
|
в плотные векторы
|
||||||
|
+ LSTM - представляет особую структуру реккурентной нейронной сети,
|
||||||
|
способную к обучению долговременными зависимостями
|
||||||
|
+ Dense - предоставляет плотные(полносвязные) слои нейросети
|
||||||
|
|
||||||
|
## Как запустить
|
||||||
|
Запустить файл flask-server, который поднимет локальный сервер
|
||||||
|
и позволит обратиться к программе через браузер по ссылке [http://127.0.0.1:5000/](http://127.0.0.1:5000/)
|
||||||
|
|
||||||
|
## Что делает программа
|
||||||
|
В зависимости от параметров в коде, обучается и генерирует русский или английский текст.
|
||||||
|
В первую очередь считанный из файла текст проходит токенизацию, строится модель нейронной сети.
|
||||||
|
Далее полученная реккурентная нейронная сеть обучается, а после генерирует 250 символов
|
||||||
|
исходя из начальной фразы
|
||||||
|
|
||||||
|
## Анализ
|
||||||
|
|
||||||
|
Наиболее качественные результаты модель предоставляет при 15 итерациях обучения.
|
||||||
|
Если итераций недостаточно, модель генерирует не слова, а одно и то же сочетание букв,
|
||||||
|
разделяя сочетания пробелами.
|
||||||
|
|
||||||
|
На 15 итерациях с текстом величиной в 3 400 знаков, время обучения составило около 5-6 часов.
|
||||||
|
Потому в программе реализованы функции сохранения и загрузки моделей, чтобы не обучать нейросетей заново,
|
||||||
|
а дообучать на тех же или новых данных.
|
||||||
|
|
||||||
|
На выбранной архитектуре сети при введении новых данных качество работы модели значительно снижалось.
|
||||||
|
При работе на одних и тех же данных выполнение 15 итераций достаточно, чтобы сеть могла генерировать
|
||||||
|
слова из текста. Однако осмысленного текста добиться не удалось. Очевидно это связано с
|
||||||
|
выбранной архитектурой, нехватке данных и недостаточном обучении. Можно сделать вывод о том,
|
||||||
|
что обучить нейросеть генерировать осмысленный текст на имеющейся аппаратуре если и возможно,
|
||||||
|
то очень затратно.
|
||||||
|
|
||||||
|
## Скриншоты работы программы
|
||||||
|
|
||||||
|
**Наилучший результат генерации русского текста.**
|
||||||
|
|
||||||
|
Генерация русского текста при достаточном обучении. Почти все сгенерированные слова являются реальными.
|
||||||
|
Однако полученный текст все же нельзя назвать осмысленным
|
||||||
|
![img.png](img_screen_2.png)
|
||||||
|
|
||||||
|
**Остальные варианты**
|
||||||
|
|
||||||
|
Генерация русского текста при недостаточном обучении. Вместо слов создаются сочетания букв,
|
||||||
|
которые очень быстро зацикливаются.
|
||||||
|
![img.png](img_screen_1.png)
|
||||||
|
|
||||||
|
Генерация русского текста при переобучении. Нейросеть не генерирует новый текст, она переписывает
|
||||||
|
фрагмент из обучающих данных.
|
||||||
|
![img.png](img_screen_3.png)
|
||||||
|
|
||||||
|
В случае с английским текстом все происходит точно также.
|
||||||
|
|
||||||
|
**Наилучший результат генерации английского текста.**
|
||||||
|
|
||||||
|
Генерация английского текста при достаточном обучении. Почти все сгенерированные слова являются реальными.
|
||||||
|
Однако полученный текст все же нельзя назвать осмысленным
|
||||||
|
![img.png](img_screen_4.png)
|
||||||
|
|
||||||
|
При генерации английских текстов зацикление происходит быстрее. Возможно
|
||||||
|
это связано с меньшим количеством используемых символов.
|
||||||
|
![img.png](img_screen_5.png)
|
Loading…
Reference in New Issue
Block a user