#!/usr/bin/python3 import torch from torch import nn from torch.autograd import Variable from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor, Lambda, Compose import matplotlib.pyplot as plt training_data = datasets.MNIST( root=".data", train=True, download=True, transform=ToTensor(), ) test_data = datasets.MNIST( root=".data", train=False, download=True, transform=ToTensor(), ) batch_size = 100 train_loader = DataLoader(training_data, batch_size=batch_size) test_loader = DataLoader(test_data, batch_size=batch_size) class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.layer1 = nn.Sequential( nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1), nn.BatchNorm2d(32), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2)) self.layer2 = nn.Sequential( nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3), nn.BatchNorm2d(64), nn.ReLU(), nn.MaxPool2d(2)) self.fc1 = nn.Linear(in_features=64 * 6 * 6, out_features=600) self.drop = nn.Dropout2d(0.25) self.fc2 = nn.Linear(in_features=600, out_features=120) self.fc3 = nn.Linear(in_features=120, out_features=10) def forward(self, x): out = self.layer1(x) out = self.layer2(out) out = out.view(out.size(0), -1) out = self.fc1(out) out = self.drop(out) out = self.fc2(out) out = self.fc3(out) return out device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') model = CNN() model.to(device) error = nn.CrossEntropyLoss() learning_rate = 0.001 optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) num_epochs = 5 count = 0 loss_list = [] iteration_list = [] accuracy_list = [] predictions_list = [] labels_list = [] for epoch in range(num_epochs): for images, labels in train_loader: images, labels = images.to(device), labels.to(device) train = Variable(images.view(batch_size, 1, 28, 28)) labels = Variable(labels) outputs = model(train) loss = error(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() count += 1 if count % 50 == 0: total = 0 correct = 0 for images, labels in test_loader: images, labels = images.to(device), labels.to(device) labels_list.append(labels) test = Variable(images.view(batch_size, 1, 28, 28)) outputs = model(test) predictions = torch.max(outputs, 1)[1].to(device) predictions_list.append(predictions) correct += (predictions == labels).sum() total += len(labels) accuracy = correct * batch_size / total loss_list.append(loss.data) iteration_list.append(count) accuracy_list.append(accuracy) print("Iteration: {}, Loss: {}, Accuracy: {}%".format( count, loss.data, accuracy)) torch.save(model.state_dict(), "model.pth") print("Saved PyTorch Model State to model.pth") plt.plot(iteration_list, loss_list) plt.xlabel("No. of Iteration") plt.ylabel("Loss") plt.title("Iterations vs Loss") plt.savefig("loss.png") plt.plot(iteration_list, accuracy_list) plt.xlabel("No. of Iteration") plt.ylabel("Accuracy") plt.title("Iterations vs Accuracy") plt.savefig("accuracy.png")