From 75789eaefcca10bd88ebdbc50f274b0415ef82fa Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 00:39:43 +0000 Subject: [PATCH 1/4] feat: Add CNN class for MNIST dataset in cnn.py --- src/cnn.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/cnn.py diff --git a/src/cnn.py b/src/cnn.py new file mode 100644 index 0000000..35cb11a --- /dev/null +++ b/src/cnn.py @@ -0,0 +1,37 @@ +import torch +import torch.nn as nn +import torch.optim as optim + +class CNN(nn.Module): + """ + Convolutional Neural Network for MNIST dataset. + """ + def __init__(self): + super(CNN, self).__init__() + self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1) + self.pool = nn.MaxPool2d(kernel_size=2, stride=2) + self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) + self.fc1 = nn.Linear(64*7*7, 128) + self.fc2 = nn.Linear(128, 10) + + def forward(self, x): + x = self.pool(nn.functional.relu(self.conv1(x))) + x = self.pool(nn.functional.relu(self.conv2(x))) + x = x.view(-1, 64*7*7) + x = nn.functional.relu(self.fc1(x)) + x = self.fc2(x) + return x + + def train(self, dataloader, optimizer): + criterion = nn.CrossEntropyLoss() + for images, labels in dataloader: + optimizer.zero_grad() + outputs = self.forward(images) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() + + def predict(self, image): + output = self.forward(image) + _, predicted = torch.max(output.data, 1) + return predicted.item() From 41cf9d8da54ea288a64f70d233ad0b0332b8b433 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 00:40:48 +0000 Subject: [PATCH 2/4] Sandbox run src/cnn.py --- src/cnn.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cnn.py b/src/cnn.py index 35cb11a..17ec0c1 100644 --- a/src/cnn.py +++ b/src/cnn.py @@ -1,23 +1,24 @@ import torch import torch.nn as nn -import torch.optim as optim + class CNN(nn.Module): """ Convolutional Neural Network for MNIST dataset. """ + def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1) self.pool = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) - self.fc1 = nn.Linear(64*7*7, 128) + self.fc1 = nn.Linear(64 * 7 * 7, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = self.pool(nn.functional.relu(self.conv1(x))) x = self.pool(nn.functional.relu(self.conv2(x))) - x = x.view(-1, 64*7*7) + x = x.view(-1, 64 * 7 * 7) x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x From 11e732452383116b9e3b193f187aff05e40da1dc Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 00:41:36 +0000 Subject: [PATCH 3/4] feat: Updated src/main.py --- src/main.py | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/src/main.py b/src/main.py index 243a31e..6952cb4 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([ @@ -15,34 +16,15 @@ 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): - 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 2: Instantiate the CNN Model +model = CNN() -# Step 3: Train the Model -model = Net() +# Step 3: Define the Optimizer optimizer = optim.SGD(model.parameters(), lr=0.01) -criterion = nn.NLLLoss() -# Training loop +# Step 4: Train the Model using the CNN's train method 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() + model.train(trainloader, optimizer) torch.save(model.state_dict(), "mnist_model.pth") \ No newline at end of file From 4272f0cd97c3a5483cd15a41cd22c06cce1fb82a Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 00:42:15 +0000 Subject: [PATCH 4/4] Sandbox run src/main.py --- src/main.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/main.py b/src/main.py index 6952cb4..fa51804 100644 --- a/src/main.py +++ b/src/main.py @@ -1,19 +1,17 @@ -from PIL import Image +import numpy as np 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 +from torchvision import datasets, transforms + from cnn import CNN # 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: Instantiate the CNN Model @@ -27,4 +25,4 @@ for epoch in range(epochs): model.train(trainloader, optimizer) -torch.save(model.state_dict(), "mnist_model.pth") \ No newline at end of file +torch.save(model.state_dict(), "mnist_model.pth")