{ "cells": [ { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "import torch.optim as optim\n", "import torchvision\n", "import torchvision.transforms as xforms" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Files already downloaded and verified\n", "Files already downloaded and verified\n" ] } ], "source": [ "# Load the training and test datasets, build loaders to batch four images at a time, define\n", "# a mapping from training image index to training image semantic label\n", "\n", "# Normalize image as pix = ( pix - mean ) / std, moves pixel values from [0..1] to [-1..1]\n", "# since we pass (0.5,0.5) as mean and standard deviation; to move back to the [0..1] range\n", "# we can reverse this as pix = ( ( pix * 2 ) / mean ); the first argument is mean for R,G,B\n", "# channels, the second argument is stdev for the three channels\n", "\n", "xform = xforms.Compose( [ xforms.ToTensor(), xforms.Normalize( ( 0.5,0.5,0.5 ), (0.5,0.5,0.5) ) ] )\n", "\n", "train_set = torchvision.datasets.CIFAR10( root='./data', train=True, download=True, transform=xform )\n", "train_loader = torch.utils.data.DataLoader( train_set, batch_size=4, shuffle=True )\n", "\n", "test_set = torchvision.datasets.CIFAR10( root='./data', train=False, download=True, transform=xform )\n", "test_loader = torch.utils.data.DataLoader( test_set, batch_size=4, shuffle=False )\n", "\n", "classes = ( 'plane','car','bird','cat','deer','dog','frog','horse','ship','truck' )" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " dog car frog car\n" ] } ], "source": [ "# Check a radom four images and their correct labels from the training set\n", "\n", "def img_show( img ):\n", " \n", " # Function to display a PyTorch normalized image\n", " \n", " img = img / 2 + 0.5 # Un-normalize\n", " np_img = img.numpy() # Convert to numpy image format\n", " plt.imshow( np.transpose( np_img, ( 1, 2, 0 ) ) )\n", " plt.show()\n", "\n", "# Retrieve random training images\n", "\n", "data_iter = iter( train_loader )\n", "images, labels = data_iter.next()\n", "\n", "# Display images\n", "\n", "img_show( torchvision.utils.make_grid( images ) )\n", "print( ' '.join( '%5s' % classes[ labels[ j ] ] for j in range( 4 ) ) )" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# Define the CNN: convolution, maxpool, convoloution, FCN 1/ReLU, FCN 2/ReLU, FCN 3\n", "\n", "class Net( nn.Module ):\n", " def __init__( self ):\n", " super( Net, self ).__init__()\n", " \n", " self.conv_1 = nn.Conv2d( 3, 6, 5 ) # 2D convolution, in_channel=3 (RGB), out-channel=6, kernel-size=5x5\n", " self.pool = nn.MaxPool2d( 2, 2 ) # Pool by selecting max value, kernel-size=2, stride=2\n", " self.conv_2 = nn.Conv2d( 6, 16, 5 ) # 2D convolution, in_channel=6 (prev conv), out_channel=16, kernel-size=5x5\n", " self.fc_1 = nn.Linear( 16 * 5 * 5, 120 ) # 1D vectorize convolution results, feed into 120-node hidden layer\n", " self.fc_2 = nn.Linear( 120, 84 ) # Feed from first to second 84-node hidden layer\n", " self.fc_3 = nn.Linear( 84, 10 ) # Feed from second to 10-class output layer\n", " \n", " def forward( self, x ):\n", " x = self.pool( F.relu( self.conv_1( x ) ) ) # 1st convolve, ReLU, maxpool\n", " x = self.pool( F.relu( self.conv_2( x ) ) ) # 2nd convolve, ReLU, maxpool\n", " x = x.view( -1, 16 * 5 * 5 ) # Reshape tensor into req'd rows (-1) and 16*5*5 columns\n", " x = F.relu( self.fc_1( x ) ) # Pass through FCN 1st hidden layer, ReLU results\n", " x = F.relu( self.fc_2( x ) ) # Pass through FCN 2nd hidden layer, ReLU results\n", " x = self.fc_3( x ) # Provide class probabilities\n", " \n", " return x\n", " \n", "net = Net()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# Set loss criteria and optimizer for backpropagation\n", "\n", "criterion = nn.CrossEntropyLoss()\n", "optimizer = optim.SGD( net.parameters(), lr=0.001, momentum=0.9 ) # Stochastic gradient descent" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2000] loss: 2.216\n", "[1, 4000] loss: 1.860\n", "[1, 6000] loss: 1.675\n", "[1, 8000] loss: 1.581\n", "[1,10000] loss: 1.522\n", "[1,12000] loss: 1.478\n", "[1,12500] loss: 0.380\n", "[2, 2000] loss: 1.425\n", "[2, 4000] loss: 1.374\n", "[2, 6000] loss: 1.347\n", "[2, 8000] loss: 1.329\n", "[2,10000] loss: 1.297\n", "[2,12000] loss: 1.286\n", "[2,12500] loss: 0.310\n", "Training complete...\n" ] } ], "source": [ "# Train the CNN on the training dataset for two epochs\n", "\n", "for epoch in range( 2 ):\n", " step_loss = 0.0\n", " \n", " for i,data in enumerate( train_loader, 0 ):\n", " inputs,labels = data\n", " \n", " optimizer.zero_grad() # Zero any previous gradient descent results\n", " \n", " outputs = net( inputs ) # Forward pass\n", " loss = criterion( outputs, labels ) # Compute error\n", " loss.backward() # Backpropegation\n", " optimizer.step() # Update weights\n", " \n", " step_loss += loss.item() # Update current step error\n", " if ( i + 1 ) % 2000 == 0: # Print step error every 2000 batches\n", " print( '[%d,%5d] loss: %.3f' % ( epoch + 1, i+1, step_loss / 2000.0 ) )\n", " step_loss = 0.0\n", " \n", " print( '[%d,%5d] loss: %.3f' % ( epoch + 1, i+1, step_loss / 2000.0 ) )\n", " \n", "print( 'Training complete...' )" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Ground Truth: cat ship ship plane\n", "Predicted: cat ship car plane\n" ] } ], "source": [ "# Check accuracy for a random set of four images\n", "\n", "data_iter = iter( test_loader )\n", "images,labels = data_iter.next()\n", "\n", "img_show( torchvision.utils.make_grid( images ) )\n", "print( 'Ground Truth: ', ' '.join( '%5s' % classes[ labels[ j ] ] for j in range( 4 ) ) )\n", "\n", "outputs = net( images )\n", "_,predicted = torch.max( outputs, 1 )\n", "\n", "print( 'Predicted: ', ' '.join( '%5s' % classes[ predicted[ j ] ] for j in range( 4 ) ) )" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Network accuracy on 10,000 test images: 53%\n" ] } ], "source": [ "# Check accuracy on test set\n", "\n", "c = 0\n", "n = 0\n", "\n", "with torch.no_grad():\n", " for data in test_loader:\n", " images,labels = data\n", " outputs = net( images )\n", " _,predicted = torch.max( outputs.data, 1 )\n", " n += labels.size( 0 )\n", " c += ( predicted == labels ).sum().item()\n", " \n", "print( 'Network accuracy on 10,000 test images: %d%%' % ( 100.0 * c / n ) )" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy for plane: 71%\n", "Accuracy for car: 63%\n", "Accuracy for bird: 48%\n", "Accuracy for cat: 14%\n", "Accuracy for deer: 32%\n", "Accuracy for dog: 41%\n", "Accuracy for frog: 85%\n", "Accuracy for horse: 54%\n", "Accuracy for ship: 62%\n", "Accuracy for truck: 60%\n" ] } ], "source": [ "# Check accuracy for the 10 individual classes\n", "\n", "class_c = list( 0.0 for i in range( 10 ) )\n", "class_n = list( 0.0 for i in range( 10 ) )\n", "\n", "with torch.no_grad():\n", " for data in test_loader:\n", " images,labels = data\n", " outputs = net( images )\n", " _,predicted = torch.max( outputs, 1 )\n", " \n", " c = ( predicted == labels ).squeeze()\n", " for i in range( 4 ):\n", " label = labels[ i ]\n", " class_c[ label ] += c[ i ].item()\n", " class_n[ label ] += 1\n", " \n", "for i in range( 10 ):\n", " print( 'Accuracy for %5s: %2d%%' % ( classes[ i ], 100.0 * class_c[ i ] / class_n[ i ] ) )" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }