From 2eb5130a527609e51f9acd0f619b459c5faabc6e Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:31:59 +0000 Subject: [PATCH 1/7] feat: Add CNN class and training functions in cnn. --- src/cnn.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/cnn.py diff --git a/src/cnn.py b/src/cnn.py new file mode 100644 index 0000000..64769e5 --- /dev/null +++ b/src/cnn.py @@ -0,0 +1,56 @@ +import torch +import torch.nn as nn +import torch.optim as optim +from torchvision import datasets, transforms +from torch.utils.data import DataLoader + +class CNN(nn.Module): + def __init__(self): + super(CNN, self).__init__() + self.conv1 = nn.Conv2d(1, 32, kernel_size=5) + self.conv2 = nn.Conv2d(32, 64, kernel_size=5) + self.fc1 = nn.Linear(4*4*64, 1024) + self.fc2 = nn.Linear(1024, 10) + + def forward(self, x): + x = nn.functional.relu(self.conv1(x)) + x = nn.functional.max_pool2d(x, 2) + x = nn.functional.relu(self.conv2(x)) + x = nn.functional.max_pool2d(x, 2) + x = x.view(-1, 4*4*64) + x = nn.functional.relu(self.fc1(x)) + x = self.fc2(x) + return nn.functional.log_softmax(x, dim=1) + +def load_data(): + 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) + return trainloader + +def train(model, trainloader): + optimizer = optim.SGD(model.parameters(), lr=0.01) + criterion = nn.NLLLoss() + + 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_cnn_model.pth") + +def main(): + model = CNN() + trainloader = load_data() + train(model, trainloader) + +if __name__ == "__main__": + main() From 07ebf9e8ca67c254853ca6432b4b25f499bb6402 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:34:34 +0000 Subject: [PATCH 2/7] Sandbox run src/cnn.py --- src/cnn.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/cnn.py b/src/cnn.py index 64769e5..797b013 100644 --- a/src/cnn.py +++ b/src/cnn.py @@ -1,15 +1,16 @@ 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 CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=5) self.conv2 = nn.Conv2d(32, 64, kernel_size=5) - self.fc1 = nn.Linear(4*4*64, 1024) + self.fc1 = nn.Linear(4 * 4 * 64, 1024) self.fc2 = nn.Linear(1024, 10) def forward(self, x): @@ -17,27 +18,28 @@ def forward(self, x): x = nn.functional.max_pool2d(x, 2) x = nn.functional.relu(self.conv2(x)) x = nn.functional.max_pool2d(x, 2) - x = x.view(-1, 4*4*64) + x = x.view(-1, 4 * 4 * 64) x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return nn.functional.log_softmax(x, dim=1) + def load_data(): - transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.5,), (0.5,)) - ]) + transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))] + ) - trainset = datasets.MNIST('.', download=True, train=True, transform=transform) + trainset = datasets.MNIST(".", download=True, train=True, transform=transform) trainloader = DataLoader(trainset, batch_size=64, shuffle=True) return trainloader + def train(model, trainloader): optimizer = optim.SGD(model.parameters(), lr=0.01) criterion = nn.NLLLoss() epochs = 3 - for epoch in range(epochs): + for _epoch in range(epochs): for images, labels in trainloader: optimizer.zero_grad() output = model(images) @@ -47,10 +49,12 @@ def train(model, trainloader): torch.save(model.state_dict(), "mnist_cnn_model.pth") + def main(): model = CNN() trainloader = load_data() train(model, trainloader) + if __name__ == "__main__": main() From 24f94a89adb9bca3a30d1dd2091747306a3e1354 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:35:42 +0000 Subject: [PATCH 3/7] feat: Updated src/main.py --- src/main.py | 32 ++++---------------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/src/main.py b/src/main.py index 243a31e..b56d25f 100644 --- a/src/main.py +++ b/src/main.py @@ -5,6 +5,7 @@ from torchvision import datasets, transforms from torch.utils.data import DataLoader import numpy as np +from cnn import CNN # Step 1: Load MNIST Data and Preprocess transform = transforms.Compose([ @@ -16,33 +17,8 @@ trainloader = DataLoader(trainset, batch_size=64, shuffle=True) # Step 2: Define the PyTorch Model -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) +model = CNN() # 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 +train(model, trainloader) +torch.save(model.state_dict(), "mnist_cnn_model.pth") \ No newline at end of file From 82db6ba4d2a4b8fcaf0f87731c29da99ebbda4b9 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:39:25 +0000 Subject: [PATCH 4/7] feat: Updated src/main.py --- src/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main.py b/src/main.py index b56d25f..e5665a5 100644 --- a/src/main.py +++ b/src/main.py @@ -4,8 +4,7 @@ import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader -import numpy as np -from cnn import CNN +from cnn import CNN, train # Step 1: Load MNIST Data and Preprocess transform = transforms.Compose([ From 51bf9d37bb06d16b2a1875227cfe641f73e3652a Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:41:15 +0000 Subject: [PATCH 5/7] Sandbox run src/main.py --- src/main.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/main.py b/src/main.py index e5665a5..1acc63b 100644 --- a/src/main.py +++ b/src/main.py @@ -1,18 +1,15 @@ -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 +from torchvision import datasets, transforms + from cnn import CNN, train # Step 1: Load MNIST Data and Preprocess -transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize((0.5,), (0.5,)) -]) +transform = transforms.Compose( + [transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))] +) -trainset = datasets.MNIST('.', download=True, train=True, transform=transform) +trainset = datasets.MNIST(".", download=True, train=True, transform=transform) trainloader = DataLoader(trainset, batch_size=64, shuffle=True) # Step 2: Define the PyTorch Model @@ -20,4 +17,4 @@ # Step 3: Train the Model train(model, trainloader) -torch.save(model.state_dict(), "mnist_cnn_model.pth") \ No newline at end of file +torch.save(model.state_dict(), "mnist_cnn_model.pth") From 02a0ad272cc0b91fa30511d65979fccb855187c5 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:47:05 +0000 Subject: [PATCH 6/7] feat: Updated src/api.py --- src/api.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/api.py b/src/api.py index 36c257a..7979d27 100644 --- a/src/api.py +++ b/src/api.py @@ -2,11 +2,9 @@ from PIL import Image import torch 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")) +from cnn import CNN # Importing CNN class from cnn.py +model = CNN() +model.load_state_dict(torch.load("mnist_cnn_model.pth")) model.eval() # Transform used for preprocessing the image From 04a79a546f2748cd2962041fc87362304c2cfc87 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 19:48:06 +0000 Subject: [PATCH 7/7] Sandbox run src/api.py --- src/api.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/api.py b/src/api.py index 7979d27..59ebe68 100644 --- a/src/api.py +++ b/src/api.py @@ -1,20 +1,22 @@ -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 cnn import CNN # Importing CNN class from cnn.py + model = CNN() model.load_state_dict(torch.load("mnist_cnn_model.pth")) 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 = File(...)): image = Image.open(file.file).convert("L")