From 697b10b57f55fdaffc14f3989fa1b2bd122c2f03 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:50:16 +0000 Subject: [PATCH 1/9] feat: Updated src/main.py --- src/main.py | 101 ++++++++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/src/main.py b/src/main.py index 243a31e..1f5468b 100644 --- a/src/main.py +++ b/src/main.py @@ -1,48 +1,55 @@ -from PIL import Image -import torch -import torch.nn as nn -import torch.optim as optim -from torchvision import datasets, transforms -from torch.utils.data import DataLoader -import numpy as np - -# Step 1: Load MNIST Data and Preprocess -transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.5,), (0.5,)) -]) - -trainset = datasets.MNIST('.', download=True, train=True, transform=transform) -trainloader = DataLoader(trainset, batch_size=64, shuffle=True) - -# Step 2: Define the PyTorch Model -class Net(nn.Module): +class MNISTTrainer: def __init__(self): - super().__init__() - self.fc1 = nn.Linear(28 * 28, 128) - self.fc2 = nn.Linear(128, 64) - self.fc3 = nn.Linear(64, 10) - - def forward(self, x): - x = x.view(-1, 28 * 28) - x = nn.functional.relu(self.fc1(x)) - x = nn.functional.relu(self.fc2(x)) - x = self.fc3(x) - return nn.functional.log_softmax(x, dim=1) - -# Step 3: Train the Model -model = Net() -optimizer = optim.SGD(model.parameters(), lr=0.01) -criterion = nn.NLLLoss() - -# Training loop -epochs = 3 -for epoch in range(epochs): - for images, labels in trainloader: - optimizer.zero_grad() - output = model(images) - loss = criterion(output, labels) - loss.backward() - optimizer.step() - -torch.save(model.state_dict(), "mnist_model.pth") \ No newline at end of file + self.transform = transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize((0.5,), (0.5,)) + ]) + self.trainset = None + self.trainloader = None + self.model = None + self.optimizer = None + self.criterion = nn.NLLLoss() + self.epochs = 3 + + def load_data(self): + self.trainset = datasets.MNIST('.', download=True, train=True, transform=self.transform) + self.trainloader = DataLoader(self.trainset, batch_size=64, shuffle=True) + + class Net(nn.Module): + def __init__(self): + super().__init__() + self.fc1 = nn.Linear(28 * 28, 128) + self.fc2 = nn.Linear(128, 64) + self.fc3 = nn.Linear(64, 10) + + def forward(self, x): + x = x.view(-1, 28 * 28) + x = nn.functional.relu(self.fc1(x)) + x = nn.functional.relu(self.fc2(x)) + x = self.fc3(x) + return nn.functional.log_softmax(x, dim=1) + + def define_model(self): + self.model = self.Net() + self.optimizer = optim.SGD(self.model.parameters(), lr=0.01) + + def train(self): + for epoch in range(self.epochs): + for images, labels in self.trainloader: + self.optimizer.zero_grad() + output = self.model(images) + loss = self.criterion(output, labels) + loss.backward() + self.optimizer.step() + + def save_model(self, path="mnist_model.pth"): + torch.save(self.model.state_dict(), path) + + def load_model(self, path="mnist_model.pth"): + self.model.load_state_dict(torch.load(path)) + +trainer = MNISTTrainer() +trainer.load_data() +trainer.define_model() +trainer.train() +trainer.save_model() \ No newline at end of file From d38d1e0347161d5dc924d227d9d7255be4252d44 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:53:12 +0000 Subject: [PATCH 2/9] feat: Updated src/api.py --- src/api.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/api.py b/src/api.py index 36c257a..897bc71 100644 --- a/src/api.py +++ b/src/api.py @@ -4,9 +4,10 @@ from torchvision import transforms from main import Net # Importing Net class from main.py -# Load the model -model = Net() -model.load_state_dict(torch.load("mnist_model.pth")) +# Instantiate the trainer and load the model +trainer = MNISTTrainer() +trainer.load_model("mnist_model.pth") +model = trainer.model model.eval() # Transform used for preprocessing the image From dc58ea817f62a17461d29b422689a34627558a65 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:55:36 +0000 Subject: [PATCH 3/9] feat: Updated src/main.py --- src/main.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main.py b/src/main.py index 1f5468b..21f61d7 100644 --- a/src/main.py +++ b/src/main.py @@ -1,3 +1,9 @@ +import torch +import torch.nn as nn +import torch.optim as optim +from torchvision import datasets, transforms +from torch.utils.data import DataLoader + class MNISTTrainer: def __init__(self): self.transform = transforms.Compose([ From 53172024dd264a76ecb2a7a154299b36defac9aa Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:56:19 +0000 Subject: [PATCH 4/9] Sandbox run src/main.py --- src/main.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main.py b/src/main.py index 21f61d7..9fbebe9 100644 --- a/src/main.py +++ b/src/main.py @@ -1,15 +1,15 @@ import torch import torch.nn as nn import torch.optim as optim -from torchvision import datasets, transforms from torch.utils.data import DataLoader +from torchvision import datasets, transforms + class MNISTTrainer: def __init__(self): - self.transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.5,), (0.5,)) - ]) + self.transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))] + ) self.trainset = None self.trainloader = None self.model = None @@ -18,7 +18,9 @@ def __init__(self): self.epochs = 3 def load_data(self): - self.trainset = datasets.MNIST('.', download=True, train=True, transform=self.transform) + self.trainset = datasets.MNIST( + ".", download=True, train=True, transform=self.transform + ) self.trainloader = DataLoader(self.trainset, batch_size=64, shuffle=True) class Net(nn.Module): @@ -54,8 +56,9 @@ def save_model(self, path="mnist_model.pth"): def load_model(self, path="mnist_model.pth"): self.model.load_state_dict(torch.load(path)) + trainer = MNISTTrainer() trainer.load_data() trainer.define_model() trainer.train() -trainer.save_model() \ No newline at end of file +trainer.save_model() From 118b8de59cb782b4fec2a0128d321dc2607a70fe Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:59:18 +0000 Subject: [PATCH 5/9] feat: Updated src/api.py --- src/api.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/api.py b/src/api.py index 897bc71..89d48a6 100644 --- a/src/api.py +++ b/src/api.py @@ -5,9 +5,8 @@ from main import Net # Importing Net class from main.py # Instantiate the trainer and load the model -trainer = MNISTTrainer() -trainer.load_model("mnist_model.pth") -model = trainer.model +model = Net() +model.load_state_dict(torch.load("mnist_model.pth")) model.eval() # Transform used for preprocessing the image @@ -19,7 +18,9 @@ app = FastAPI() @app.post("/predict/") -async def predict(file: UploadFile = File(...)): +async def predict(file: UploadFile = None): + if file is None: + file = File(...) image = Image.open(file.file).convert("L") image = transform(image) image = image.unsqueeze(0) # Add batch dimension From 69f1358298c4ef6462e875b375bf367234b4faa6 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 07:00:04 +0000 Subject: [PATCH 6/9] Sandbox run src/api.py --- src/api.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/api.py b/src/api.py index 89d48a6..972c33c 100644 --- a/src/api.py +++ b/src/api.py @@ -1,7 +1,8 @@ -from fastapi import FastAPI, UploadFile, File -from PIL import Image import torch +from fastapi import FastAPI, File, UploadFile +from PIL import Image from torchvision import transforms + from main import Net # Importing Net class from main.py # Instantiate the trainer and load the model @@ -10,13 +11,13 @@ model.eval() # Transform used for preprocessing the image -transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.5,), (0.5,)) -]) +transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))] +) app = FastAPI() + @app.post("/predict/") async def predict(file: UploadFile = None): if file is None: From 396de5589be4f29cef40fc1e8e0158e9070fc931 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 07:05:12 +0000 Subject: [PATCH 7/9] feat: Updated src/api.py --- src/api.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/api.py b/src/api.py index 972c33c..86e6782 100644 --- a/src/api.py +++ b/src/api.py @@ -6,9 +6,8 @@ from main import Net # Importing Net class from main.py # Instantiate the trainer and load the model -model = Net() -model.load_state_dict(torch.load("mnist_model.pth")) -model.eval() +trainer = MNISTTrainer() +model = trainer.load_model("mnist_model.pth") # Transform used for preprocessing the image transform = transforms.Compose( From fb10aaac5cc4ae644edcb5b2323b58f9e7f7f12e Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 07:08:34 +0000 Subject: [PATCH 8/9] feat: Updated src/main.py --- src/main.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main.py b/src/main.py index 9fbebe9..9ed7659 100644 --- a/src/main.py +++ b/src/main.py @@ -53,8 +53,18 @@ def train(self): def save_model(self, path="mnist_model.pth"): torch.save(self.model.state_dict(), path) - def load_model(self, path="mnist_model.pth"): - self.model.load_state_dict(torch.load(path)) + def evaluate_model(self, validation_loader): + correct = 0 + total = 0 + with torch.no_grad(): + for data in validation_loader: + images, labels = data + outputs = self.model(images) + _, predicted = torch.max(outputs.data, 1) + total += labels.size(0) + correct += (predicted == labels).sum().item() + print('Accuracy of the network on the validation images: %d %%' % ( + 100 * correct / total)) trainer = MNISTTrainer() From 4531ad9a81e45715cdd07c4c53d28b0a592ccd14 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Thu, 19 Oct 2023 07:09:20 +0000 Subject: [PATCH 9/9] Sandbox run src/main.py --- src/main.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.py b/src/main.py index 9ed7659..e7d4f35 100644 --- a/src/main.py +++ b/src/main.py @@ -63,8 +63,10 @@ def evaluate_model(self, validation_loader): _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() - print('Accuracy of the network on the validation images: %d %%' % ( - 100 * correct / total)) + print( + "Accuracy of the network on the validation images: %d %%" + % (100 * correct / total) + ) trainer = MNISTTrainer()