{ "cells": [ { "cell_type": "code", "execution_count": 1, "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": 2, "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": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " car frog deer ship\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 = next(data_iter)\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": 5, "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": 6, "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": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2000] loss: 2.230\n", "[1, 4000] loss: 1.900\n", "[1, 6000] loss: 1.695\n", "[1, 8000] loss: 1.575\n", "[1,10000] loss: 1.519\n", "[1,12000] loss: 1.458\n", "[1,12500] loss: 0.358\n", "[2, 2000] loss: 1.390\n", "[2, 4000] loss: 1.352\n", "[2, 6000] loss: 1.329\n", "[2, 8000] loss: 1.293\n", "[2,10000] loss: 1.281\n", "[2,12000] loss: 1.279\n", "[2,12500] loss: 0.316\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": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Ground Truth: cat ship ship plane\n", "Predicted: dog ship ship plane\n" ] } ], "source": [ "# Check accuracy for a random set of four images\n", "\n", "data_iter = iter( test_loader )\n", "images,labels = next( data_iter )\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": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Network accuracy on 10,000 test images: 55%\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": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy for plane: 45%\n", "Accuracy for car: 59%\n", "Accuracy for bird: 41%\n", "Accuracy for cat: 28%\n", "Accuracy for deer: 57%\n", "Accuracy for dog: 47%\n", "Accuracy for frog: 72%\n", "Accuracy for horse: 61%\n", "Accuracy for ship: 80%\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 ] ) )" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "base-ex", "language": "python", "name": "base-ex" }, "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.12.3" } }, "nbformat": 4, "nbformat_minor": 4 }