Upload app.py
Browse files
app.py
ADDED
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
|
3 |
+
import streamlit as st
|
4 |
+
import torch
|
5 |
+
from tensorflow.keras.preprocessing.text import tokenizer_from_json
|
6 |
+
from torch import nn
|
7 |
+
|
8 |
+
# Load the saved model and tokenizer
|
9 |
+
model_path = 'lstm_model.pth'
|
10 |
+
tokenizer_path = 'tokenizer.json'
|
11 |
+
|
12 |
+
# Load tokenizer
|
13 |
+
with open(tokenizer_path, 'r', encoding='utf-8') as f:
|
14 |
+
tokenizer_json = json.load(f)
|
15 |
+
tokenizer = tokenizer_from_json(tokenizer_json)
|
16 |
+
|
17 |
+
# Load model parameters
|
18 |
+
checkpoint = torch.load(model_path, map_location=torch.device('cpu'))
|
19 |
+
|
20 |
+
class PoetryLSTM(nn.Module):
|
21 |
+
def __init__(self, vocab_size, embedding_dim, hidden_size, num_layers, dropout=0.5):
|
22 |
+
super(PoetryLSTM, self).__init__()
|
23 |
+
self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx=0)
|
24 |
+
self.lstm = nn.LSTM(embedding_dim, hidden_size, num_layers,
|
25 |
+
batch_first=True, dropout=dropout, bidirectional=True)
|
26 |
+
self.dropout = nn.Dropout(dropout)
|
27 |
+
self.fc = nn.Linear(hidden_size * 2, vocab_size)
|
28 |
+
|
29 |
+
def forward(self, x, hidden=None):
|
30 |
+
batch_size = x.size(0)
|
31 |
+
embedded = self.dropout(self.embedding(x))
|
32 |
+
output, hidden = self.lstm(embedded, hidden)
|
33 |
+
output = self.dropout(output)
|
34 |
+
output = self.fc(output)
|
35 |
+
return output, hidden
|
36 |
+
|
37 |
+
|
38 |
+
vocab_size = checkpoint['vocab_size']
|
39 |
+
embed_size = checkpoint['embed_size']
|
40 |
+
hidden_size = checkpoint['hidden_size']
|
41 |
+
num_layers = checkpoint['num_layers']
|
42 |
+
|
43 |
+
model = PoetryLSTM(vocab_size, embed_size, hidden_size, num_layers)
|
44 |
+
model.load_state_dict(checkpoint['model_state_dict'])
|
45 |
+
model.eval()
|
46 |
+
|
47 |
+
# Utility function for poetry generation
|
48 |
+
def generate_poetry(model, input_text, tokenizer, max_length=50, temperature=0.7):
|
49 |
+
input_sequence = tokenizer.texts_to_sequences([input_text])[0]
|
50 |
+
input_tensor = torch.LongTensor(input_sequence).unsqueeze(0)
|
51 |
+
|
52 |
+
generated_sequence = input_sequence.copy()
|
53 |
+
hidden = None
|
54 |
+
recent_tokens = set()
|
55 |
+
repetition_window = 5
|
56 |
+
|
57 |
+
with torch.no_grad():
|
58 |
+
for _ in range(max_length):
|
59 |
+
output, hidden = model(input_tensor, hidden)
|
60 |
+
output = output[:, -1, :] / temperature
|
61 |
+
probabilities = torch.softmax(output, dim=-1)
|
62 |
+
for token in recent_tokens:
|
63 |
+
probabilities[0][token] *= 0.1
|
64 |
+
top_k = 10
|
65 |
+
top_probs, top_indices = torch.topk(probabilities, top_k)
|
66 |
+
predicted_token = top_indices[0][torch.multinomial(torch.softmax(top_probs, dim=-1), 1)].item()
|
67 |
+
|
68 |
+
if len(recent_tokens) >= repetition_window:
|
69 |
+
recent_tokens.pop()
|
70 |
+
recent_tokens.add(predicted_token)
|
71 |
+
|
72 |
+
generated_sequence.append(predicted_token)
|
73 |
+
input_tensor = torch.LongTensor([[predicted_token]])
|
74 |
+
|
75 |
+
if predicted_token == tokenizer.word_index.get('<END>', 0):
|
76 |
+
break
|
77 |
+
|
78 |
+
generated_words = []
|
79 |
+
for idx in generated_sequence:
|
80 |
+
word = next((word for word, index in tokenizer.word_index.items()
|
81 |
+
if index == idx), '')
|
82 |
+
if word and word not in ['<START>', '<END>', '<PAD>']:
|
83 |
+
generated_words.append(word)
|
84 |
+
|
85 |
+
return ' '.join(generated_words)
|
86 |
+
|
87 |
+
|
88 |
+
# Streamlit UI
|
89 |
+
st.title("Poetry Generation with LSTM")
|
90 |
+
st.write("Enter a prompt, adjust the sliders, and generate poetry!")
|
91 |
+
|
92 |
+
# User inputs
|
93 |
+
input_text = st.text_input("Input Text", value="aisā hai ki")
|
94 |
+
temperature = st.slider("Temperature (controls creativity)", min_value=0.1, max_value=2.0, value=0.7, step=0.1)
|
95 |
+
max_length = st.slider("Max Length", min_value=10, max_value=100, value=50, step=10)
|
96 |
+
|
97 |
+
# Generate button
|
98 |
+
if st.button("Generate Poetry"):
|
99 |
+
if input_text.strip():
|
100 |
+
predicted_text = generate_poetry(model, input_text, tokenizer, max_length=max_length, temperature=temperature)
|
101 |
+
st.subheader("Generated Poetry")
|
102 |
+
st.write(predicted_text)
|
103 |
+
else:
|
104 |
+
st.warning("Please enter some input text to generate poetry.")
|