NoorAfaqi commited on
Commit
105c877
·
verified ·
1 Parent(s): c8de04d

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +104 -0
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.")