ankush-003's picture
updated to dark mode
b7db333
Raw History Blame Contribute Delete
3.41 kB
import torch
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import time
from tqdm.notebook import tqdm_notebook
import plotly.express as px
import plotly.graph_objects as go
import gradio as gr
def get_error(data, a, b):
n = data.size()[0]
y_pred = a * data[:,0] + b
#return (1 / (2 * n)) * ((y_pred - data[:,-1]) ** 2).sum().item()
return (1 / 2) * torch.mean((y_pred - data[:,-1]) ** 2).item()
def get_grads(data, a, b, alpha):
n = data.size()[0]
y_pred = a * data[:,0] + b
#grad_a = (alpha / n) * ((y_pred - data[:,-1])* data[:,0]).sum().item()
grad_a = alpha * torch.mean((y_pred - data[:,-1])* data[:,0]).item()
#grad_b = (alpha / n) * (y_pred - data[:,-1]).sum().item()
grad_b = alpha * torch.mean((y_pred - data[:,-1])* data[:,0]).item()
return (grad_a, grad_b)
def train(data, alpha=0.0001, epochs=500, test_data=[1,2,3]):
tensors = torch.from_numpy(data.astype(np.float64))
print(f"dataset:{tensors}, size:{tensors.size()}")
a = 1
b = 1
errors = []
updated_a = []
updated_b = []
for i in tqdm_notebook(range(int(epochs)), desc=f"Epoch: "):
errors.append(get_error(tensors, a, b))
grad_a_temp, grad_b_temp = get_grads(tensors, a, b, alpha)
updated_a.append(a)
updated_b.append(b)
a -= grad_a_temp
b -= grad_b_temp
#print(f"Epoch: {i} -> Theta0: {updated_b[i]} Theta1: {updated_a[i]}, Error: {errors[i]} \n")
y_pred = a * tensors[:,0] + b
fig1 = px.scatter(x=tensors[:, 0], y=tensors[:, -1], template="plotly_dark")
fig2 = px.line(x=tensors[:, 0], y=y_pred, template="plotly_dark")
fig3 = go.Figure(data=fig1.data + fig2.data)
fig3.update_layout(
#title="Best Fit Line",
xaxis_title="X",
yaxis_title="Y",
template="plotly_dark"
)
fig4 = px.line(errors, template="plotly_dark")
fig4.update_traces(line_color='orange')
fig4.update_layout(
#title="Learning Curve",
xaxis_title="Epoch",
yaxis_title="Error",
showlegend=False
)
y_pred_test = a * test_data.astype(np.float64) + b
return f"{round(updated_a[-1],3)} * X + {round(updated_b[-1],3)}",fig3, fig4, np.concatenate((test_data.astype(np.float64), y_pred_test), axis=1)
# gradio app
input_elements = [
gr.Numpy(
value=[[40,9],[30,8.5],[25,8],[20,7],[10,6],[5,8]],
datatype="number",
row_count=(6,"dynamic"),
col_count=(2, "fixed"),
label="Dataset",
interactive=True
),
gr.Number(label="Learning Rate", value=0.0001, interactive=True),
gr.Number(label="Number of epochs", value=500, interactive=True),
gr.Numpy(
value=[[10],[20],[30]],
datatype="number",
row_count=3,
col_count=(1,"fixed"),
label="Test Dataset",
interactive=True
)
]
output_elements = [
gr.Textbox(label="Generated Model", placeholder="Model Equation: a * X + b"),
gr.Plot(label="Best Fit Line"),
gr.Plot(label="Learning Curve"),
gr.Numpy(label="Model Predictions")
]
app = gr.Interface(
title="Linear Regression using Pytorch",
#description="a simple app to demonstrate linear regression",
fn=train,
inputs=input_elements,
outputs=output_elements,
allow_flagging="never"
)
app.launch(debug=True)