diff --git a/src/api.py b/src/api.py index 36c257a..88105e8 100644 --- a/src/api.py +++ b/src/api.py @@ -1,28 +1,29 @@ -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 +from main import Trainer # Importing Trainer class from main.py # Load the model -model = Net() -model.load_state_dict(torch.load("mnist_model.pth")) -model.eval() +trainer = Trainer() +trainer.load_model("mnist_model.pth") # Assuming load_model method exists # 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") image = transform(image) image = image.unsqueeze(0) # Add batch dimension with torch.no_grad(): - output = model(image) + output = trainer.get_model()(image) # Assuming get_model method exists _, predicted = torch.max(output.data, 1) return {"prediction": int(predicted[0])} diff --git a/src/main.py b/src/main.py index 243a31e..c010fb3 100644 --- a/src/main.py +++ b/src/main.py @@ -1,20 +1,20 @@ -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 PIL import Image from torch.utils.data import DataLoader -import numpy as np +from torchvision import datasets, transforms # 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 class Net(nn.Module): def __init__(self): @@ -22,7 +22,7 @@ def __init__(self): 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)) @@ -30,19 +30,30 @@ def forward(self, x): x = self.fc3(x) return nn.functional.log_softmax(x, dim=1) + +class Trainer: + def __init__(self, learning_rate, model_path): + self.model = Net() + self.optimizer = optim.SGD(self.model.parameters(), lr=learning_rate) + self.criterion = nn.NLLLoss() + self.model_path = model_path + + def train(self, epochs): + for epoch in range(epochs): + for images, labels in trainloader: + self.optimizer.zero_grad() + output = self.model(images) + loss = self.criterion(output, labels) + loss.backward() + self.optimizer.step() + + def save_model(self): + torch.save(self.model.state_dict(), self.model_path) + + # 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 + +# Now let's create a Trainer instance and train and save the model +trainer = Trainer(learning_rate=0.01, model_path="mnist_model.pth") +trainer.train(epochs=3) +trainer.save_model()