File size: 2,210 Bytes
7299eb3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
76
77
78
79
80
81
82
83
import streamlit as st
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt

# Define the dataset
def generate_data(n_samples):
    torch.manual_seed(42)
    X = torch.randn(n_samples, 1) * 10
    y = 2 * X + 3 + torch.randn(n_samples, 1) * 3
    return X, y

# Define the linear regression model
class LinearRegressionModel(nn.Module):
    def __init__(self):
        super(LinearRegressionModel, self).__init__()
        self.linear = nn.Linear(1, 1)
        
    def forward(self, x):
        return self.linear(x)

# Train the model
def train_model(X, y, lr, epochs):
    model = LinearRegressionModel()
    criterion = nn.MSELoss()
    optimizer = optim.SGD(model.parameters(), lr=lr)
    
    for epoch in range(epochs):
        model.train()
        optimizer.zero_grad()
        outputs = model(X)
        loss = criterion(outputs, y)
        loss.backward()
        optimizer.step()
    
    return model

# Plot the results
def plot_results(X, y, model):
    plt.scatter(X.numpy(), y.numpy(), label='Original data')
    plt.plot(X.numpy(), model(X).detach().numpy(), label='Fitted line', color='r')
    plt.legend()
    plt.xlabel('X')
    plt.ylabel('y')
    st.pyplot(plt.gcf())

# Streamlit interface
st.title('Simple Linear Regression with PyTorch')
n_samples = st.slider('Number of samples', 20, 100, 50)
learning_rate = st.slider('Learning rate', 0.001, 0.1, 0.01)
epochs = st.slider('Number of epochs', 100, 1000, 500)

X, y = generate_data(n_samples)
model = train_model(X, y, learning_rate, epochs)

st.subheader('Training Data')
plot_results(X, y, model)

st.subheader('Model Parameters')
st.write(f'Weight: {model.linear.weight.item()}')
st.write(f'Bias: {model.linear.bias.item()}')

st.subheader('Loss Curve')
losses = []
model = LinearRegressionModel()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
for epoch in range(epochs):
    model.train()
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()
    losses.append(loss.item())

plt.figure()
plt.plot(range(epochs), losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
st.pyplot(plt.gcf())