Trial / app.py
chakshu12345's picture
Update app.py
0b2f750
# -*- coding: utf-8 -*-
"""B20AI006_MNIST_Trial.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1xG500b51pcVvYpP_fgsQ2IgEPQ3TLIup
###Importing Libraries
"""
# Commented out IPython magic to ensure Python compatibility.
import os
import sys
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torch.profiler
from torch.utils.data import DataLoader, TensorDataset
import torchvision.utils
from torchvision import models
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torchvision.models import resnet18, ResNet18_Weights
from sklearn.manifold import TSNE
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
# %matplotlib inline
import warnings
warnings.filterwarnings('ignore')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device
"""##Q1
###Loading CIFAR10
"""
# Define the transformations to apply to the images
transform_train = transforms.Compose([
transforms.ToTensor()
])
transform = transforms.Compose(
[
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
transform_test = transforms.Compose([
transforms.ToTensor()
])
mnist_train = dsets.MNIST(root='./', train=True,
download=True, transform=transform_train)
mnist_test = dsets.MNIST(root='./', train=False,
download=True, transform=transform_test)
train_loader = torch.utils.data.DataLoader(mnist_train, batch_size=64,
shuffle=True, num_workers=1)
test_loader = torch.utils.data.DataLoader(mnist_test, batch_size=64,
shuffle=False, num_workers=1)
"""###Defining CNN model as mentioned in question"""
import torch
import torch.nn as nn
class MNISTModel(nn.Module):
def __init__(self):
super(MNISTModel, self).__init__()
self.conv_layers = nn.Sequential(
nn.Conv2d(in_channels=1, out_channels=8, kernel_size=3, stride=1, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(in_channels=8, out_channels=16, kernel_size=3, stride=1,padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2),
# nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1,padding=1),
# nn.ReLU(inplace=True),
# nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1,padding=1),
# nn.ReLU(inplace=True),
# nn.MaxPool2d(kernel_size=2),
# nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=1,padding=1),
# nn.ReLU(inplace=True),
# nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=1,padding=1),
# nn.ReLU(inplace=True),
# nn.MaxPool2d(kernel_size=2)
)
self.fc_layers = nn.Sequential(
nn.Linear(in_features=3136, out_features=10)
)
def forward(self, x):
x = self.conv_layers(x)
x = torch.flatten(x, 1)
# print(x.shape)
x = self.fc_layers(x)
return x
model = MNISTModel()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
"""###Training the model"""
def train_main(train_loader, test_loader, num_epochs, optimizer, model, device='cpu'):
# Lists to store the train and test losses and accuracies
train_losses = []
test_losses = []
train_accs = []
test_accs = []
criterion = nn.CrossEntropyLoss()
model.to(device)
for epoch in range(num_epochs):
train_loss = 0
train_correct = 0
train_total = 0
for i, (images, labels) in enumerate(train_loader):
# Send inputs and targets to GPU if available
images = images.to(device)
labels = labels.to(device)
optimizer.zero_grad() # zero the gradients
outputs = model(images)
loss = criterion(outputs, labels) # calculate the loss
loss.backward() # backpropagation
optimizer.step() # update weights
train_loss += loss.item()
# calculate the training accuracy
_, predicted = torch.max(outputs.data, 1)
train_total += labels.size(0)
train_correct += (predicted == labels).sum().item()
# prof.step() ##Taking step in tensorboard profiler
# evaluate the model on the test set
test_loss = 0
test_correct = 0
test_total = 0
with torch.no_grad():
for images, labels in test_loader:
# Send inputs and targets to GPU if available
images = images.to(device)
labels = labels.to(device)
outputs = model(images)
loss = criterion(outputs, labels)
test_loss += loss.item()
# calculate the testing accuracy
_, predicted = torch.max(outputs.data, 1)
test_total += labels.size(0)
test_correct += (predicted == labels).sum().item()
# append the average loss and accuracy for the epoch to the lists
train_loss /= len(train_loader)
test_loss /= len(test_loader)
train_acc = 100.0 * train_correct / train_total
test_acc = 100.0 * test_correct / test_total
train_losses.append(train_loss)
test_losses.append(test_loss)
train_accs.append(train_acc)
test_accs.append(test_acc)
print('Epoch: {}, train loss: {:.4f}, test loss: {:.4f}, train accuracy: {:.2f}%, test accuracy: {:.2f}%'.format(epoch+1, train_loss, test_loss, train_acc, test_acc))
print("Saving the model")
torch.save(model, './trained_model.pt')
print("Model saved successfully")
# save the results to a text file
print("Saving training logs")
with open("./results.txt", "w") as f:
for epoch in range(num_epochs):
f.write("Epoch: {}, train loss: {:.4f}, test loss: {:.4f}, train accuracy: {:.2f}%, test accuracy: {:.2f}%\n".format(epoch+1, train_losses[epoch], test_losses[epoch], train_accs[epoch], test_accs[epoch]))
print("Logs saved")
num_epochs=1
train_main(train_loader, test_loader, num_epochs, optimizer, model, device)
"""###ResNet18 model"""
# model = models.resnet18(pretrained=False)
# num_ftrs = model.fc.in_features
# model.fc = nn.Linear(num_ftrs, 10)
# # model.to(device)
# criterion = nn.CrossEntropyLoss()
# optimizer = optim.Adam(model.parameters(), lr=0.001)