Merge pull request 'volkov_rafael_lab_7 is done' (#256) from volkov_rafael_lab_7 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/256
This commit is contained in:
commit
b67e86d28f
87
volkov_rafael_lab_7/app.py
Normal file
87
volkov_rafael_lab_7/app.py
Normal file
@ -0,0 +1,87 @@
|
||||
import numpy as np
|
||||
import tensorflow as tf
|
||||
from keras.models import Sequential
|
||||
from keras.layers import Embedding, LSTM, Dense
|
||||
from flask import Flask, request, jsonify, render_template
|
||||
|
||||
def load_and_preprocess_data(file_path, seq_length=100, step=3):
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
text = file.read()
|
||||
|
||||
chars = sorted(set(text))
|
||||
char_to_idx = {char: idx for idx, char in enumerate(chars)}
|
||||
idx_to_char = {idx: char for idx, char in enumerate(chars)}
|
||||
|
||||
sequences, next_chars = [], []
|
||||
|
||||
for i in range(0, len(text) - seq_length, step):
|
||||
seq = text[i:i + seq_length]
|
||||
target = text[i + seq_length]
|
||||
sequences.append(seq)
|
||||
next_chars.append(target)
|
||||
|
||||
X = np.zeros((len(sequences), seq_length), dtype=np.int32)
|
||||
y = np.zeros((len(sequences),), dtype=np.int32)
|
||||
|
||||
for i, seq in enumerate(sequences):
|
||||
for t, char in enumerate(seq):
|
||||
X[i, t] = char_to_idx[char]
|
||||
y[i] = char_to_idx[next_chars[i]]
|
||||
|
||||
return X, y, len(chars), char_to_idx, idx_to_char
|
||||
|
||||
def build_model(seq_length, num_chars):
|
||||
model = Sequential([
|
||||
Embedding(num_chars, 50, input_length=seq_length),
|
||||
LSTM(128),
|
||||
Dense(num_chars, activation='softmax')
|
||||
])
|
||||
|
||||
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
|
||||
|
||||
return model
|
||||
|
||||
def train_model(model, X, y, epochs=100, batch_size=128):
|
||||
model.fit(X, y, epochs=epochs, batch_size=batch_size)
|
||||
|
||||
def generate_text(seed_text, model, seq_length, char_to_idx, idx_to_char, length=100, temperature=1.0):
|
||||
generated_text = seed_text
|
||||
for _ in range(length):
|
||||
x = np.zeros((1, seq_length), dtype=np.int32)
|
||||
for t, char in enumerate(seed_text):
|
||||
x[0, t] = char_to_idx[char]
|
||||
preds = model.predict(x, verbose=0)[0][-1]
|
||||
preds = np.log(preds) / temperature
|
||||
exp_preds = np.exp(preds)
|
||||
preds = exp_preds / np.sum(exp_preds)
|
||||
next_index = np.random.choice(len(preds), p=preds)
|
||||
next_char = idx_to_char[next_index]
|
||||
generated_text += next_char
|
||||
seed_text = seed_text[1:] + next_char
|
||||
return generated_text
|
||||
|
||||
def create_flask_app(model, seq_length, char_to_idx, idx_to_char):
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
|
||||
@app.route('/generate_text', methods=['POST'])
|
||||
def generate_text_endpoint():
|
||||
data = request.get_json()
|
||||
seed_text = data.get('seed_text', '')
|
||||
generated_text = generate_text(seed_text, model, seq_length, char_to_idx, idx_to_char)
|
||||
return jsonify({'generated_text': generated_text})
|
||||
|
||||
return app
|
||||
|
||||
if __name__ == '__main__':
|
||||
file_path = 'your_text_file.txt'
|
||||
X, y, num_chars, char_to_idx, idx_to_char = load_and_preprocess_data(file_path)
|
||||
seq_length = 100
|
||||
model = build_model(seq_length, num_chars)
|
||||
train_model(model, X, y, epochs=100, batch_size=128)
|
||||
|
||||
flask_app = create_flask_app(model, seq_length, char_to_idx, idx_to_char)
|
||||
flask_app.run(port=5000)
|
25
volkov_rafael_lab_7/readme.md
Normal file
25
volkov_rafael_lab_7/readme.md
Normal file
@ -0,0 +1,25 @@
|
||||
Общее задание:
|
||||
Выбрать художественный текст (четные варианты – русскоязычный, нечетные – англоязычный) и обучить на нем рекуррентную нейронную сеть
|
||||
для решения задачи генерации. Подобрать архитектуру и параметры так,чтобы приблизиться к максимально осмысленному результату. Далее
|
||||
разбиться на пары четный-нечетный вариант, обменяться разработанными сетями и проверить, как архитектура товарища справляется с вашим текстом. В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов.
|
||||
|
||||
Задание по вариантам:
|
||||
четный вариант, художественный русскоязычный текст
|
||||
|
||||
Запуск через файл app.py
|
||||
|
||||
Технологии:
|
||||
|
||||
Язык программирования: Python
|
||||
Библиотеки: TensorFlow, Keras, Flask
|
||||
Фронтенд: HTML, JavaScript
|
||||
Описание работы программы:
|
||||
Программа реализует генерацию текста с использованием рекуррентных нейронных сетей (RNN) с помощью библиотек TensorFlow и Keras. Flask используется для создания веб-приложения, которое взаимодействует с моделью RNN. Пользователь вводит начальный текст (seed text) через веб-интерфейс, после чего программа отправляет запрос на сервер, который в свою очередь использует модель для генерации следующего участка текста, основываясь на введенном начальном тексте.
|
||||
|
||||
Входные данные:
|
||||
|
||||
Текстовый файл (например, 'your_text_file.txt'), содержащий обучающие данные.
|
||||
Веб-интерфейс для ввода начального текста.
|
||||
Выходные данные:
|
||||
|
||||
Сгенерированный текст, отображаемый в веб-интерфейсе.
|
80
volkov_rafael_lab_7/templates/index.html
Normal file
80
volkov_rafael_lab_7/templates/index.html
Normal file
@ -0,0 +1,80 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>RNN Text Generation</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
|
||||
text-align: center;
|
||||
margin: 50px;
|
||||
background-color: #f5f5f5;
|
||||
}
|
||||
|
||||
h1 {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
label {
|
||||
display: block;
|
||||
margin-top: 20px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
#seed_text {
|
||||
padding: 8px;
|
||||
font-size: 16px;
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: #4caf50;
|
||||
color: white;
|
||||
padding: 10px 20px;
|
||||
font-size: 16px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
background-color: #45a049;
|
||||
}
|
||||
|
||||
#output {
|
||||
margin-top: 20px;
|
||||
font-size: 18px;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>RNN Text Generation</h1>
|
||||
<label for="seed_text">Seed Text:</label>
|
||||
<input type="text" id="seed_text" placeholder="Enter your seed text">
|
||||
<button onclick="generateText()">Generate Text</button>
|
||||
<div id="output"></div>
|
||||
|
||||
<script>
|
||||
function generateText() {
|
||||
const seedText = document.getElementById("seed_text").value;
|
||||
|
||||
fetch('http://127.0.0.1:5000/generate_text', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({ seed_text: seedText }),
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById("output").innerText = data.generated_text;
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
2413
volkov_rafael_lab_7/your_text_file.txt
Normal file
2413
volkov_rafael_lab_7/your_text_file.txt
Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user