{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Recognize Handwritten Digits Using the Deep Neural Network","metadata":{}},{"cell_type":"markdown","source":"# Install Packages","metadata":{}},{"cell_type":"code","source":"pip install torch","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pip install torchvision","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Import Modules","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport torch\nimport torchvision\nimport matplotlib.pyplot as plt\nfrom time import time\nfrom torchvision import datasets, transforms\nfrom torch import nn, optim\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Create a Transformation","metadata":{}},{"cell_type":"code","source":"normalized = transforms.Normalize((0.5,), (0.5,))\ntensor = transforms.ToTensor()\ntransformation = transforms.Compose([tensor, normalized])\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Download and Load Datasets","metadata":{}},{"cell_type":"code","source":"training_dataset = datasets.MNIST('/bytefiles', download=True, train=True, transform=transformation)\ntesting_dataset = datasets.MNIST('/bytefiles', download=True, train=False, transform=transformation)\n\ntrain_data = torch.utils.data.DataLoader(training_dataset, batch_size=64, shuffle=True)\ntest_data = torch.utils.data.DataLoader(testing_dataset, batch_size=64, shuffle=True)\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Visualize Images","metadata":{}},{"cell_type":"code","source":"images, labels = next(iter(train_data))\nfor i in range(1, 31):\n    plt.subplot(3,10, i)\n    plt.subplots_adjust(wspace=0.3)\n    plt.imshow(images[i].numpy().squeeze())\n\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Calculate Size of Layers","metadata":{}},{"cell_type":"code","source":"input_layer = 784\nhidden_layer1 = 64\nhidden_layer2 = 32\noutput_layer = 10\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Build a Model","metadata":{}},{"cell_type":"code","source":"model = nn.Sequential(nn.Linear(input_layer, hidden_layer1),\nnn.ReLU(),\nnn.Linear(hidden_layer1,hidden_layer2),\nnn.ReLU(),\nnn.Linear(hidden_layer2, output_layer))\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Calculate Cross-Entropy Loss","metadata":{}},{"cell_type":"code","source":"images = images.view(images.shape[0], -1)\noutputs = model(images)\nlossFunction = nn.CrossEntropyLoss()\nloss = lossFunction(outputs, labels)\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Obtain the Stochastic Gradient Descent Optimizer","metadata":{}},{"cell_type":"code","source":"gradient_descent = optim.SGD(model.parameters(), lr=0.1)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train the Model","metadata":{}},{"cell_type":"code","source":"epochs = 20\nfor epoch in range(epochs):\n    running_loss = 0.0\n    for images, labels in train_data:\n        images = images.view(images.shape[0], -1)\n       \n    # Feed-Forward\n        gradient_descent.zero_grad()\n        loss = lossFunction(model(images), labels)\n       \n    # Back Propagation\n        loss.backward()\n       \n    # Optimize the weights\n        gradient_descent.step()\n        running_loss += loss.item() * images.size(0)\n    epoch_loss = running_loss / len(labels)\n    print(\"Iteration : \", epoch+1, end = \"\\t\")\n    print(\"Loss: \", epoch_loss)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Get the Predicted Label","metadata":{}},{"cell_type":"code","source":"def get_predicted_label(image):\n    image = image.view(1, 28*28)\n    with torch.no_grad():\n        prediction_score = model(image)\n    return np.argmax(prediction_score)\nimages, labels = next(iter(test_data))\nprint(\"Predicted Label: \", \nget_predicted_label(images[0]))\nprint(\"Actual Label: \", labels.numpy()[0])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Test the Model","metadata":{}},{"cell_type":"code","source":"totalCount = 0\naccurateCount = 0\nfor images, labels in test_data:\n    for i in range(len(labels)):\n        predictedLabel = get_predicted_label(images[i])\n        actualLabel = labels.numpy()[i]\n        print(\"Predicted Label: \", predictedLabel, \" / Actual Label: \", actualLabel)\n        if(predictedLabel == actualLabel):\n            accurateCount += 1\n    totalCount += len(labels)\nprint(\"Total images tested: : \", totalCount)\nprint(\"Accurate predictions: \", accurateCount)\nprint(\"Accuracy percentage: \", ((accurateCount/totalCount)*100), \"%\")\n","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}