Spaces:
Runtime error
Runtime error
import streamlit as st | |
import numpy as np | |
import matplotlib.pyplot as plt | |
import torch | |
import torch.nn as nn | |
import torch.optim as optim | |
# Streamlit app title | |
st.title('Simple Linear Regression with PyTorch') | |
# Sidebar sliders for noise and number of data points | |
noise_level = st.sidebar.slider('Noise Level', 0.0, 1.0, 0.1, step=0.01) | |
num_points = st.sidebar.slider('Number of Data Points', 10, 100, 50, step=5) | |
num_epochs = st.sidebar.slider('Number of Epochs', 1, 50, 10, step=1) | |
learning_rate = st.sidebar.slider('Learning Rate', 0.001, 0.1, 0.01, step=0.001) | |
# Generate data | |
np.random.seed(0) | |
x = np.linspace(0, 10, num_points) | |
y = 2 * x + 1 + noise_level * np.random.randn(num_points) | |
# Convert data to PyTorch tensors | |
x_tensor = torch.tensor(x, dtype=torch.float32).view(-1, 1) | |
y_tensor = torch.tensor(y, dtype=torch.float32).view(-1, 1) | |
# 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) | |
model = LinearRegressionModel() | |
# Define the loss function and the optimizer | |
criterion = nn.MSELoss() | |
optimizer = optim.SGD(model.parameters(), lr=learning_rate) | |
# Train the model | |
losses = [] | |
for epoch in range(num_epochs): | |
model.train() | |
optimizer.zero_grad() | |
outputs = model(x_tensor) | |
loss = criterion(outputs, y_tensor) | |
loss.backward() | |
optimizer.step() | |
losses.append(loss.item()) | |
# Get the final model parameters | |
slope = model.linear.weight.item() | |
intercept = model.linear.bias.item() | |
# Make predictions | |
model.eval() | |
y_pred_tensor = model(x_tensor) | |
y_pred = y_pred_tensor.detach().numpy() | |
# Create scatter plot with regression line | |
fig, ax = plt.subplots() | |
ax.scatter(x, y, alpha=0.6, label='Data points') | |
ax.plot(x, y_pred, color='red', label='Regression line') | |
ax.set_title('Scatter Plot with Noise and Number of Data Points') | |
ax.set_xlabel('X-axis') | |
ax.set_ylabel('Y-axis') | |
ax.legend() | |
# Display slope and intercept in Streamlit | |
st.write(f"**Slope:** {slope}") | |
st.write(f"**Intercept:** {intercept}") | |
# Display scatter plot in Streamlit | |
st.pyplot(fig) | |
# Plot training loss | |
fig_loss, ax_loss = plt.subplots() | |
ax_loss.plot(range(num_epochs), losses) | |
ax_loss.set_title('Training Loss') | |
ax_loss.set_xlabel('Epoch') | |
ax_loss.set_ylabel('Loss') | |
# Display training loss plot in Streamlit | |
st.pyplot(fig_loss) | |