{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Introducing Tensorflow\n",
    "\n",
    "Be sure to \"conda install tensorflow\" or \"conda install tensorflow-gpu\" first!\n",
    "\n",
    "## The world's simplest Tensorflow application\n",
    "\n",
    "Let's begin by writing a really simple program to illustrate Tensorflow's main concepts. We'll set up two Variables, named \"a\" and \"b\", which each contain a tensor which contains a single value - the number 1, and the number 2.\n",
    "\n",
    "We then create a graph \"f\" that adds these two tensors together. But \"f = a + b\" just creates the graph; it doesn't actually perform the addition yet.\n",
    "\n",
    "Next we need to initialize any global variables before we run the graph.\n",
    "\n",
    "And finally, we create a Tensorflow Session object, run our variable initializer, and execute the graph with eval(). \n",
    "\n",
    "This returns the sum of 1 + 2 in a rather complex, yet highly scalable manner :)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The sum of a and b is 3\r\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "\n",
    "a = tf.Variable(1, name=\"a\")\n",
    "b = tf.Variable(2, name=\"b\")\n",
    "f = a + b\n",
    "\n",
    "tf.print(\"The sum of a and b is\", f)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## And now for something more interesting: Handwriting recognition\n",
    "\n",
    "The standard example for machine learning these days is the MNIST data set, a collection of 70,000 handwriting samples of the numbers 0-9. Our challenge - to predict which number each handwritten image represents.\n",
    "\n",
    "Although we'll talk about neural networks that are specifically well suited for image recognition later, we actually don't need to go there for this relatively simple task. We can achieve decent results without a whole lot of code.\n",
    "\n",
    "Each image is 28x28 grayscale pixels, so we can treat each image as just a 1D array, or tensor, of 784 numbers. As long as we're consistent in how we flatten each image into an array, it'll still work. Yes, it would be even better if we could preserve the 2D structure of the data while training - but we'll get there later.\n",
    "\n",
    "Let's start by importing the data set, which conveniently is part of tensorflow itself. We will reshape the images into the 1D arrays of 784 pixels that we expect, and the label data into one-hot-encoded categorical format (which we will convert during our loss function defination), which we'll talk about in a second:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Prepare MNIST data.\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.datasets import mnist\n",
    "\n",
    "# MNIST dataset parameters\n",
    "num_classes = 10 # total classes (0-9 digits)\n",
    "num_features = 784 # data features (img shape: 28*28)\n",
    "\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "# Convert to float32\n",
    "x_train, x_test = np.array(x_train, np.float32), np.array(x_test, np.float32)\n",
    "\n",
    "# Flatten images to 1-D vector of 784 features (28*28)\n",
    "x_train, x_test = x_train.reshape([-1, num_features]), x_test.reshape([-1, num_features])\n",
    "\n",
    "# Normalize images value from [0, 255] to [0, 1]\n",
    "x_train, x_test = x_train / 255., x_test / 255."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MNIST provides 60,000 samples in a training data set, and 10,000 samples in a test data set.\n",
    "\n",
    "If you're new to the concept of train/test - it's important to evaluate the performance of our neural network using data it's never seen before. Otherwise it's kinda like giving students a math test for problems they already have the answers for. So, we use a completely different set of images to train our neural network from the images used for testing its accuracy.\n",
    "\n",
    "The training images are therefore a tensor of shape [60,000, 784] - 60,000 instances of 784 numbers that represent each image. The training labels are a one-dimensional tensor of 60,000 labels that range from 0 to 9.\n",
    "\n",
    "Let's define a little function to let us visualize what the input data looks like, and pick some random training image to see what it is we're up against:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def display_sample(num):\n",
    "    #Print this sample's label \n",
    "    label = y_train[num] \n",
    "    \n",
    "    #Reshape the 784 values to a 28x28 image\n",
    "    image = x_train[num].reshape([28,28])\n",
    "    plt.title('Sample: %d  Label: %d' % (num, label))\n",
    "    plt.imshow(image, cmap=plt.get_cmap('gray_r'))\n",
    "    plt.show()\n",
    "    \n",
    "display_sample(1000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So, you can see the training label for image #1000, as well as what this particular sample looks like. You can tell that some of the training data would even be challenging for a human to classify!\n",
    "\n",
    "Go ahead and try different input images to get a feel of the data we're given. Any value between 0 and 60,000 will work.\n",
    "\n",
    "As a reminder, we're flattening each image to a 1D array of 784 (28 x 28) numerical values. Each one of those values will be an input node into our deep neural network. Let's visualize how the data is being fed into it just to drive that point home:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "images = x_train[0].reshape([1,784])\n",
    "for i in range(1, 500):\n",
    "    images = np.concatenate((images, x_train[i].reshape([1,784])))\n",
    "plt.imshow(images, cmap=plt.get_cmap('gray_r'))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This is showing the first 500 training samples, one on each row. Imagine each pixel on each row getting fed into the bottom layer of a neural network 768 neurons (or \"units\") wide as we train our neural network.\n",
    "\n",
    "We will now define few training parameters (or \"hyperparameters\") and use tf.data API to shuffle our data and divide it into batches. Think of these as parameters - we build up our neural network model without knowledge of the actual data that will be fed into it; we just need to construct it in such a way that our data will fit in.\n",
    "\n",
    "We'll use a Dataset within Tensorflow to wrap our traning features and labels, and use functions of the Dataset to randomly shuffle it and batch it up into smaller chunks for each iteration of training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Training parameters.\n",
    "learning_rate = 0.001\n",
    "training_steps = 3000\n",
    "batch_size = 250\n",
    "display_step = 100\n",
    "\n",
    "# Network parameters.\n",
    "n_hidden = 512 # Number of neurons."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Use tf.data API to shuffle and batch data.\n",
    "train_data = tf.data.Dataset.from_tensor_slices((x_train, y_train))\n",
    "train_data = train_data.repeat().shuffle(60000).batch(batch_size).prefetch(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "So let's start setting up that artificial neural network. We'll start by creating variables to store and keep track of weights and biases of different layers.\n",
    "\n",
    "We'll need an input layer with one node per input pixel per image, or 784 nodes. That will feed into a hidden layer of some arbitrary size - let's pick 512, given by n_hidden. That hidden layer will output 10 values, given by num_classes, corresonding to scores for each classification to be fed into softmax.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Store layers weight & bias\n",
    "\n",
    "# A random value generator to initialize weights initially\n",
    "random_normal = tf.initializers.RandomNormal()\n",
    "\n",
    "weights = {\n",
    "    'h': tf.Variable(random_normal([num_features, n_hidden])),\n",
    "    'out': tf.Variable(random_normal([n_hidden, num_classes]))\n",
    "}\n",
    "biases = {\n",
    "    'b': tf.Variable(tf.zeros([n_hidden])),\n",
    "    'out': tf.Variable(tf.zeros([num_classes]))\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's set up the neural network itself. We'll feed our input data into the first layer of our neural network. All this layer does is multiply these inputs by our weight \"h\" tensor which will be learned over time.\n",
    "\n",
    "Then we'll feed that into our hidden layer, which applies the sigmoid activation function to the weighted inputs with our learned biases added in as well.\n",
    "\n",
    "Finally our output layer, called out_layer, multiplies in the learned weights of the hidden layer and adds in the hidden layer's bias term."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create model.\n",
    "def neural_net(inputData):\n",
    "    # Hidden fully connected layer with 512 neurons.\n",
    "    hidden_layer = tf.add(tf.matmul(inputData, weights['h']), biases['b'])\n",
    "    # Apply sigmoid to hidden_layer output for non-linearity.\n",
    "    hidden_layer = tf.nn.sigmoid(hidden_layer)\n",
    "    \n",
    "    # Output fully connected layer with a neuron for each class.\n",
    "    out_layer = tf.matmul(hidden_layer, weights['out']) + biases['out']\n",
    "    # Apply softmax to normalize the logits to a probability distribution.\n",
    "    return tf.nn.softmax(out_layer)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Make sure you noodle on the above block. This sets up a deep neural network like the one we talked about in our slides.\n",
    "\n",
    "output layer\n",
    "\n",
    "hidden layer\n",
    "\n",
    "input layer\n",
    "\n",
    "Next we will define our loss function for use in measuring our progress in gradient descent: cross-entropy, which applies a logarithmic scale to penalize incorrect classifications much more than ones that are close. In this function,  y_pred is the output of our final layer, and we're comparing that against the target labels used for training in y_true.\n",
    "\n",
    "To compare our known \"true\" labels of 0-9 to the output of our neural network, we need to convert the labels to \"one-hot\" encoding. Our output layer has a neuron for each possible label of 0-9, not a single neuron with an integer in it. For example, let's say a known \"true\" label for an image is 1. We would represent that in one-hot format as [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] (remember we start counting at 0.) This makes it easier to compare the known label to the output neurons."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cross_entropy(y_pred, y_true):\n",
    "    # Encode label to a one hot vector.\n",
    "    y_true = tf.one_hot(y_true, depth=num_classes)\n",
    "    # Clip prediction values to avoid log(0) error.\n",
    "    y_pred = tf.clip_by_value(y_pred, 1e-9, 1.)\n",
    "    # Compute cross-entropy.\n",
    "    return tf.reduce_mean(-tf.reduce_sum(y_true * tf.math.log(y_pred)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we will set up our stocastic gradient descent optimizer, based on our previously defined hyperparameters and our loss function defined above.\n",
    "\n",
    "That learning rate is an example of a hyperparameter that may be worth experimenting with and tuning.\n",
    "\n",
    "We will be using Tensorflow 2.0 new feature of Gradient Tape (to know futher why we use this, follow this amazing answer given on stackoverflow, https://stackoverflow.com/a/53995313/8804853) It's the new way of setting up neural nets from scratch in Tensorflow 2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = tf.keras.optimizers.SGD(learning_rate)\n",
    "\n",
    "def run_optimization(x, y):\n",
    "    # Wrap computation inside a GradientTape for automatic differentiation.\n",
    "    with tf.GradientTape() as g:\n",
    "        pred = neural_net(x)\n",
    "        loss = cross_entropy(pred, y)\n",
    "        \n",
    "    # Variables to update, i.e. trainable variables.\n",
    "    trainable_variables = list(weights.values()) + list(biases.values())\n",
    "\n",
    "    # Compute gradients.\n",
    "    gradients = g.gradient(loss, trainable_variables)\n",
    "    \n",
    "    # Update W and b following gradients.\n",
    "    optimizer.apply_gradients(zip(gradients, trainable_variables))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we'll want to train our neural network and measure its accuracy. First let's define some methods for measuring the accuracy of our trained model. \n",
    "\n",
    "correct_prediction will look at the output of our neural network (in digit_weights) and choose the label with the highest value, and see if that agrees with the target label given. During testing, digit_weights will be our prediction based on the test data we give the network, and target_labels is a placeholder that we will assign to our test labels. Ultimately this gives us a 1 for every correct classification, and a 0 for every incorrect classification.\n",
    "\n",
    "\"accuracy\" then takes the average of all the classifications to produce an overall score for our model's accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Accuracy metric.\n",
    "def accuracy(y_pred, y_true):\n",
    "    # Predicted class is the index of highest score in prediction vector (i.e. argmax).\n",
    "    correct_prediction = tf.equal(tf.argmax(y_pred, 1), tf.cast(y_true, tf.int64))\n",
    "    return tf.reduce_mean(tf.cast(correct_prediction, tf.float32), axis=-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's train this thing and see how it works! \n",
    "\n",
    "Tensorflow 2 removed the need to set up a session object an explicitly initialize your varaibles. So we can jump right into training our network in 3000 steps (or \"epochs\", given by training_steps) with batches of 250 samples set up earlier in our training data. At each step, we assign run our optimization function on the current batch of images and labels from the training data.\n",
    "\n",
    "At every 100 epochs (given by display_step), we print out the current values of the loss function and our accuracy metric, by comparing our predicted labels against the known \"true\" labels. To do this we run our neural network using our trained weights and biases at each point on the current batch of training images, and compute cross entropy and accuracy of the resulting predictions (\"pred\") to the known correct labels (\"batch_y\")."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training epoch: 100, Loss: 165.897598, Accuracy: 0.840000\n",
      "Training epoch: 200, Loss: 112.756851, Accuracy: 0.900000\n",
      "Training epoch: 300, Loss: 118.678612, Accuracy: 0.888000\n",
      "Training epoch: 400, Loss: 67.623734, Accuracy: 0.920000\n",
      "Training epoch: 500, Loss: 80.187477, Accuracy: 0.888000\n",
      "Training epoch: 600, Loss: 71.039246, Accuracy: 0.916000\n",
      "Training epoch: 700, Loss: 81.886185, Accuracy: 0.908000\n",
      "Training epoch: 800, Loss: 66.556931, Accuracy: 0.932000\n",
      "Training epoch: 900, Loss: 79.282791, Accuracy: 0.892000\n",
      "Training epoch: 1000, Loss: 78.796959, Accuracy: 0.924000\n",
      "Training epoch: 1100, Loss: 82.835510, Accuracy: 0.908000\n",
      "Training epoch: 1200, Loss: 86.962906, Accuracy: 0.904000\n",
      "Training epoch: 1300, Loss: 53.428635, Accuracy: 0.940000\n",
      "Training epoch: 1400, Loss: 69.819061, Accuracy: 0.908000\n",
      "Training epoch: 1500, Loss: 71.998993, Accuracy: 0.912000\n",
      "Training epoch: 1600, Loss: 59.391376, Accuracy: 0.932000\n",
      "Training epoch: 1700, Loss: 64.994736, Accuracy: 0.932000\n",
      "Training epoch: 1800, Loss: 74.565552, Accuracy: 0.920000\n",
      "Training epoch: 1900, Loss: 49.563606, Accuracy: 0.944000\n",
      "Training epoch: 2000, Loss: 42.567383, Accuracy: 0.944000\n",
      "Training epoch: 2100, Loss: 70.713715, Accuracy: 0.920000\n",
      "Training epoch: 2200, Loss: 63.478588, Accuracy: 0.932000\n",
      "Training epoch: 2300, Loss: 54.348404, Accuracy: 0.900000\n",
      "Training epoch: 2400, Loss: 62.751534, Accuracy: 0.924000\n",
      "Training epoch: 2500, Loss: 65.310669, Accuracy: 0.928000\n",
      "Training epoch: 2600, Loss: 73.908112, Accuracy: 0.916000\n",
      "Training epoch: 2700, Loss: 47.518280, Accuracy: 0.936000\n",
      "Training epoch: 2800, Loss: 46.531921, Accuracy: 0.932000\n",
      "Training epoch: 2900, Loss: 68.977585, Accuracy: 0.924000\n",
      "Training epoch: 3000, Loss: 53.319862, Accuracy: 0.928000\n"
     ]
    }
   ],
   "source": [
    "# Run training for the given number of steps.\n",
    "for step, (batch_x, batch_y) in enumerate(train_data.take(training_steps), 1):\n",
    "    # Run the optimization to update W and b values.\n",
    "    run_optimization(batch_x, batch_y)\n",
    "    \n",
    "    if step % display_step == 0:\n",
    "        pred = neural_net(batch_x)\n",
    "        loss = cross_entropy(pred, batch_y)\n",
    "        acc = accuracy(pred, batch_y)\n",
    "        print(\"Training epoch: %i, Loss: %f, Accuracy: %f\" % (step, loss, acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test Accuracy: 0.931700\n"
     ]
    }
   ],
   "source": [
    "# Test model on validation set.\n",
    "pred = neural_net(x_test)\n",
    "print(\"Test Accuracy: %f\" % accuracy(pred, y_test))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You should have about 93% accuracy. Not bad! But hey, we're just starting.\n",
    "\n",
    "Let's take a look at some of the misclassified images and see just how good or bad our model is, compared to what your own brain can do. We'll go through the first 200 test images and look at the ones that are misclassified:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 5\n",
      "Model prediction: 6\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 4\n",
      "Model prediction: 6\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 6\n",
      "Model prediction: 7\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 2\n",
      "Model prediction: 7\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 9\n",
      "Model prediction: 4\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPsAAAD4CAYAAAAq5pAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAANr0lEQVR4nO3dfahc9Z3H8c/HZ2KN5uGq8YFNjSIr4qZhMOsDxUW3xPyh5g+XKhQVMSUYaKF/GFykEgWD2Gr/WKrp+hDX+lDSiEFDrQTxEapjiCYa2mQ1a1OjuSGBpv/YjX73j3uyXOOdMzdzzswZ832/4DIz53vOnC+TfO6Ze35n5ueIEIDD3xFNNwBgMAg7kARhB5Ig7EAShB1I4qhB7mzmzJkxe/bsQe4SSGX79u3avXu3J6pVCrvtBZJ+IelISf8ZESvK1p89e7ba7XaVXQIo0Wq1OtZ6fhtv+0hJ/yHpSknnSbrO9nm9Ph+A/qryN/uFkrZFxIcR8XdJT0u6up62ANStSthPl/TncY93FMu+wvZi223b7dHR0Qq7A1BFlbBPdBLga9feRsTKiGhFRGtkZKTC7gBUUSXsOySdOe7xGZI+qdYOgH6pEva3JZ1j+9u2j5H0fUlr62kLQN16HnqLiP22l0p6UWNDb49ExPu1dQagVpXG2SNinaR1NfUCoI+4XBZIgrADSRB2IAnCDiRB2IEkCDuQBGEHkiDsQBKEHUiCsANJEHYgCcIOJEHYgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJAg7kARhB5Ig7EAShB1IgrADSRB2IAnCDiRB2IEkCDuQRKUpm21vl7RP0heS9kdEq46mANSvUtgL/xIRu2t4HgB9xNt4IImqYQ9Jv7f9ju3FE61ge7Httu326Ohoxd0B6FXVsF8SEfMkXSnpVtvfPXiFiFgZEa2IaI2MjFTcHYBeVQp7RHxS3O6S9KykC+toCkD9eg677eNtn3DgvqTvSdpcV2MA6lXlbPwpkp61feB5noyI39XSFYDa9Rz2iPhQ0j/V2AuAPmLoDUiCsANJEHYgCcIOJEHYgSTq+CDMUFiyZElpff78+aX1G2+8scZugOHDkR1IgrADSRB2IAnCDiRB2IEkCDuQBGEHkjhsxtkffPDB0vqaNWtK6/PmzSutX3DBBYfcE5q1eXPnr1d44oknSre97bbbSuvTpk3rqacmcWQHkiDsQBKEHUiCsANJEHYgCcIOJEHYgSQOm3H2E088sbTebeqpp59+urR+9tlnd6xNmTKldFv0Zs+ePaX1J598srS+fPnyjrXdu8vnIv30009L64899lhpfRhxZAeSIOxAEoQdSIKwA0kQdiAJwg4kQdiBJA6bcfZun0++6qqrSusrVqworW/btq1jbdmyZaXbnnrqqaX10047rbQ+zD7++OPS+ltvvdWxtm7dutJtX3nlldL6Rx99VFqv4o033ujbczel65Hd9iO2d9nePG7ZdNsv2d5a3H7zPskPJDOZt/GPSVpw0LJlktZHxDmS1hePAQyxrmGPiFclHXzd4tWSVhX3V0m6pua+ANSs1xN0p0TETkkqbk/utKLtxbbbttvdrk8H0D99PxsfESsjohURrZGRkX7vDkAHvYb9M9uzJKm43VVfSwD6odewr5V0Q3H/BknP1dMOgH7pOs5u+ylJl0maaXuHpJ9KWiHpN7ZvlvSxpGv72eRkLFhw8IDBodVffPHF0vrq1as71p5//vnSbY855phK9W7j8J9//nnH2rXXVvun2bt3b2n98ccfL63v27ev0v6bcs01h985565hj4jrOpQur7kXAH3E5bJAEoQdSIKwA0kQdiAJwg4k4YgY2M5arVa02+2B7e9Q3HHHHaX1hx56qGOt29cSZ7Zo0aKOtddff71026qXVx91VOfBpnvuuad021tuuaW0PnXq1J566rdWq6V2u+2JahzZgSQIO5AEYQeSIOxAEoQdSIKwA0kQdiCJw+arpKu66667SusLFy7sWHvmmWdKt121alVp/bjjjiutz5gxo7T+wQcfdKyVjTVPxk033VRav/zy8g8/Pvroox1rVT/+evTRR5fWX3755Y61iy++uNK+v4k4sgNJEHYgCcIOJEHYgSQIO5AEYQeSIOxAEoyzT9JFF13UU02SHnjggUr7fvPNN0vrZdMmT58+vdK+r7jiitL6/fffX1rv9hXdVSxfvry0nnEsvQxHdiAJwg4kQdiBJAg7kARhB5Ig7EAShB1IgnH2b4Bu48X9HE/uNq/A2rVr+7bvmTNnltaXLFnSt30fjroe2W0/YnuX7c3jlt1p+y+2NxY/nb/ZAcBQmMzb+MckLZhg+f0RMbf4WVdvWwDq1jXsEfGqpD0D6AVA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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 7\n",
      "Model prediction: 4\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 2\n",
      "Model prediction: 9\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 9\n",
      "Model prediction: 3\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Labels: 3\n",
      "Model prediction: 5\n"
     ]
    }
   ],
   "source": [
    "n_images = 200\n",
    "test_images = x_test[:n_images]\n",
    "test_labels = y_test[:n_images]\n",
    "predictions = neural_net(test_images)\n",
    "\n",
    "for i in range(n_images):\n",
    "    model_prediction = np.argmax(predictions.numpy()[i])\n",
    "    if (model_prediction != test_labels[i]):\n",
    "        plt.imshow(np.reshape(test_images[i], [28, 28]), cmap='gray_r')\n",
    "        plt.show()\n",
    "        print(\"Original Labels: %i\" % test_labels[i])\n",
    "        print(\"Model prediction: %i\" % model_prediction)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To be honest, I'd be a little unsure about some of those myself!\n",
    "\n",
    "## Exercise\n",
    "\n",
    "See if you can improve upon the accuracy. Try using more hidden neurons (nodes). Try using fewer! Try a different learning rate. Try adding another hidden layer. Try different batch sizes. What's the best accuracy you can get from this multi-layer perceptron?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "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.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}