File size: 2,028 Bytes
ce170e0
 
669bfbb
3907aee
669bfbb
3907aee
ce170e0
 
669bfbb
 
 
 
 
 
 
 
 
 
ce170e0
669bfbb
 
 
ce170e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
669bfbb
ce170e0
 
 
 
 
 
 
 
669bfbb
 
 
3907aee
ce170e0
 
 
 
 
669bfbb
3907aee
669bfbb
3907aee
669bfbb
3907aee
669bfbb
 
 
 
 
 
 
9adff5d
1f14473
2507325
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import torch
import torch.nn as nn
import numpy as np
import gradio as gr
from sklearn.preprocessing import MinMaxScaler

# Sequence and window size
seq = np.array([i for i in range(1, 51)])  # Sequence 1 to 50
window_size = 3

# Prepare data
x, y = [], []
for i in range(len(seq) - window_size):
    x.append(seq[i:i + window_size])
    y.append(seq[i + window_size])
x = np.array(x)
y = np.array(y)

# Normalize target
scaler = MinMaxScaler()
y = scaler.fit_transform(y.reshape(-1, 1))

# Convert to torch tensors
x_tensor = torch.tensor(x, dtype=torch.float32).unsqueeze(-1)  # (N, window, 1)
y_tensor = torch.tensor(y, dtype=torch.float32)

# Define LSTM model
class LSTMModel(nn.Module):
    def __init__(self):
        super(LSTMModel, self).__init__()
        self.lstm = nn.LSTM(input_size=1, hidden_size=50, batch_first=True)
        self.fc = nn.Linear(50, 1)

    def forward(self, x):
        out, _ = self.lstm(x)
        out = out[:, -1, :]
        return self.fc(out)

model = LSTMModel()
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)

# Train
for epoch in range(100):
    model.train()
    optimizer.zero_grad()
    outputs = model(x_tensor)
    loss = criterion(outputs, y_tensor)
    loss.backward()
    optimizer.step()

# Prediction function
def predict_next(n1, n2, n3):
    try:
        inp = torch.tensor([[n1, n2, n3]], dtype=torch.float32).unsqueeze(-1)
        model.eval()
        with torch.no_grad():
            pred = model(inp)
            pred_val = scaler.inverse_transform(pred.numpy())[0][0]
        return f"🔮 Predicted next number: {pred_val:.2f}"
    except Exception as e:
        return f"❌ Error: {str(e)}"

# Gradio UI
gr.Interface(
    fn=predict_next,
    inputs=[
        gr.Number(label="Number 1"),
        gr.Number(label="Number 2"),
        gr.Number(label="Number 3")
    ],
    outputs=gr.Text(label="Prediction"),
    title="LSTM Number Predicton",
    description="Predict the next number in a sequence using LSTM built"
).launch()