Skip to content
Snippets Groups Projects
08_neural_networks.ipynb 433 KiB
Newer Older
  • Learn to ignore specific revisions
  • chadhat's avatar
    chadhat committed
    {
     "cells": [
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": null,
    
    chadhat's avatar
    chadhat committed
       "metadata": {},
       "outputs": [],
       "source": [
        "# IGNORE THIS CELL WHICH CUSTOMIZES LAYOUT AND STYLING OF THE NOTEBOOK !\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "%config InlineBackend.figure_format = 'retina'\n",
        "import warnings\n",
        "warnings.filterwarnings('ignore', category=FutureWarning)\n",
        "#from IPython.core.display import HTML; HTML(open(\"custom.html\", \"r\").read())"
       ]
      },
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "# Introduction to Neural Networks\n",
        "\n",
    
    schmittu's avatar
    schmittu committed
        "\n",
        "\n",
        "<img src=\"https://i.imgflip.com/3042en.jpg\" title=\"made at imgflip.com\" width=35%/>\n",
        "\n",
        "\n",
    
    chadhat's avatar
    chadhat committed
        "## TO DO: Almost all the figues and schematics will be replaced or improved slowly\n",
        "\n",
    
        "<center>\n",
        "<figure>\n",
    
    schmittu's avatar
    schmittu committed
        "<img src=\"./images/neuralnets/neural_net_ex.svg\" width=\"50%\"/>\n",
    
        "<figcaption>A 3 layer Neural Network (By convention the input layer is not counted).</figcaption>\n",
        "</figure>\n",
        "</center>"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## History of Neural networks\n",
        "\n",
        "**TODO: Make it more complete and format properly**\n",
        "\n",
        "1943 - Threshold Logic\n",
        "\n",
        "1940s - Hebbian Learning\n",
        "\n",
        "1958 - Perceptron\n",
        "\n",
        "1975 - Backpropagation\n",
        "\n",
        "1980s - Neocognitron\n",
        "\n",
        "1982: Hopfield Network\n",
        "\n",
        "1986: Convolutional Neural Networks\n",
        "\n",
        "1997: Long-short term memory (LSTM) model\n",
        "\n",
    
        "2014: Gated Recurrent Units, Generative Adversarial Networks(Check)?"
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Why the boom now?\n",
        "* Data\n",
        "* Data\n",
        "* Data\n",
        "* Availability of GPUs\n",
        "* Algorithmic developments which allow for efficient training and training for deeper networks\n",
        "* Much easier access than a decade ago"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Building blocks\n",
        "### Perceptron\n",
        "\n",
    
        "The smallest unit of a neural network is a **perceptron** like node.\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "**What is a Perceptron?**\n",
        "\n",
    
        "It is a simple function which can have multiple inputs and has a single output.\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
    
        "<center>\n",
        "<figure>\n",
        "<img src=\"./images/neuralnets/perceptron_ex.svg\" width=\"400\"/>\n",
        "<figcaption>A simple perceptron with 3 inputs and 1 output.</figcaption>\n",
        "</figure>\n",
        "</center>\n",
        "\n",
        "\n",
        "It works as follows: \n",
        "\n",
        "Step 1: A **weighted sum** of the inputs is calculated\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "\\begin{equation*}\n",
        "weighted\\_sum = \\sum_{k=1}^{num\\_inputs} w_{i} x_{i}\n",
        "\\end{equation*}\n",
        "\n",
    
        "Step 2: A **step** activation function is applied\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "$$\n",
        "f(weighted\\_sum) = \\left\\{\n",
        "        \\begin{array}{ll}\n",
    
        "            0 & \\quad weighted\\_sum < threshold \\\\\n",
        "            1 & \\quad weighted\\_sum \\geq threshold\n",
    
    chadhat's avatar
    chadhat committed
        "        \\end{array}\n",
        "    \\right.\n",
        "$$\n",
    
        "\n",
        "You can see that this is also a linear classifier as we introduced in script 02."
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 1,
    
    chadhat's avatar
    chadhat committed
       "metadata": {},
       "outputs": [],
       "source": [
        "%matplotlib inline\n",
    
        "%config IPCompleter.greedy=True\n",
    
    chadhat's avatar
    chadhat committed
        "import matplotlib as mpl\n",
    
        "mpl.rcParams['lines.linewidth'] = 3\n",
        "#mpl.rcParams['font.size'] = 16"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 2,
    
    chadhat's avatar
    chadhat committed
       "metadata": {},
    
    chadhat's avatar
    chadhat committed
       "outputs": [],
    
    chadhat's avatar
    chadhat committed
       "source": [
        "import numpy as np\n",
    
        "import matplotlib.pyplot as plt\n",
        "\n",
        "\n",
    
    chadhat's avatar
    chadhat committed
        "def perceptron(X, w, threshold=1):\n",
    
        "    # This function computes sum(w_i*x_i) and\n",
    
    chadhat's avatar
    chadhat committed
        "    # applies a perceptron activation\n",
    
        "    linear_sum = np.dot(X, w)\n",
        "    output = 0\n",
    
    chadhat's avatar
    chadhat committed
        "    if linear_sum >= threshold:\n",
        "        output = 1\n",
    
    chadhat's avatar
    chadhat committed
        "    return output"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "#### Boolean AND\n",
        "\n",
        "| x$_1$ | x$_2$ | output |\n",
        "| --- | --- | --- |\n",
        "| 0 | 0 | 0 |\n",
        "| 1 | 0 | 0 |\n",
        "| 0 | 1 | 0 |\n",
        "| 1 | 1 | 1 |"
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 3,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "Perceptron output for x1, x2 =  [0, 0]  is  0\n",
          "Perceptron output for x1, x2 =  [1, 0]  is  0\n",
          "Perceptron output for x1, x2 =  [0, 1]  is  0\n",
          "Perceptron output for x1, x2 =  [1, 1]  is  1\n"
         ]
        }
       ],
    
    chadhat's avatar
    chadhat committed
       "source": [
        "# Calculating Boolean AND using a perceptron\n",
    
        "threshold = 1.5\n",
    
        "w = [1, 1]\n",
        "X = [[0, 0], [1, 0], [0, 1], [1, 1]]\n",
    
    chadhat's avatar
    chadhat committed
        "for i in X:\n",
    
        "    print(\"Perceptron output for x1, x2 = \", i,\n",
        "          \" is \", perceptron(i, w, threshold))"
    
    chadhat's avatar
    chadhat committed
       ]
      },
    
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "In this simple case we can rewrite our equation to $x_2 = ...... $ which describes a line in 2D:"
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 7,
    
       "metadata": {},
       "outputs": [],
       "source": [
    
    chadhat's avatar
    chadhat committed
        "def perceptron_DB(X, w, threshold):\n",
    
        "    # Plotting the decision boundary\n",
        "    for i in X:\n",
        "        plt.plot(i, \"o\", color=\"b\")\n",
        "    plt.xlim(-1, 2)\n",
        "    plt.ylim(-1, 2)\n",
        "    # The decision boundary is a line given by\n",
        "    # w_1*x_1+w_2*x_2-threshold=0\n",
        "    x1 = np.arange(-3, 4)\n",
        "    x2 = (threshold - x1*w[0])/w[1]\n",
        "    plt.plot(x1, x2, \"--\", color=\"black\")\n",
        "    plt.xlabel(\"x$_1$\", fontsize=16)\n",
        "    plt.ylabel(\"x$_2$\", fontsize=16)"
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 8,
       "metadata": {},
       "outputs": [
        {
         "data": {
          "image/png": "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\n",
          "text/plain": [
           "<matplotlib.figure.Figure at 0x7fe7148256d8>"
          ]
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ],
    
    chadhat's avatar
    chadhat committed
       "source": [
    
    chadhat's avatar
    chadhat committed
        "perceptron_DB(X, w, threshold)"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
        "**Exercise 1 : Compute a Boolean \"OR\" using a perceptron?**\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "Hint: copy the code from the \"AND\" example and edit the weights and/or threshold"
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "#### Boolean OR\n",
        "\n",
        "| x$_1$ | x$_2$ | output |\n",
        "| --- | --- | --- |\n",
        "| 0 | 0 | 0 |\n",
        "| 1 | 0 | 1 |\n",
        "| 0 | 1 | 1 |\n",
        "| 1 | 1 | 1 |"
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 9,
    
    chadhat's avatar
    chadhat committed
       "metadata": {},
       "outputs": [],
       "source": [
        "# Calculating Boolean OR using a perceptron\n",
        "# Edit the code below"
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 11,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "Perceptron output for x1, x2 =  [0, 0]  is  0\n",
          "Perceptron output for x1, x2 =  [1, 0]  is  1\n",
          "Perceptron output for x1, x2 =  [0, 1]  is  1\n",
          "Perceptron output for x1, x2 =  [1, 1]  is  1\n"
         ]
        },
        {
         "data": {
          "image/png": "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\n",
          "text/plain": [
           "<matplotlib.figure.Figure at 0x7fe7145e6c50>"
          ]
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ],
    
    chadhat's avatar
    chadhat committed
       "source": [
        "# Solution\n",
        "# Calculating Boolean OR using a perceptron\n",
        "threshold=0.6\n",
        "w=[1,1]\n",
        "X=[[0,0],[1,0],[0,1],[1,1]]\n",
        "for i in X:\n",
    
        "    print(\"Perceptron output for x1, x2 = \" , i , \" is \" , perceptron(i,w,threshold))\n",
    
    chadhat's avatar
    chadhat committed
        "# Plotting the decision boundary\n",
    
    chadhat's avatar
    chadhat committed
        "perceptron_DB(X,w,threshold)"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
        "**Exercise 2 : Create a NAND gate using a perceptron**\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "#### Boolean NAND\n",
        "\n",
        "| x$_1$ | x$_2$ | output |\n",
        "| --- | --- | --- |\n",
        "| 0 | 0 | 1 |\n",
        "| 1 | 0 | 1 |\n",
        "| 0 | 1 | 1 |\n",
        "| 1 | 1 | 0 |"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": null,
    
    chadhat's avatar
    chadhat committed
       "metadata": {},
       "outputs": [],
       "source": [
    
        "# Calculating Boolean NAND using a perceptron"
    
    chadhat's avatar
    chadhat committed
       ]
      },
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": null,
       "metadata": {},
       "outputs": [],
    
    chadhat's avatar
    chadhat committed
       "source": [
        "# Solution\n",
        "# Calculating Boolean OR using a perceptron\n",
        "import matplotlib.pyplot as plt\n",
        "threshold=-1.5\n",
        "w=[-1,-1]\n",
        "X=[[0,0],[1,0],[0,1],[1,1]]\n",
        "for i in X:\n",
        "    print(\"Perceptron output for x1, x2 = \" , i , \" is \" , perceptron(i,w,threshold))\n",
        "# Plotting the decision boundary\n",
        "perceptron_DB(X,w)"
       ]
      },
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
        "In fact, a single perceptron can compute \"AND\", \"OR\" and \"NOT\" boolean functions.\n",
    
    chadhat's avatar
    chadhat committed
        "However, it cannot compute some other boolean functions such as \"XOR\"\n",
        "\n",
    
        "**WHAT CAN WE DO?**\n",
        "\n",
        "\n",
        "Hint: Think about what is the significance of the NAND gate we created above?\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
    
        "We said a single perceptron can't compute these functions. We didn't say that about **multiple Perceptrons**."
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
        "**XOR function using multiple perceptrons**\n",
        "\n",
        "<center>\n",
        "<figure>\n",
        "<img src=\"./images/neuralnets/perceptron_XOR.svg\" width=\"400\"/>\n",
        "<figcaption>Multiple perceptrons put together to output a XOR function.</figcaption>\n",
        "</figure>\n",
        "</center>"
    
    chadhat's avatar
    chadhat committed
       ]
      },
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "code",
       "execution_count": null,
       "metadata": {},
       "outputs": [],
       "source": [
        "### Multi-layer perceptrons\n"
       ]
      },
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
        "### Google Playground\n",
        "\n",
        "https://playground.tensorflow.org/\n",
        "\n",
        "<img src=\"./images/neuralnets/google_playground.png\"/>"
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "## Learning\n",
        "\n",
        "Now we know that we can compute complex functions if we stack together a number of perceptrons.\n",
        "\n",
    
    chadhat's avatar
    chadhat committed
        "However, we definitely **DO NOT** want to set the weights and thresholds by hand as we did in the examples above.\n",
    
        "\n",
        "We want some algorithm to do this for us!\n",
        "\n",
        "In order to achieve this we first need to choose a loss function for the problem at hand\n",
        "\n",
        "\n",
        "### Loss function\n",
    
    chadhat's avatar
    chadhat committed
        "In order to learn using an algorithm for learning we need to define a quantity which allows us to measure how far are the predictions of our network/setup are from the reality. This is done by choosing a so-called \"Loss function\" (as in the case for other machine learning algorithms). In other words this function measures how close are the predictions of our network to the supplied labels. Once we have this function we need an algorithm to update the weights of the network such that this loss decreases. As one can already imagine the choice of an appropriate loss function is very important to the success of the model. Fortunately, for classification and regression (which cover a large variety of probelms) these loss functions are well known. \n",
        "\n",
        "Generally **crossentropy** and **mean squared error** loss functions are used for classification and regression problems, respectively.\n",
    
        "\n",
        "### Gradient based learning\n",
    
    chadhat's avatar
    chadhat committed
        "As mentioned above, once we have decided upon a loss function, we want to solve an **optimization problem** which minimizes this loss by updating the weights of the network. This is how learning happens in a NN.\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
    
    chadhat's avatar
    chadhat committed
        "The most popular optimization methods used in Neural Network training are some **Gradient-descent (GD)** type methods, such as gradient-descent, RMSprop and Adam. \n",
    
    chadhat's avatar
    chadhat committed
        "**Gradient-descent** uses partial derivatives of the loss function with respect to the network weights and a learning rate to updates the weights such that the loss function decreases and hopefully after some iterations reaches its (Global) minimum.\n",
        "\n",
    
    chadhat's avatar
    chadhat committed
        "First, the loss function and its derivative are computed at the output node, and this signal is propagated backwards, using the chain rule, in the network to compute the partial derivatives. Hence, this method is called **Backpropagation**.\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
    
    chadhat's avatar
    chadhat committed
        "One way to perform a single GD pass is to compute the partial derivatives using all the samples in our data, computing average derivatives and using them to update the weights. This is called **Batch gradient descent**. However, in deep learning we mostly work with very big datasets and using batch gradient descent can make the training very slow!\n",
    
    chadhat's avatar
    chadhat committed
        "The other extreme is to randomly shuffle the dataset and advance a pass of GD with the gradients computed using only **one** sample at a time. This is called **Stochastic gradient descent**.\n",
        "\n",
        "In practice, an approach in-between these two is used. The entire dataset is divided into **m** batches and these are used one by one to compute the derivatives and apply GD. This technique is called **Mini-batch gradient descent**. \n",
        "\n",
        "One pass through the entire training dataset is called **1 epoch** of training.\n",
    
        "\n",
        "\n",
    
    chadhat's avatar
    chadhat committed
        "### Activation Functions\n",
        "\n",
    
        "In order to train the network we need to change Perceptron's **step** activation function as it does not allow training using the back-propagation algorithm among other drawbacks.\n",
        "\n",
        "Non-Linear functions such as:\n",
        "\n",
        "* ReLU (Rectified linear unit)\n",
        "\n",
        "\\begin{equation*}\n",
        "f(z) = \\mathrm{max}(0,z)\n",
        "\\end{equation*}\n",
        "\n",
        "* Sigmoid\n",
        "\n",
        "\\begin{equation*}\n",
        "f(z) = \\frac{1}{1+e^{-z}}\n",
        "\\end{equation*}\n",
        "\n",
        "* tanh\n",
        "\n",
        "\\begin{equation*}\n",
        "f(z) = \\frac{e^{z} - e^{-z}}{e^{z} + e^{-z}}\n",
        "\\end{equation*}\n",
        "\n",
        "\n",
        "are some of the most popular choices used as activation functions.\n",
        "\n",
        "Linear activations are **NOT** used because it can be mathematically shown that if linear activations are used then output is just a linear function of the input. So adding any number of hidden layers does not help to learn interesting functions.\n",
        "\n",
        "Non-linear activation functions allow the network to learn more complex representations."
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 12,
       "metadata": {},
       "outputs": [
        {
         "data": {
          "image/png": "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\n",
          "text/plain": [
           "<matplotlib.figure.Figure at 0x7fe71452e0b8>"
          ]
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ],
    
    chadhat's avatar
    chadhat committed
       "source": [
        "import matplotlib.pyplot as plt\n",
        "import numpy as np\n",
        "\n",
    
        "plt.figure(figsize=(10, 4))\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "pts=np.arange(-20,20, 0.1)\n",
        "\n",
    
        "plt.subplot(1, 3, 1)\n",
    
    chadhat's avatar
    chadhat committed
        "# Sigmoid\n",
    
        "plt.plot(pts, 1/(1+np.exp(-pts))) ;\n",
        "\n",
        "plt.subplot(1, 3, 2)\n",
    
    chadhat's avatar
    chadhat committed
        "# tanh\n",
    
        "plt.plot(pts, np.tanh(pts*np.pi)) ;\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "# Rectified linear unit (ReLu)\n",
    
        "plt.subplot(1, 3, 3)\n",
    
    chadhat's avatar
    chadhat committed
        "pts_relu=[max(0,i) for i in pts];\n",
    
        "plt.plot(pts, pts_relu) ;"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "# Introduction to Keras"
       ]
      },
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
    
        "### What is Keras?\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
        "* It is a high level API to create and work with neural networks\n",
    
        "* Supports multiple backends such as TensorFlow from Google, Theano (Although Theano is dead now) and CNTK (Microsoft Cognitive Toolkit)\n",
        "* Very good for creating neural nets very quickly and hides away a lot of tedious work\n",
        "* Has been incorporated into official TensorFlow (which obviously only works with tensforflow) and as of TensorFlow 2.0 this will the main api to use TensorFlow (check reference)\n"
    
    chadhat's avatar
    chadhat committed
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 13,
       "metadata": {},
       "outputs": [
        {
         "name": "stderr",
         "output_type": "stream",
         "text": [
          "Using TensorFlow backend.\n"
         ]
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "_________________________________________________________________\n",
          "Layer (type)                 Output Shape              Param #   \n",
          "=================================================================\n",
          "dense_1 (Dense)              (None, 4)                 36        \n",
          "_________________________________________________________________\n",
          "activation_1 (Activation)    (None, 4)                 0         \n",
          "_________________________________________________________________\n",
          "dense_2 (Dense)              (None, 4)                 20        \n",
          "_________________________________________________________________\n",
          "dense_3 (Dense)              (None, 1)                 5         \n",
          "_________________________________________________________________\n",
          "activation_2 (Activation)    (None, 1)                 0         \n",
          "=================================================================\n",
          "Total params: 61\n",
          "Trainable params: 61\n",
          "Non-trainable params: 0\n",
          "_________________________________________________________________\n"
         ]
        }
       ],
    
    chadhat's avatar
    chadhat committed
       "source": [
        "# Say hello to keras\n",
        "\n",
        "from keras.models import Sequential\n",
        "from keras.layers import Dense, Activation\n",
        "\n",
        "# Creating a model\n",
        "model = Sequential()\n",
        "\n",
        "# Adding layers to this model\n",
        "# 1st Hidden layer\n",
    
        "# A Dense/fully-connected layer which takes as input a \n",
        "# feature array of shape (samples, num_features)\n",
        "# Here input_shape = (8,) means that the layer expects an input with num_features = 8 \n",
        "# and the sample size could be anything\n",
        "# Then we specify an activation function\n",
        "model.add(Dense(units=4, input_shape=(8,)))\n",
    
    chadhat's avatar
    chadhat committed
        "model.add(Activation(\"relu\"))\n",
        "\n",
    
        "# 2nd Hidden layer\n",
        "# This is also a fully-connected layer and we do not need to specify the\n",
        "# shape of the input anymore (We need to do that only for the first layer)\n",
    
    chadhat's avatar
    chadhat committed
        "# NOTE: Now we didn't add the activation seperately. Instead we just added it\n",
    
        "# while calling Dense(). This and the way used for the first layer are Equivalent!\n",
        "model.add(Dense(units=4, activation=\"relu\"))\n",
        "\n",
        "          \n",
    
    chadhat's avatar
    chadhat committed
        "# The output layer\n",
        "model.add(Dense(units=1))\n",
        "model.add(Activation(\"sigmoid\"))\n",
        "\n",
        "model.summary()"
       ]
      },
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "markdown",
       "metadata": {},
       "source": [
        "### XOR using neural networks"
       ]
      },
    
    chadhat's avatar
    chadhat committed
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 14,
    
    chadhat's avatar
    chadhat committed
       "metadata": {},
       "outputs": [],
    
    chadhat's avatar
    chadhat committed
       "source": [
    
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt\n",
        "from sklearn.model_selection import train_test_split\n",
        "from keras.models import Sequential\n",
        "from keras.layers import Dense\n",
        "import numpy as np"
    
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 15,
       "metadata": {},
       "outputs": [
        {
         "data": {
          "image/png": "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\n",
          "text/plain": [
           "<matplotlib.figure.Figure at 0x7fe736cb4160>"
          ]
         },
         "metadata": {
          "needs_background": "light"
         },
         "output_type": "display_data"
        }
       ],
    
    chadhat's avatar
    chadhat committed
       "source": [
    
        "# Creating a network to solve the XOR problem\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
    
        "# Loading and plotting the data\n",
        "xor = pd.read_csv(\"xor.csv\")\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
    
        "# Using x and y coordinates as featues\n",
        "features = xor.iloc[:, :-1]\n",
        "# Convert boolean to integer values (True->1 and False->0)\n",
        "labels = xor.iloc[:, -1].astype(int)\n",
    
    chadhat's avatar
    chadhat committed
        "\n",
    
        "colors = [[\"steelblue\", \"chocolate\"][i] for i in xor[\"label\"]]\n",
        "plt.figure(figsize=(5, 5))\n",
        "plt.xlim([-2, 2])\n",
        "plt.ylim([-2, 2])\n",
        "plt.title(\"Blue points are False\")\n",
    
        "\n",
        "\n",
    
    chadhat's avatar
    chadhat committed
        "plt.scatter(features[\"x\"], features[\"y\"], color=colors, marker=\"o\") ;"
    
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 16,
    
       "metadata": {},
       "outputs": [],
       "source": [
    
        "# Building a Keras model\n",
    
        "def a_simple_NN():\n",
        "    \n",
        "    model = Sequential()\n",
    
        "    model.add(Dense(4, input_shape = (2,), activation = \"relu\"))\n",
        "\n",
        "    model.add(Dense(4, activation = \"relu\"))\n",
        "\n",
        "    model.add(Dense(1, activation = \"sigmoid\"))\n",
        "\n",
        "    model.compile(loss=\"binary_crossentropy\", optimizer=\"rmsprop\", metrics=[\"accuracy\"])\n",
        "    \n",
        "    return model"
    
       ]
      },
      {
       "cell_type": "code",
    
    chadhat's avatar
    chadhat committed
       "execution_count": 17,
       "metadata": {},
       "outputs": [
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "Train on 350 samples, validate on 150 samples\n",
          "Epoch 1/300\n",
          "350/350 [==============================] - 0s 1ms/step - loss: 0.8080 - acc: 0.4886 - val_loss: 0.8082 - val_acc: 0.4600\n",
          "Epoch 2/300\n",
          "350/350 [==============================] - 0s 92us/step - loss: 0.7893 - acc: 0.4800 - val_loss: 0.7937 - val_acc: 0.4533\n",
          "Epoch 3/300\n",
          "350/350 [==============================] - 0s 104us/step - loss: 0.7744 - acc: 0.4771 - val_loss: 0.7807 - val_acc: 0.4400\n",
          "Epoch 4/300\n",
          "350/350 [==============================] - 0s 71us/step - loss: 0.7610 - acc: 0.4686 - val_loss: 0.7687 - val_acc: 0.4133\n",
          "Epoch 5/300\n",
          "350/350 [==============================] - 0s 60us/step - loss: 0.7487 - acc: 0.4457 - val_loss: 0.7580 - val_acc: 0.4067\n",
          "Epoch 6/300\n",
          "350/350 [==============================] - 0s 61us/step - loss: 0.7369 - acc: 0.4343 - val_loss: 0.7469 - val_acc: 0.4133\n",
          "Epoch 7/300\n",
          "350/350 [==============================] - 0s 62us/step - loss: 0.7254 - acc: 0.4314 - val_loss: 0.7366 - val_acc: 0.4067\n",
          "Epoch 8/300\n",
          "350/350 [==============================] - 0s 58us/step - loss: 0.7143 - acc: 0.4286 - val_loss: 0.7269 - val_acc: 0.4000\n",
          "Epoch 9/300\n",
          "350/350 [==============================] - 0s 61us/step - loss: 0.7035 - acc: 0.4314 - val_loss: 0.7171 - val_acc: 0.4067\n",
          "Epoch 10/300\n",
          "350/350 [==============================] - 0s 94us/step - loss: 0.6932 - acc: 0.4743 - val_loss: 0.7080 - val_acc: 0.4400\n",
          "Epoch 11/300\n",
          "350/350 [==============================] - 0s 64us/step - loss: 0.6828 - acc: 0.5086 - val_loss: 0.6983 - val_acc: 0.4933\n",
          "Epoch 12/300\n",
          "350/350 [==============================] - 0s 74us/step - loss: 0.6725 - acc: 0.5600 - val_loss: 0.6885 - val_acc: 0.5333\n",
          "Epoch 13/300\n",
          "350/350 [==============================] - 0s 223us/step - loss: 0.6623 - acc: 0.6200 - val_loss: 0.6793 - val_acc: 0.5533\n",
          "Epoch 14/300\n",
          "350/350 [==============================] - 0s 257us/step - loss: 0.6528 - acc: 0.6543 - val_loss: 0.6709 - val_acc: 0.5667\n",
          "Epoch 15/300\n",
          "350/350 [==============================] - 0s 125us/step - loss: 0.6435 - acc: 0.6714 - val_loss: 0.6628 - val_acc: 0.5800\n",
          "Epoch 16/300\n",
          "350/350 [==============================] - 0s 158us/step - loss: 0.6344 - acc: 0.6886 - val_loss: 0.6545 - val_acc: 0.6067\n",
          "Epoch 17/300\n",
          "350/350 [==============================] - 0s 161us/step - loss: 0.6252 - acc: 0.6971 - val_loss: 0.6463 - val_acc: 0.6400\n",
          "Epoch 18/300\n",
          "350/350 [==============================] - 0s 215us/step - loss: 0.6167 - acc: 0.7314 - val_loss: 0.6391 - val_acc: 0.6667\n",
          "Epoch 19/300\n",
          "350/350 [==============================] - 0s 105us/step - loss: 0.6083 - acc: 0.7400 - val_loss: 0.6317 - val_acc: 0.6867\n",
          "Epoch 20/300\n",
          "350/350 [==============================] - 0s 183us/step - loss: 0.5999 - acc: 0.7657 - val_loss: 0.6240 - val_acc: 0.7267\n",
          "Epoch 21/300\n",
          "350/350 [==============================] - 0s 74us/step - loss: 0.5920 - acc: 0.7886 - val_loss: 0.6170 - val_acc: 0.7267\n",
          "Epoch 22/300\n",
          "350/350 [==============================] - 0s 164us/step - loss: 0.5842 - acc: 0.8114 - val_loss: 0.6103 - val_acc: 0.7667\n",
          "Epoch 23/300\n",
          "350/350 [==============================] - 0s 85us/step - loss: 0.5768 - acc: 0.8229 - val_loss: 0.6039 - val_acc: 0.8067\n",
          "Epoch 24/300\n",
          "350/350 [==============================] - 0s 80us/step - loss: 0.5691 - acc: 0.8314 - val_loss: 0.5972 - val_acc: 0.8200\n",
          "Epoch 25/300\n",
          "350/350 [==============================] - 0s 208us/step - loss: 0.5614 - acc: 0.8343 - val_loss: 0.5904 - val_acc: 0.8133\n",
          "Epoch 26/300\n",
          "350/350 [==============================] - 0s 191us/step - loss: 0.5538 - acc: 0.8343 - val_loss: 0.5837 - val_acc: 0.8133\n",
          "Epoch 27/300\n",
          "350/350 [==============================] - 0s 330us/step - loss: 0.5460 - acc: 0.8400 - val_loss: 0.5770 - val_acc: 0.8133\n",
          "Epoch 28/300\n",
          "350/350 [==============================] - 0s 93us/step - loss: 0.5384 - acc: 0.8457 - val_loss: 0.5706 - val_acc: 0.8200\n",
          "Epoch 29/300\n",
          "350/350 [==============================] - 0s 140us/step - loss: 0.5309 - acc: 0.8514 - val_loss: 0.5641 - val_acc: 0.8267\n",
          "Epoch 30/300\n",
          "350/350 [==============================] - 0s 79us/step - loss: 0.5234 - acc: 0.8600 - val_loss: 0.5575 - val_acc: 0.8267\n",
          "Epoch 31/300\n",
          "350/350 [==============================] - 0s 72us/step - loss: 0.5160 - acc: 0.8571 - val_loss: 0.5509 - val_acc: 0.8333\n",
          "Epoch 32/300\n",
          "350/350 [==============================] - 0s 67us/step - loss: 0.5084 - acc: 0.8600 - val_loss: 0.5439 - val_acc: 0.8333\n",
          "Epoch 33/300\n",
          "350/350 [==============================] - 0s 76us/step - loss: 0.5009 - acc: 0.8657 - val_loss: 0.5373 - val_acc: 0.8333\n",
          "Epoch 34/300\n",
          "350/350 [==============================] - 0s 68us/step - loss: 0.4933 - acc: 0.8629 - val_loss: 0.5306 - val_acc: 0.8333\n",
          "Epoch 35/300\n",
          "350/350 [==============================] - 0s 78us/step - loss: 0.4858 - acc: 0.8657 - val_loss: 0.5238 - val_acc: 0.8400\n",
          "Epoch 36/300\n",
          "350/350 [==============================] - 0s 76us/step - loss: 0.4780 - acc: 0.8657 - val_loss: 0.5167 - val_acc: 0.8400\n",
          "Epoch 37/300\n",
          "350/350 [==============================] - 0s 82us/step - loss: 0.4702 - acc: 0.8714 - val_loss: 0.5096 - val_acc: 0.8400\n",
          "Epoch 38/300\n",
          "350/350 [==============================] - 0s 72us/step - loss: 0.4620 - acc: 0.8714 - val_loss: 0.5022 - val_acc: 0.8400\n",
          "Epoch 39/300\n",
          "350/350 [==============================] - 0s 84us/step - loss: 0.4538 - acc: 0.8743 - val_loss: 0.4949 - val_acc: 0.8400\n",
          "Epoch 40/300\n",
          "350/350 [==============================] - 0s 270us/step - loss: 0.4455 - acc: 0.8800 - val_loss: 0.4874 - val_acc: 0.8400\n",
          "Epoch 41/300\n",
          "350/350 [==============================] - 0s 76us/step - loss: 0.4378 - acc: 0.8829 - val_loss: 0.4800 - val_acc: 0.8467\n",
          "Epoch 42/300\n",
          "350/350 [==============================] - 0s 195us/step - loss: 0.4297 - acc: 0.8914 - val_loss: 0.4723 - val_acc: 0.8467\n",
          "Epoch 43/300\n",
          "350/350 [==============================] - 0s 255us/step - loss: 0.4219 - acc: 0.8914 - val_loss: 0.4651 - val_acc: 0.8467\n",
          "Epoch 44/300\n",
          "350/350 [==============================] - 0s 115us/step - loss: 0.4142 - acc: 0.8914 - val_loss: 0.4577 - val_acc: 0.8533\n",
          "Epoch 45/300\n",
          "350/350 [==============================] - 0s 138us/step - loss: 0.4067 - acc: 0.9000 - val_loss: 0.4506 - val_acc: 0.8600\n",
          "Epoch 46/300\n",
          "350/350 [==============================] - 0s 232us/step - loss: 0.3998 - acc: 0.8971 - val_loss: 0.4441 - val_acc: 0.8600\n",
          "Epoch 47/300\n",
          "350/350 [==============================] - 0s 211us/step - loss: 0.3922 - acc: 0.9000 - val_loss: 0.4371 - val_acc: 0.8667\n",
          "Epoch 48/300\n",
          "350/350 [==============================] - 0s 201us/step - loss: 0.3847 - acc: 0.9114 - val_loss: 0.4300 - val_acc: 0.8667\n",
          "Epoch 49/300\n",
          "350/350 [==============================] - 0s 236us/step - loss: 0.3774 - acc: 0.9057 - val_loss: 0.4231 - val_acc: 0.8667\n",
          "Epoch 50/300\n",
          "350/350 [==============================] - 0s 155us/step - loss: 0.3700 - acc: 0.9114 - val_loss: 0.4160 - val_acc: 0.8667\n",
          "Epoch 51/300\n",
          "350/350 [==============================] - 0s 325us/step - loss: 0.3626 - acc: 0.9171 - val_loss: 0.4100 - val_acc: 0.8667\n",
          "Epoch 52/300\n",
          "350/350 [==============================] - 0s 130us/step - loss: 0.3555 - acc: 0.9114 - val_loss: 0.4031 - val_acc: 0.8667\n",
          "Epoch 53/300\n",
          "350/350 [==============================] - 0s 124us/step - loss: 0.3489 - acc: 0.9229 - val_loss: 0.3968 - val_acc: 0.8667\n",
          "Epoch 54/300\n",
          "350/350 [==============================] - 0s 109us/step - loss: 0.3422 - acc: 0.9257 - val_loss: 0.3905 - val_acc: 0.8733\n",
          "Epoch 55/300\n",
          "350/350 [==============================] - 0s 100us/step - loss: 0.3356 - acc: 0.9257 - val_loss: 0.3842 - val_acc: 0.8733\n",
          "Epoch 56/300\n",
          "350/350 [==============================] - 0s 61us/step - loss: 0.3291 - acc: 0.9257 - val_loss: 0.3781 - val_acc: 0.8733\n",
          "Epoch 57/300\n",
          "350/350 [==============================] - 0s 75us/step - loss: 0.3225 - acc: 0.9257 - val_loss: 0.3719 - val_acc: 0.8800\n",
          "Epoch 58/300\n",
          "350/350 [==============================] - 0s 90us/step - loss: 0.3160 - acc: 0.9257 - val_loss: 0.3655 - val_acc: 0.8800\n",
          "Epoch 59/300\n",
          "350/350 [==============================] - 0s 73us/step - loss: 0.3096 - acc: 0.9314 - val_loss: 0.3596 - val_acc: 0.8800\n",
          "Epoch 60/300\n",
          "350/350 [==============================] - 0s 76us/step - loss: 0.3036 - acc: 0.9314 - val_loss: 0.3541 - val_acc: 0.8800\n",
    
    schmittu's avatar
    schmittu committed
          "Epoch 61/300\n",
    
    chadhat's avatar
    chadhat committed
          "350/350 [==============================] - 0s 90us/step - loss: 0.2978 - acc: 0.9371 - val_loss: 0.3487 - val_acc: 0.8800\n",
          "Epoch 62/300\n",
          "350/350 [==============================] - 0s 116us/step - loss: 0.2921 - acc: 0.9343 - val_loss: 0.3434 - val_acc: 0.8800\n",
          "Epoch 63/300\n",
          "350/350 [==============================] - 0s 93us/step - loss: 0.2866 - acc: 0.9343 - val_loss: 0.3380 - val_acc: 0.8800\n",
          "Epoch 64/300\n",
          "350/350 [==============================] - 0s 113us/step - loss: 0.2808 - acc: 0.9343 - val_loss: 0.3329 - val_acc: 0.8800\n",
          "Epoch 65/300\n",
          "350/350 [==============================] - 0s 99us/step - loss: 0.2757 - acc: 0.9371 - val_loss: 0.3276 - val_acc: 0.8800\n",
          "Epoch 66/300\n",
          "350/350 [==============================] - 0s 87us/step - loss: 0.2704 - acc: 0.9371 - val_loss: 0.3226 - val_acc: 0.8800\n",
          "Epoch 67/300\n",
          "350/350 [==============================] - 0s 77us/step - loss: 0.2657 - acc: 0.9371 - val_loss: 0.3179 - val_acc: 0.8800\n",
          "Epoch 68/300\n",
          "350/350 [==============================] - 0s 73us/step - loss: 0.2604 - acc: 0.9429 - val_loss: 0.3135 - val_acc: 0.8733\n",
          "Epoch 69/300\n",
          "350/350 [==============================] - 0s 78us/step - loss: 0.2563 - acc: 0.9457 - val_loss: 0.3096 - val_acc: 0.8733\n",
          "Epoch 70/300\n",
          "350/350 [==============================] - 0s 75us/step - loss: 0.2515 - acc: 0.9514 - val_loss: 0.3050 - val_acc: 0.8733\n",
          "Epoch 71/300\n",
          "350/350 [==============================] - 0s 65us/step - loss: 0.2469 - acc: 0.9457 - val_loss: 0.3003 - val_acc: 0.8733\n",
          "Epoch 72/300\n",
          "350/350 [==============================] - 0s 89us/step - loss: 0.2424 - acc: 0.9514 - val_loss: 0.2961 - val_acc: 0.8733\n",
          "Epoch 73/300\n",
          "350/350 [==============================] - 0s 63us/step - loss: 0.2384 - acc: 0.9514 - val_loss: 0.2919 - val_acc: 0.8733\n",
          "Epoch 74/300\n",
          "350/350 [==============================] - 0s 89us/step - loss: 0.2337 - acc: 0.9514 - val_loss: 0.2877 - val_acc: 0.8733\n",
          "Epoch 75/300\n",
          "350/350 [==============================] - 0s 132us/step - loss: 0.2297 - acc: 0.9514 - val_loss: 0.2835 - val_acc: 0.8733\n",
          "Epoch 76/300\n",
          "350/350 [==============================] - 0s 130us/step - loss: 0.2256 - acc: 0.9514 - val_loss: 0.2798 - val_acc: 0.8733\n",
          "Epoch 77/300\n",
          "350/350 [==============================] - 0s 99us/step - loss: 0.2217 - acc: 0.9514 - val_loss: 0.2759 - val_acc: 0.8733\n",
          "Epoch 78/300\n",
          "350/350 [==============================] - 0s 156us/step - loss: 0.2178 - acc: 0.9514 - val_loss: 0.2723 - val_acc: 0.8667\n",
          "Epoch 79/300\n",
          "350/350 [==============================] - 0s 161us/step - loss: 0.2141 - acc: 0.9543 - val_loss: 0.2687 - val_acc: 0.8733\n",
          "Epoch 80/300\n",
          "350/350 [==============================] - 0s 87us/step - loss: 0.2100 - acc: 0.9543 - val_loss: 0.2647 - val_acc: 0.8733\n",
          "Epoch 81/300\n",
          "350/350 [==============================] - 0s 118us/step - loss: 0.2062 - acc: 0.9543 - val_loss: 0.2604 - val_acc: 0.8733\n",
          "Epoch 82/300\n",
          "350/350 [==============================] - 0s 90us/step - loss: 0.2026 - acc: 0.9571 - val_loss: 0.2569 - val_acc: 0.8733\n",
          "Epoch 83/300\n",
          "350/350 [==============================] - 0s 79us/step - loss: 0.1989 - acc: 0.9571 - val_loss: 0.2534 - val_acc: 0.8733\n",
          "Epoch 84/300\n",
          "350/350 [==============================] - 0s 96us/step - loss: 0.1952 - acc: 0.9571 - val_loss: 0.2497 - val_acc: 0.8733\n",
          "Epoch 85/300\n",
          "350/350 [==============================] - 0s 154us/step - loss: 0.1920 - acc: 0.9571 - val_loss: 0.2462 - val_acc: 0.8733\n",
          "Epoch 86/300\n",
          "350/350 [==============================] - 0s 99us/step - loss: 0.1889 - acc: 0.9571 - val_loss: 0.2437 - val_acc: 0.8733\n",
          "Epoch 87/300\n",
          "350/350 [==============================] - 0s 231us/step - loss: 0.1861 - acc: 0.9571 - val_loss: 0.2405 - val_acc: 0.8733\n",
          "Epoch 88/300\n",
          "350/350 [==============================] - 0s 188us/step - loss: 0.1829 - acc: 0.9571 - val_loss: 0.2372 - val_acc: 0.8733\n",
          "Epoch 89/300\n",
          "350/350 [==============================] - 0s 80us/step - loss: 0.1798 - acc: 0.9571 - val_loss: 0.2335 - val_acc: 0.8733\n",
          "Epoch 90/300\n",
          "350/350 [==============================] - 0s 118us/step - loss: 0.1771 - acc: 0.9571 - val_loss: 0.2305 - val_acc: 0.8800\n",
          "Epoch 91/300\n",
          "350/350 [==============================] - 0s 126us/step - loss: 0.1742 - acc: 0.9571 - val_loss: 0.2272 - val_acc: 0.8800\n",
          "Epoch 92/300\n",
          "350/350 [==============================] - 0s 67us/step - loss: 0.1714 - acc: 0.9571 - val_loss: 0.2247 - val_acc: 0.8800\n",
          "Epoch 93/300\n",
          "350/350 [==============================] - 0s 50us/step - loss: 0.1690 - acc: 0.9543 - val_loss: 0.2217 - val_acc: 0.8867\n",
          "Epoch 94/300\n",
          "350/350 [==============================] - 0s 64us/step - loss: 0.1661 - acc: 0.9571 - val_loss: 0.2190 - val_acc: 0.8867\n",
          "Epoch 95/300\n",
          "350/350 [==============================] - 0s 50us/step - loss: 0.1637 - acc: 0.9600 - val_loss: 0.2165 - val_acc: 0.8800\n",
          "Epoch 96/300\n",
          "350/350 [==============================] - 0s 62us/step - loss: 0.1613 - acc: 0.9571 - val_loss: 0.2131 - val_acc: 0.8867\n",
          "Epoch 97/300\n",
          "350/350 [==============================] - 0s 59us/step - loss: 0.1589 - acc: 0.9600 - val_loss: 0.2101 - val_acc: 0.8867\n",
          "Epoch 98/300\n",
          "350/350 [==============================] - 0s 83us/step - loss: 0.1565 - acc: 0.9600 - val_loss: 0.2073 - val_acc: 0.8867\n",
          "Epoch 99/300\n",
          "350/350 [==============================] - 0s 53us/step - loss: 0.1543 - acc: 0.9600 - val_loss: 0.2050 - val_acc: 0.8867\n",
          "Epoch 100/300\n",
          "350/350 [==============================] - 0s 55us/step - loss: 0.1521 - acc: 0.9600 - val_loss: 0.2026 - val_acc: 0.8867\n",
          "Epoch 101/300\n",
          "350/350 [==============================] - 0s 88us/step - loss: 0.1501 - acc: 0.9629 - val_loss: 0.2011 - val_acc: 0.8867\n",
          "Epoch 102/300\n",
          "350/350 [==============================] - 0s 74us/step - loss: 0.1479 - acc: 0.9600 - val_loss: 0.1982 - val_acc: 0.8867\n",
          "Epoch 103/300\n",
          "350/350 [==============================] - 0s 53us/step - loss: 0.1460 - acc: 0.9629 - val_loss: 0.1960 - val_acc: 0.8867\n",
          "Epoch 104/300\n",
          "350/350 [==============================] - 0s 84us/step - loss: 0.1439 - acc: 0.9629 - val_loss: 0.1939 - val_acc: 0.8933\n",
          "Epoch 105/300\n",
          "350/350 [==============================] - 0s 85us/step - loss: 0.1420 - acc: 0.9629 - val_loss: 0.1920 - val_acc: 0.9000\n",
          "Epoch 106/300\n",
          "350/350 [==============================] - 0s 90us/step - loss: 0.1400 - acc: 0.9629 - val_loss: 0.1889 - val_acc: 0.9000\n",
          "Epoch 107/300\n",
          "350/350 [==============================] - 0s 83us/step - loss: 0.1387 - acc: 0.9629 - val_loss: 0.1876 - val_acc: 0.9000\n",
          "Epoch 108/300\n",
          "350/350 [==============================] - 0s 140us/step - loss: 0.1364 - acc: 0.9629 - val_loss: 0.1857 - val_acc: 0.9067\n",
          "Epoch 109/300\n",
          "350/350 [==============================] - 0s 121us/step - loss: 0.1347 - acc: 0.9657 - val_loss: 0.1831 - val_acc: 0.9067\n",
          "Epoch 110/300\n",
          "350/350 [==============================] - 0s 116us/step - loss: 0.1329 - acc: 0.9657 - val_loss: 0.1815 - val_acc: 0.9067\n",
          "Epoch 111/300\n",
          "350/350 [==============================] - 0s 86us/step - loss: 0.1313 - acc: 0.9657 - val_loss: 0.1798 - val_acc: 0.9133\n",
          "Epoch 112/300\n",
          "350/350 [==============================] - 0s 132us/step - loss: 0.1295 - acc: 0.9657 - val_loss: 0.1783 - val_acc: 0.9067\n",
          "Epoch 113/300\n",
          "350/350 [==============================] - 0s 204us/step - loss: 0.1276 - acc: 0.9714 - val_loss: 0.1762 - val_acc: 0.9067\n",
          "Epoch 114/300\n",
          "350/350 [==============================] - 0s 164us/step - loss: 0.1262 - acc: 0.9714 - val_loss: 0.1748 - val_acc: 0.9000\n",
          "Epoch 115/300\n",
          "350/350 [==============================] - 0s 235us/step - loss: 0.1244 - acc: 0.9771 - val_loss: 0.1735 - val_acc: 0.9133\n",
          "Epoch 116/300\n",
          "350/350 [==============================] - 0s 123us/step - loss: 0.1233 - acc: 0.9714 - val_loss: 0.1716 - val_acc: 0.9267\n",
          "Epoch 117/300\n",
          "350/350 [==============================] - 0s 232us/step - loss: 0.1221 - acc: 0.9743 - val_loss: 0.1699 - val_acc: 0.9267\n",
          "Epoch 118/300\n",
          "350/350 [==============================] - 0s 83us/step - loss: 0.1204 - acc: 0.9743 - val_loss: 0.1680 - val_acc: 0.9267\n",
          "Epoch 119/300\n",
          "350/350 [==============================] - 0s 80us/step - loss: 0.1192 - acc: 0.9743 - val_loss: 0.1663 - val_acc: 0.9267\n",
          "Epoch 120/300\n",
          "350/350 [==============================] - 0s 87us/step - loss: 0.1179 - acc: 0.9771 - val_loss: 0.1654 - val_acc: 0.9267\n",
          "Epoch 121/300\n"
         ]
        },
        {
         "name": "stdout",
         "output_type": "stream",
         "text": [
          "350/350 [==============================] - 0s 125us/step - loss: 0.1169 - acc: 0.9771 - val_loss: 0.1647 - val_acc: 0.9267\n",
          "Epoch 122/300\n",
          "350/350 [==============================] - 0s 137us/step - loss: 0.1157 - acc: 0.9743 - val_loss: 0.1633 - val_acc: 0.9267\n",
          "Epoch 123/300\n",
          "350/350 [==============================] - 0s 126us/step - loss: 0.1144 - acc: 0.9771 - val_loss: 0.1615 - val_acc: 0.9267\n",
          "Epoch 124/300\n",
          "350/350 [==============================] - 0s 100us/step - loss: 0.1131 - acc: 0.9743 - val_loss: 0.1599 - val_acc: 0.9267\n",
          "Epoch 125/300\n",
          "350/350 [==============================] - 0s 66us/step - loss: 0.1125 - acc: 0.9771 - val_loss: 0.1592 - val_acc: 0.9267\n",
          "Epoch 126/300\n",
          "350/350 [==============================] - 0s 73us/step - loss: 0.1110 - acc: 0.9771 - val_loss: 0.1586 - val_acc: 0.9267\n",
          "Epoch 127/300\n",
          "350/350 [==============================] - 0s 89us/step - loss: 0.1100 - acc: 0.9771 - val_loss: 0.1564 - val_acc: 0.9267\n",
          "Epoch 128/300\n",
          "350/350 [==============================] - 0s 126us/step - loss: 0.1088 - acc: 0.9771 - val_loss: 0.1547 - val_acc: 0.9267\n",
          "Epoch 129/300\n",
          "350/350 [==============================] - 0s 65us/step - loss: 0.1082 - acc: 0.9771 - val_loss: 0.1538 - val_acc: 0.9267\n",
          "Epoch 130/300\n",
          "350/350 [==============================] - 0s 81us/step - loss: 0.1068 - acc: 0.9771 - val_loss: 0.1529 - val_acc: 0.9267\n",
          "Epoch 131/300\n",
          "350/350 [==============================] - 0s 82us/step - loss: 0.1063 - acc: 0.9771 - val_loss: 0.1517 - val_acc: 0.9267\n",
          "Epoch 132/300\n",
          "350/350 [==============================] - 0s 71us/step - loss: 0.1048 - acc: 0.9771 - val_loss: 0.1519 - val_acc: 0.9200\n",
          "Epoch 133/300\n",
          "350/350 [==============================] - 0s 92us/step - loss: 0.1045 - acc: 0.9771 - val_loss: 0.1507 - val_acc: 0.9200\n",
          "Epoch 134/300\n",
          "350/350 [==============================] - 0s 73us/step - loss: 0.1033 - acc: 0.9771 - val_loss: 0.1490 - val_acc: 0.9200\n",
          "Epoch 135/300\n",
          "350/350 [==============================] - 0s 74us/step - loss: 0.1028 - acc: 0.9771 - val_loss: 0.1488 - val_acc: 0.9200\n",
          "Epoch 136/300\n",
          "350/350 [==============================] - 0s 90us/step - loss: 0.1017 - acc: 0.9771 - val_loss: 0.1476 - val_acc: 0.9267\n",
          "Epoch 137/300\n",
          "350/350 [==============================] - 0s 73us/step - loss: 0.1011 - acc: 0.9771 - val_loss: 0.1463 - val_acc: 0.9267\n",
          "Epoch 138/300\n",
          "350/350 [==============================] - 0s 53us/step - loss: 0.1003 - acc: 0.9771 - val_loss: 0.1450 - val_acc: 0.9333\n",
          "Epoch 139/300\n",
          "350/350 [==============================] - 0s 95us/step - loss: 0.0995 - acc: 0.9743 - val_loss: 0.1454 - val_acc: 0.9267\n",
          "Epoch 140/300\n",
          "350/350 [==============================] - 0s 88us/step - loss: 0.0987 - acc: 0.9771 - val_loss: 0.1441 - val_acc: 0.9333\n",
          "Epoch 141/300\n",
          "350/350 [==============================] - 0s 82us/step - loss: 0.0982 - acc: 0.9771 - val_loss: 0.1431 - val_acc: 0.9333\n",
          "Epoch 142/300\n",
          "350/350 [==============================] - 0s 83us/step - loss: 0.0971 - acc: 0.9771 - val_loss: 0.1433 - val_acc: 0.9333\n",
          "Epoch 143/300\n",
          "350/350 [==============================] - 0s 65us/step - loss: 0.0965 - acc: 0.9743 - val_loss: 0.1435 - val_acc: 0.9267\n",
          "Epoch 144/300\n",
          "350/350 [==============================] - 0s 75us/step - loss: 0.0960 - acc: 0.9771 - val_loss: 0.1415 - val_acc: 0.9333\n",
          "Epoch 145/300\n",
          "350/350 [==============================] - 0s 79us/step - loss: 0.0955 - acc: 0.9771 - val_loss: 0.1407 - val_acc: 0.9333\n",
          "Epoch 146/300\n",
          "350/350 [==============================] - 0s 80us/step - loss: 0.0947 - acc: 0.9771 - val_loss: 0.1405 - val_acc: 0.9333\n",
          "Epoch 147/300\n",
          "350/350 [==============================] - 0s 64us/step - loss: 0.0938 - acc: 0.9800 - val_loss: 0.1381 - val_acc: 0.9333\n",