{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "CNN_in_pytorch.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "M5Xo1hxEVOVb", "colab_type": "text" }, "source": [ "#
CS568:Deep Learning
Spring 2020
" ] }, { "cell_type": "code", "metadata": { "id": "l8cKeO6zVGFx", "colab_type": "code", "colab": {} }, "source": [ "import torch \n", "import torch.nn as nn\n", "import torchvision\n", "from torchsummary import summary\n", "import torchvision.transforms as transforms\n", "\n", "# Device configuration\n", "device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')\n", "\n", "# Hyper parameters\n", "num_epochs = 5\n", "num_classes = 10\n", "batch_size = 10000\n", "learning_rate = 0.01\n", "\n", "# load dataset\n", "\n", "train_dataset = torchvision.datasets.MNIST(root='/data/',\n", " train=True, \n", " transform=transforms.ToTensor(),\n", " download=True)\n", " \n", "test_dataset = torchvision.datasets.MNIST(root='/data/',\n", " train=False, \n", " transform=transforms.ToTensor())\n", "\n", "# Data loader\n", "train_loader = torch.utils.data.DataLoader(dataset=train_dataset,\n", " batch_size=batch_size, \n", " shuffle=True)\n", "\n", "test_loader = torch.utils.data.DataLoader(dataset=test_dataset,\n", " batch_size=batch_size, \n", " shuffle=False)\n", "\n", "\n", "\n" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "-yYTPmUCWG8C", "colab_type": "code", "colab": {} }, "source": [ "class ConvNet(nn.Module):\n", " def __init__(self, num_classes=10):\n", " super(ConvNet, self).__init__()\n", " self.layer1 = nn.Sequential(\n", " nn.Conv2d(1, 6, kernel_size=3, stride=1, padding=1),\n", " nn.ReLU(),\n", " nn.MaxPool2d(kernel_size=2, stride=2))\n", " self.layer2 = nn.Sequential(\n", " nn.Conv2d(6, 12, kernel_size=3, stride=1, padding=1),\n", " nn.ReLU(),\n", " nn.MaxPool2d(kernel_size=2, stride=2))\n", " self.fc = nn.Linear(7*7*12, num_classes)\n", " \n", " def forward(self, x):\n", " out = self.layer1(x)\n", " out = self.layer2(out)\n", " out = out.reshape(out.size(0), -1)\n", " out = self.fc(out)\n", "\n", " return out" ], "execution_count": 0, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Fcf3aWIaWcfC", "colab_type": "code", "outputId": "c44854d5-7913-43cf-f3d2-75b84303da8b", "colab": { "base_uri": "https://localhost:8080/", "height": 238 } }, "source": [ "cnn = ConvNet(num_classes).to(device)\n", "calculate_loss = nn.CrossEntropyLoss()\n", "optimizer = torch.optim.Adam(cnn.parameters(), lr=learning_rate)\n", "print(cnn)" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "ConvNet(\n", " (layer1): Sequential(\n", " (0): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (1): ReLU()\n", " (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " )\n", " (layer2): Sequential(\n", " (0): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))\n", " (1): ReLU()\n", " (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)\n", " )\n", " (fc): Linear(in_features=784, out_features=10, bias=True)\n", ")\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "nBllu_IOWioB", "colab_type": "code", "outputId": "aa614f2a-b30c-435b-f071-d8499b37f572", "colab": { "base_uri": "https://localhost:8080/", "height": 102 } }, "source": [ "total_step = len(train_loader)\n", "for epoch in range(num_epochs):\n", " for i, (images, labels) in enumerate(train_loader):\n", " images = images.to(device)\n", " labels = labels.to(device)\n", "\n", "\n", " # Forward pass\n", " outputs = cnn(images)\n", " loss = calculate_loss(outputs, labels.T)\n", " \n", " # Backprop and update parameters\n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step() \n", " \n", "\n", " print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' .format(epoch+1, num_epochs, i+1, total_step, loss.item()))\n", " " ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Epoch [1/5], Step [6/6], Loss: 0.0815\n", "Epoch [2/5], Step [6/6], Loss: 0.0685\n", "Epoch [3/5], Step [6/6], Loss: 0.0741\n", "Epoch [4/5], Step [6/6], Loss: 0.0761\n", "Epoch [5/5], Step [6/6], Loss: 0.0662\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "vMMIYMdeWnch", "colab_type": "code", "outputId": "7dece178-3207-4048-ae61-03bbaac4acf1", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "cnn.eval() \n", "with torch.no_grad():\n", " correct = 0\n", " total = 0\n", " for images, labels in test_loader:\n", " images = images.to(device)\n", " labels = labels.to(device)\n", " outputs = cnn(images)\n", " _, predicted = torch.max(outputs.data, 1)\n", " total += labels.size(0)\n", " correct += (predicted == labels).sum().item()\n", "\n", " print('Test Accuracy of the model on the test images: {} %'.format(100 * correct / total))" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Test Accuracy of the model on the test images: 98.08 %\n" ], "name": "stdout" } ] } ] }