eaglelandsonce commited on
Commit
8462f4c
·
verified ·
1 Parent(s): 829c774

Create 19_RNN_Shakespeare.py

Browse files
Files changed (1) hide show
  1. pages/19_RNN_Shakespeare.py +104 -0
pages/19_RNN_Shakespeare.py ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import torch
3
+ import torch.nn as nn
4
+ import torch.optim as optim
5
+ import numpy as np
6
+
7
+ # Define the RNN or LSTM Model
8
+ class LSTMModel(nn.Module):
9
+ def __init__(self, input_size, hidden_size, output_size, num_layers):
10
+ super(LSTMModel, self).__init__()
11
+ self.hidden_size = hidden_size
12
+ self.num_layers = num_layers
13
+ self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
14
+ self.fc = nn.Linear(hidden_size, output_size)
15
+
16
+ def forward(self, x, h):
17
+ out, h = self.lstm(x, h)
18
+ out = self.fc(out[:, -1, :])
19
+ return out, h
20
+
21
+ # Text generation function
22
+ def generate_text(model, start_str, length, char_to_int, int_to_char, num_layers, hidden_size):
23
+ model.eval()
24
+ input_seq = [char_to_int[c] for c in start_str]
25
+ input_seq = torch.tensor(input_seq, dtype=torch.float32).unsqueeze(0).unsqueeze(-1)
26
+ h = (torch.zeros(num_layers, 1, hidden_size), torch.zeros(num_layers, 1, hidden_size))
27
+ generated_text = start_str
28
+
29
+ for _ in range(length):
30
+ output, h = model(input_seq, h)
31
+ _, predicted = torch.max(output, 1)
32
+ predicted_char = int_to_char[predicted.item()]
33
+ generated_text += predicted_char
34
+ input_seq = torch.tensor([[char_to_int[predicted_char]]], dtype=torch.float32).unsqueeze(0).unsqueeze(-1)
35
+
36
+ return generated_text
37
+
38
+ # Streamlit interface
39
+ st.title("RNN/LSTM Text Generation")
40
+
41
+ # Inputs
42
+ text_data = st.text_area("Enter your text data for training:")
43
+ start_string = st.text_input("Enter the start string for text generation:")
44
+ seq_length = st.number_input("Sequence length:", min_value=10, value=100)
45
+ hidden_size = st.number_input("Hidden size:", min_value=50, value=256)
46
+ num_layers = st.number_input("Number of layers:", min_value=1, value=2)
47
+ learning_rate = st.number_input("Learning rate:", min_value=0.0001, value=0.003, format="%.4f")
48
+ num_epochs = st.number_input("Number of epochs:", min_value=1, value=20)
49
+ generate_length = st.number_input("Generated text length:", min_value=50, value=500)
50
+
51
+ if st.button("Train and Generate"):
52
+ # Data Preparation
53
+ text = text_data
54
+ chars = sorted(list(set(text)))
55
+ char_to_int = {c: i for i, c in enumerate(chars)}
56
+ int_to_char = {i: c for i, c in enumerate(chars)}
57
+
58
+ # Prepare input-output pairs
59
+ dataX = []
60
+ dataY = []
61
+ for i in range(0, len(text) - seq_length):
62
+ seq_in = text[i:i + seq_length]
63
+ seq_out = text[i + seq_length]
64
+ dataX.append([char_to_int[char] for char in seq_in])
65
+ dataY.append(char_to_int[seq_out])
66
+
67
+ X = np.reshape(dataX, (len(dataX), seq_length, 1))
68
+ X = X / float(len(chars))
69
+ Y = np.eye(len(chars))[dataY]
70
+
71
+ # Convert to PyTorch tensors
72
+ X_tensor = torch.tensor(X, dtype=torch.float32)
73
+ Y_tensor = torch.tensor(dataY, dtype=torch.long)
74
+
75
+ # Model initialization
76
+ model = LSTMModel(input_size=1, hidden_size=hidden_size, output_size=len(chars), num_layers=num_layers)
77
+
78
+ # Loss and optimizer
79
+ criterion = nn.CrossEntropyLoss()
80
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
81
+
82
+ # Training the model
83
+ for epoch in range(num_epochs):
84
+ h = (torch.zeros(num_layers, X_tensor.size(0), hidden_size), torch.zeros(num_layers, X_tensor.size(0), hidden_size))
85
+ for i in range(0, X_tensor.size(0), seq_length):
86
+ inputs = X_tensor[i:i + seq_length]
87
+ targets = Y_tensor[i:i + seq_length]
88
+
89
+ # Forward pass
90
+ outputs, h = model(inputs, h)
91
+ h = (h[0].detach(), h[1].detach())
92
+ loss = criterion(outputs, targets)
93
+
94
+ # Backward pass and optimization
95
+ optimizer.zero_grad()
96
+ loss.backward()
97
+ optimizer.step()
98
+
99
+ st.write(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
100
+
101
+ # Text generation
102
+ generated_text = generate_text(model, start_string, generate_length, char_to_int, int_to_char, num_layers, hidden_size)
103
+ st.subheader("Generated Text")
104
+ st.write(generated_text)