Spaces:
Sleeping
Sleeping
| 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) |