From 6abc74673e8ff62119f5e211f27a85f00675cb76 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:03:20 +0000 Subject: [PATCH 1/5] feat: Added CNN class for MNIST dataset training --- src/cnn.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/cnn.py diff --git a/src/cnn.py b/src/cnn.py new file mode 100644 index 0000000..f048f38 --- /dev/null +++ b/src/cnn.py @@ -0,0 +1,58 @@ +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): + """ + Convolutional Neural Network (CNN) class. + """ + + def __init__(self): + """ + Initialize the CNN model. + """ + super(CNN, self).__init__() + self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1) + self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) + self.fc1 = nn.Linear(7*7*64, 128) + self.fc2 = nn.Linear(128, 10) + + def forward(self, x): + """ + Forward pass of the CNN. + """ + x = F.relu(self.conv1(x)) + x = F.max_pool2d(x, 2, 2) + x = F.relu(self.conv2(x)) + x = F.max_pool2d(x, 2, 2) + x = x.view(x.size(0), -1) + x = F.relu(self.fc1(x)) + x = self.fc2(x) + return x + + def train(self, trainloader): + """ + Train the CNN model. + """ + criterion = nn.CrossEntropyLoss() + optimizer = optim.SGD(self.parameters(), lr=0.01) + + for epoch in range(10): # loop over the dataset multiple times + running_loss = 0.0 + for i, data in enumerate(trainloader, 0): + inputs, labels = data + optimizer.zero_grad() + outputs = self(inputs) + loss = criterion(outputs, labels) + loss.backward() + optimizer.step() + + return self + + def save_model(self, path): + """ + Save the trained model. + """ + torch.save(self.state_dict(), path) From 1a90f731e17a6ccb9940306bf76c93202d3b8d59 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:05:22 +0000 Subject: [PATCH 2/5] feat: Updated src/cnn.py --- src/cnn.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cnn.py b/src/cnn.py index f048f38..74de619 100644 --- a/src/cnn.py +++ b/src/cnn.py @@ -1,5 +1,6 @@ import torch import torch.nn as nn +import torch.nn.functional as F import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader From c95b33dec42019c5e46dd90a41438a53ca2a985b Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:06:08 +0000 Subject: [PATCH 3/5] Sandbox run src/cnn.py --- src/cnn.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/cnn.py b/src/cnn.py index 74de619..b359c5f 100644 --- a/src/cnn.py +++ b/src/cnn.py @@ -2,8 +2,7 @@ import torch.nn as nn import torch.nn.functional as F import torch.optim as optim -from torchvision import datasets, transforms -from torch.utils.data import DataLoader + class CNN(nn.Module): """ @@ -17,7 +16,7 @@ def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1) - self.fc1 = nn.Linear(7*7*64, 128) + self.fc1 = nn.Linear(7 * 7 * 64, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): @@ -40,9 +39,8 @@ def train(self, trainloader): criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(self.parameters(), lr=0.01) - for epoch in range(10): # loop over the dataset multiple times - running_loss = 0.0 - for i, data in enumerate(trainloader, 0): + for _epoch in range(10): # loop over the dataset multiple times + for _i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = self(inputs) From 0f4a0a9912b021f45e932cb499e86d143e0e1bbd Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:08:25 +0000 Subject: [PATCH 4/5] feat: Updated src/main.py --- src/main.py | 32 +++++--------------------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/src/main.py b/src/main.py index 243a31e..a9df961 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,10 @@ 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() +model.train(trainloader) -# 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 +# Save the trained model +model.save_model("mnist_model.pth") \ No newline at end of file From 3ec244bcba7036b74e44cafb2867ccb3c1389ea1 Mon Sep 17 00:00:00 2001 From: "sweep-nightly[bot]" <131841235+sweep-nightly[bot]@users.noreply.github.com> Date: Fri, 20 Oct 2023 22:09:07 +0000 Subject: [PATCH 5/5] Sandbox run src/main.py --- src/main.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main.py b/src/main.py index a9df961..501fbd9 100644 --- a/src/main.py +++ b/src/main.py @@ -1,19 +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 -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: Define the PyTorch Model @@ -23,4 +19,4 @@ model.train(trainloader) # Save the trained model -model.save_model("mnist_model.pth") \ No newline at end of file +model.save_model("mnist_model.pth")