{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "EWS53qjRIYdq"
   },
   "source": [
    "<p><img alt=\"SOS logo\" height=\"45px\" src=\"https://indico.in2p3.fr/event/37891/logo-2009395760.png\" align=\"left\" hspace=\"10px\" vspace=\"0px\"></p> <h1>SOS 2026</h1>\n",
    "\n",
    "<h1>Hands-on: deep learning</h1>\n",
    "\n",
    "Author Florian Ruppin"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "GJBs_flRovLc"
   },
   "source": [
    "## **Goal of the session**\n",
    "\n",
    "The aim of this tutorial is to implement a multilayer perceptron neural network for the classification of a large number of images. You will first only use the usual libraries such as numpy and matplotlib to develop all the functions needed to train and use a neural network. You will then use the keras library integrated into the TensorFlow machine learning tool developed by Google. This library will enable you to easily build a neural network and study the impact of its architecture on final performance."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Coding a neural network from A to Z\n",
    "\n",
    "First of all, you're going to develop your own neural network with the aim of classifying images from the MNIST (Mixed National Institute of Standards and Technology) database. These images of $28 \\times 28$ pixels correspond to handwritten numbers from 0 to 9 (cf. left panel of Fig. 1). Your objective is to train a neural network to associate a number from 0 to 9 with the input image. The architecture of the neural network to be developed is very simple: \n",
    "- an input layer containing as many neurons as pixels present in the images to be processed\n",
    "- a hidden layer containing 10 neurons with a ReLU activation function\n",
    "- an output layer containing as many neurons as possible class labels, i.e. 10, with a softmax activation function to associate a probability with each class label\n",
    "\n",
    "The architecture of this neural network is shown in the right-hand panel of Fig.1. It contains two weight matrices $W^0$ and $W^1$ and two bias vectors $b^0$ and $b^1$.\n",
    "\n",
    "<p style=\"text-align:center\">\n",
    "    <img alt=\"Hands on DL\" width=\"800px\" src=\"https://perso.ip2i.in2p3.fr/ruppin/hands_on_dl.jpg\" hspace=\"10px\" vspace=\"0px\">\n",
    "</p>\n",
    "<p style=\"text-align:center\"><em>Figure 1:</em> <b>Left:</b> Examples of images in the MNIST database. <b>Right:</b> Schematic representation of the neural network to be implemented.</p>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Import the data**\n",
    "\n",
    "The lines below allow you to import the data that will be used during this hands-on session.\n",
    "- How many images are there in the training and test samples?\n",
    "- How many neurons will there be in the input layer of our network?\n",
    "- Print the 10 first class labels of the training sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-05-16 16:03:47.079425: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
      "To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
     ]
    }
   ],
   "source": [
    "from tensorflow import keras\n",
    "from keras.datasets import mnist\n",
    "\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "# Normalize the data\n",
    "x_train, x_test = x_train / 255.0, x_test / 255.0 \n",
    "\n",
    "# Reshape training and test sample to match input layer\n",
    "x_train = x_train.reshape(x_train.shape[0], x_train.shape[1] * x_train.shape[2])\n",
    "x_test = x_test.reshape(x_test.shape[0], x_test.shape[1] * x_test.shape[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 784)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, the class labels are numbers $i$ between 0 and 9. However, we will need the class labels to take the form of vectors of size 10 with a 1 at the $i^{th}$ position and zeros elsewhere. For example, the number 7 becomes (0,0,0,0,0,0,0,1,0,0).\n",
    "- Complete the following function that will transform a single digit label into a vector label that can be compared to the output of our newtwork"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "def one_hot(Yi):\n",
    "    \"\"\"transform image figure into one-hot vector\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    Yi: int\n",
    "        the figure value on the image\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array\n",
    "        a one-hot encoded vector with 1 at the location of the input figure\n",
    "    \"\"\"\n",
    "    one_hot_Yi = np.zeros(10)\n",
    "    one_hot_Yi[Yi] = 1\n",
    "    return one_hot_Yi"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Code the network**\n",
    "\n",
    "The list of functions that we will need in order to train our neural network is the following:\n",
    "- init_params <em>-- initializes our weights and biases randomly</em>\n",
    "- ReLU\n",
    "- Softmax <em>-- the two activation functions that we will consider</em>\n",
    "- ReLU_deriv <em>-- derivative of the ReLU function</em>\n",
    "- forward_prop <em>-- forward propagation for a given image</em>\n",
    "- backward_prop <em>-- backward propagation for a given pair (image, label)</em>\n",
    "- update_params <em>-- update weight and bias values after data-set full pass</em>\n",
    "\n",
    "The init_params, ReLU, Softmax, and ReLU_deriv functions are quite easy to code. They are given in the cells bellow.\n",
    "- Complete the following cells based on the algorithm that we introduced this morning in order to define forward_prop, backward_prop, and update_params"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def init_params(N_hidden_neurons):\n",
    "    \"\"\"Weight and bias initialization\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    N_hidden_neurons: int\n",
    "        number of neurons in hidden layer\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array, array, array, array\n",
    "        the weight and bias matrices\n",
    "    \"\"\"\n",
    "\n",
    "    # inverse order of line/column for faster memory access\n",
    "    W0 = np.random.rand(784,N_hidden_neurons) - 0.5\n",
    "    b0 = np.random.rand(N_hidden_neurons) - 0.5\n",
    "    W1 = np.random.rand(N_hidden_neurons,10) - 0.5\n",
    "    b1 = np.random.rand(10) - 0.5\n",
    "    return W0, b0, W1, b1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def ReLU(Z):\n",
    "    \"\"\"ReLU function for the hidden layer\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    Z: array\n",
    "        linear combination from previous layer + bias\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array\n",
    "        output from hidden neuron\n",
    "    \"\"\"\n",
    "    return np.maximum(Z, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def softmax(Z):\n",
    "    \"\"\"softmax function for the output layer\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    Z: array\n",
    "        linear combination from previous layer + bias\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array\n",
    "        output from output neuron\n",
    "    \"\"\"\n",
    "    A = np.exp(Z) / sum(np.exp(Z))\n",
    "    return A"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def ReLU_deriv(Z):\n",
    "    \"\"\"derivative of ReLU function\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    Z: array\n",
    "        linear combination from previous layer + bias\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array\n",
    "        array of boolean (interpreted as 0 in 1 in operations)\n",
    "    \"\"\"\n",
    "    return Z > 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def forward_prop(W0, b0, W1, b1, Xi):\n",
    "    \"\"\"forward propagation for a given image\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    W0, b0, W1, b1: array\n",
    "        the weight and bias matrices of the network\n",
    "    Xi: array\n",
    "        an image\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array, array, array, array\n",
    "        the entry and output for each activation function\n",
    "    \"\"\"\n",
    "    Z0 = W0.T.dot(Xi) + b0  # no transpose for W0 because axis swap\n",
    "    A0 = ReLU(Z0)\n",
    "    Z1 = W1.T.dot(A0) + b1  # idem\n",
    "    A1 = softmax(Z1)\n",
    "    return Z0, A0, Z1, A1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def backward_prop(Z0, A0, A1, W1, Xi, Yi):\n",
    "    \"\"\"backward propagation for a given (image, class)\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    Z0: array\n",
    "        the entry of hidden activation function\n",
    "    A0, A1: array\n",
    "        the output of all activation functions\n",
    "    Xi, Yi: array\n",
    "        an image and its associated class\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array, array, array, array\n",
    "        derivatives of cross-entropy loss wrt weights and biases\n",
    "    \"\"\"\n",
    "    one_hot_Yi = one_hot(Yi)\n",
    "    delta1i = A1 - one_hot_Yi\n",
    "    delta0i = ReLU_deriv(Z0) * W1.dot(delta1i)\n",
    "    dJdW1 = A0[:, None].dot(delta1i[None, :])  #np.outer(A0,delta1i)\n",
    "    dJdW0 = Xi[:, None].dot(delta0i[None, :])  \n",
    "    dJdb1 = delta1i\n",
    "    dJdb0 = delta0i\n",
    "\n",
    "    return dJdW0, dJdb0, dJdW1, dJdb1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update_params(W0, b0, W1, b1, dJdW0_arr, dJdb0_arr, dJdW1_arr, dJdb1_arr, alpha):\n",
    "    \"\"\"update weight and bias values after data-set full pass\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    W0, b0, W1, b1: array\n",
    "        previous weight and bias matrices of the network\n",
    "    dJdW0_arr, dJdb0_arr, dJdW1_arr, dJdb1_arr: list\n",
    "        lists of derivatives of cross-entropy loss wrt weights and biases\n",
    "        for each image in the training sample\n",
    "    alpha: float\n",
    "        network learning rate\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array, array, array, array\n",
    "        updated weight and bias matrices of the network\n",
    "    \"\"\"\n",
    "    D = len(dJdW0_arr) # dJdW0_arr.shape[0]\n",
    "    W0 = W0 - (alpha / D) * np.sum(dJdW0_arr, axis=0)\n",
    "    b0 = b0 - (alpha / D) * np.sum(dJdb0_arr, axis=0)\n",
    "    W1 = W1 - (alpha / D) * np.sum(dJdW1_arr, axis=0)\n",
    "    b1 = b1 - (alpha / D) * np.sum(dJdb1_arr, axis=0)\n",
    "    return W0, b0, W1, b1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Prediction and accuracy**\n",
    "\n",
    "You will need a function that returns the predicted class label for a given image as well as a function that returns the accuracy of the network in order to record the evolution of the network performance during training. These functions are quite straightforward to code and are given below."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_predictions(A1):\n",
    "    \"\"\"get predicted value for a given image\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    A1: array\n",
    "        the output for each neuron in output layer\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    int\n",
    "        the predicted class of the image\n",
    "    \"\"\"\n",
    "    return np.argmax(A1)\n",
    "\n",
    "\n",
    "def get_accuracy(predictions, Y):\n",
    "    \"\"\"get the accuracy of the network\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    predictions: list\n",
    "        the predicted classes for a list of images\n",
    "    Y: list\n",
    "        the actual classes for the same images\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    float\n",
    "        the accuracy of the network for the considered set of images\n",
    "    \"\"\"\n",
    "    return np.sum(predictions == Y) / Y.size"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Gradient descent**\n",
    "\n",
    "You now have all the tools needed to code your own gradient descent function that will train this neural network to recognize the MNIST images.\n",
    "- Complete the following cell so that the function returns the weight matrices and bias vectors of the trained network. You will use the get_predictions and get_accuracy functions in order to print the accuracy of the network on the training sample every 10 epochs."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient_descent(\n",
    "    X, Y, alpha, N_hidden_neurons, iterations\n",
    "):\n",
    "    \"\"\"train the neural network\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    X, Y: array, array\n",
    "        the images and corresponding classes for the\n",
    "        training sample\n",
    "    alpha: float\n",
    "        the learning rate\n",
    "    N_hidden_neurons: int\n",
    "        number of neurons in hidden layer\n",
    "    iterations: int\n",
    "        number of iterations for the wight and bias updates\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    array, array, array, array\n",
    "        weight and bias matrices of the trained network\n",
    "    \"\"\"\n",
    "    W0, b0, W1, b1 = init_params(N_hidden_neurons)\n",
    "    for i in range(iterations):\n",
    "        dJdW0_list, dJdb0_list, dJdW1_list, dJdb1_list, A1_list = [], [], [], [], []\n",
    "        for j in range(X.shape[1]):\n",
    "            Z0, A0, Z1, A1 = forward_prop(W0, b0, W1, b1, X[j,:])\n",
    "            dJdW0, dJdb0, dJdW1, dJdb1 = backward_prop(Z0, A0, A1, W1, X[j,:], Y[j])\n",
    "            dJdW0_list.append(dJdW0)\n",
    "            dJdb0_list.append(dJdb0)\n",
    "            dJdW1_list.append(dJdW1)\n",
    "            dJdb1_list.append(dJdb1)\n",
    "            A1_list.append(A1)\n",
    "        W0, b0, W1, b1 = update_params(\n",
    "            W0, b0, W1, b1, dJdW0_list, dJdb0_list, dJdW1_list, dJdb1_list, alpha\n",
    "        )\n",
    "        if i % 10 == 0:\n",
    "            print(\"Iteration: \", i)\n",
    "            predictions = [get_predictions(A1i) for A1i in A1_list[:100]]\n",
    "            print(get_accuracy(predictions, Y[:100]))\n",
    "\n",
    "    return W0, b0, W1, b1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Test your gradient_descent function using a learning rate of 1 and 100 epochs. What is the final accuracy of your network?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration:  0\n",
      "0.15\n",
      "Iteration:  10\n",
      "0.54\n",
      "Iteration:  20\n",
      "0.65\n",
      "Iteration:  30\n",
      "0.63\n",
      "Iteration:  40\n",
      "0.75\n",
      "Iteration:  50\n",
      "0.72\n",
      "Iteration:  60\n",
      "0.83\n",
      "Iteration:  70\n",
      "0.73\n",
      "Iteration:  80\n",
      "0.94\n",
      "Iteration:  90\n",
      "0.92\n"
     ]
    }
   ],
   "source": [
    "N_hidden_neurons = 10\n",
    "learning_rate = 1.0\n",
    "W0, b0, W1, b1 = gradient_descent(\n",
    "    x_train, y_train, learning_rate, N_hidden_neurons, 100\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "-Check that your network works by running the following cell"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Prediction:  6\n",
      "Actual class label:  6\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Prediction:  1\n",
      "Actual class label:  1\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Prediction:  1\n",
      "Actual class label:  1\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Prediction:  1\n",
      "Actual class label:  1\n"
     ]
    },
    {
     "data": {
      "image/png": "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gyTNnTs37fzYt2/fE5ww95qbm7Vs2TIdPXpUjY2NunXrlqLRqDo7O1P79Ifz4VGOg5Qn54PLE88995x788030x77xje+4X7yk58YTfTkrV271k2YMMF6DFOS3AcffJD6+s6dOy4UCrn169enHvv8889dMBh0v/nNbwwmfDLuPw7OOVddXe1efvllk3mstLW1OUmuubnZOdd/z4f7j4Nz+XM+5MWV0M2bN3XixAlFo9G0x6PRqI4cOWI0lY2WlhZFIhFVVFRo0aJFOn/+vPVIplpbWxWPx9PODb/fr5kzZ/a7c0OSmpqaVFJSojFjxmjJkiVqa2uzHimnEomEJKm4uFhS/z0f7j8O9+TD+ZAXEbpy5Ypu376t0tLStMdLS0sVj8eNpnrypk6dqq1bt2r//v16//33FY/HVVlZqfb2duvRzNz737+/nxuSVFVVpW3btunAgQN65513dOzYMb300kvq6uqyHi0nnHOqqanRCy+8oHHjxknqn+dDT8dByp/zoc/dRbs39/9oB+dct8cKWVVVVeq/x48fr+nTp+trX/uatmzZopqaGsPJ7PX3c0OSFi5cmPrvcePGafLkySovL9fevXu1YMECw8lyY/ny5frkk0/097//vdtz/el8eNBxyJfzIS+uhIYPH66BAwd2+5tMW1tbt7/x9CfDhg3T+PHj1dLSYj2KmXufDuTc6C4cDqu8vLwgz48VK1Zoz549OnjwYNqPfulv58ODjkNP+ur5kBcRGjx4sCZNmqTGxsa0xxsbG1VZWWk0lb2uri6dPXtW4XDYehQzFRUVCoVCaefGzZs31dzc3K/PDUlqb29XLBYrqPPDOafly5dr165dOnDggCoqKtKe7y/nw8OOQ0/67Plg+KEIT3bs2OEGDRrkfve737l//vOfbuXKlW7YsGHuwoUL1qM9MatWrXJNTU3u/Pnz7ujRo+473/mOCwQCBX8MOjo63MmTJ93JkyedJLdx40Z38uRJ9+9//9s559z69etdMBh0u3btcqdPn3avvfaaC4fDLplMGk+eXb0dh46ODrdq1Sp35MgR19ra6g4ePOimT5/uvvrVrxbUcfjRj37kgsGga2pqcpcvX05t169fT+3TH86Hhx2HfDof8iZCzjn361//2pWXl7vBgwe7iRMnpn0csT9YuHChC4fDbtCgQS4SibgFCxa4M2fOWI+VcwcPHnSSum3V1dXOubsfy127dq0LhULO7/e7GTNmuNOnT9sOnQO9HYfr16+7aDTqRowY4QYNGuRGjRrlqqur3cWLF63Hzqqefv+S3ObNm1P79Ifz4WHHIZ/OB36UAwDATF68JwQAKExECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAzRAgAYIYIAQDMECEAgJn/A3w8g90esmDcAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "def make_prediction(X, W0, b0, W1, b1):\n",
    "    \"\"\"predict the class of a given image\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    X: array\n",
    "        an test image\n",
    "    W0, b0, W1, b1: array\n",
    "        weight and bias matrices of the trained network\n",
    "\n",
    "    Returns\n",
    "    -------\n",
    "    int\n",
    "        predicted class of the image\n",
    "    \"\"\"\n",
    "    _, _, _, A1 = forward_prop(W0, b0, W1, b1, X)\n",
    "    prediction = get_predictions(A1)\n",
    "    return prediction\n",
    "\n",
    "def test_prediction(index, W0, b0, W1, b1):\n",
    "    \"\"\"show a test image and print its predicted and\n",
    "        its actual class\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    index: int\n",
    "        position in the test sample\n",
    "    W0, b0, W1, b1: array\n",
    "        weight and bias matrices of the trained network\n",
    "\n",
    "    \"\"\"\n",
    "    current_image = x_test[index,:]\n",
    "    prediction = make_prediction(x_test[index,:], W0, b0, W1, b1)\n",
    "    label = y_test[index]\n",
    "    print(\"Prediction: \", prediction)\n",
    "    print(\"Actual class label: \", label)\n",
    "\n",
    "    current_image = current_image.reshape((28, 28)) * 255\n",
    "    plt.gray()\n",
    "    plt.imshow(current_image, interpolation=\"nearest\")\n",
    "    plt.show()\n",
    "\n",
    "test_prediction(np.random.randint(0,x_test.shape[0]), W0, b0, W1, b1)\n",
    "test_prediction(np.random.randint(0,x_test.shape[0]), W0, b0, W1, b1)\n",
    "test_prediction(np.random.randint(0,x_test.shape[0]), W0, b0, W1, b1)\n",
    "test_prediction(np.random.randint(0,x_test.shape[0]), W0, b0, W1, b1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using TensorFlow\n",
    "\n",
    "You will now use the keras module of the tensorflow library in order to train the same neural network and compare its performance with the one you just coded.\n",
    "\n",
    "- Use the <em>to\\_categorical</em> function in <em>keras.utils</em> to transform the numbers contained in y_train and y_test (class labels associated with the images) into vectors of 10 values containing a 1 at the position corresponding to the number displayed in each image."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow import keras\n",
    "from keras.datasets import mnist\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Input, Dense\n",
    "from keras.utils import to_categorical\n",
    "\n",
    "# Extract MNIST dataset\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "# Normalize it\n",
    "x_train, x_test = x_train / 255.0, x_test / 255.0\n",
    "\n",
    "# Reshape training and test sample to match input layer\n",
    "x_train = x_train.reshape(x_train.shape[0], x_train.shape[1] * x_train.shape[2])\n",
    "x_test = x_test.reshape(x_test.shape[0], x_test.shape[1] * x_test.shape[2])\n",
    "\n",
    "# Transform image classes into one-hot vectors\n",
    "y_train = to_categorical(y_train, 10)\n",
    "y_test = to_categorical(y_test, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Use the <em>Sequential</em> module in <em>keras.models</em> to initialize a model object corresponding to your neural network. Use the <em>add</em> method associated with your model object to add the hidden layer of 10 neurons with a ReLU activation function. You will define it using the <em>Dense</em> module of <em>keras.layers</em>. Finally, add the output layer of 10 neurons with a softmax activation function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Build the network architecture\n",
    "model = Sequential()\n",
    "model.add(Dense(10, activation=\"relu\", kernel_regularizer='l2'))\n",
    "model.add(Dense(10, activation=\"softmax\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that the architecture of your neural network is defined you will need to specify the minimizer and its learning rate as well as the loss function to consider during training.\n",
    "- Use the <em>Adam</em> function in <em>keras.optimizers</em> to initialize an object called opt corresponding to the method used to minimize the loss function. Consider a learning rate of $10^{-2}$.\n",
    "- Use the <em>compile</em> method associated with your model object to associate the opt object with your neural network. You'll use <em>categorical_crossentropy</em> as the loss function, and you'll also request access to the evolution of the success rate as a function of the iterations of the training phase by adding the keyword $\\mathrm{metrics=['accuracy']}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define the minimizer to consider and its learning rate\n",
    "opt = keras.optimizers.Adam(learning_rate=1e-2)\n",
    "# Define the loss function to consider and the metrics to save during training\n",
    "model.compile(optimizer=opt, loss=\"categorical_crossentropy\", metrics=[\"accuracy\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Use the <em>fit</em> method associated with your model object to train your neural network from the x_train and y_train arrays. Set the batch_size option to the number of images in x_train and the number of iterations (epochs) to 300. Also use the validation_data option to give the x_test and y_test arrays so that the success rate is calculated for the test sample at each epoch of training. Store the output of this training phase in a variable called out."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 31ms/step - accuracy: 0.3160 - loss: 2.1220 - val_accuracy: 0.6772 - val_loss: 1.2964\n",
      "Epoch 2/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.6985 - loss: 1.2272 - val_accuracy: 0.7517 - val_loss: 0.9958\n",
      "Epoch 3/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.7624 - loss: 0.9726 - val_accuracy: 0.8609 - val_loss: 0.8288\n",
      "Epoch 4/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 17ms/step - accuracy: 0.8591 - loss: 0.8137 - val_accuracy: 0.8797 - val_loss: 0.6904\n",
      "Epoch 5/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 21ms/step - accuracy: 0.8738 - loss: 0.6929 - val_accuracy: 0.8885 - val_loss: 0.6120\n",
      "Epoch 6/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 19ms/step - accuracy: 0.8863 - loss: 0.6200 - val_accuracy: 0.8959 - val_loss: 0.5642\n",
      "Epoch 7/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.8935 - loss: 0.5735 - val_accuracy: 0.9006 - val_loss: 0.5300\n",
      "Epoch 8/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.8986 - loss: 0.5379 - val_accuracy: 0.9038 - val_loss: 0.5084\n",
      "Epoch 9/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9007 - loss: 0.5200 - val_accuracy: 0.9064 - val_loss: 0.4906\n",
      "Epoch 10/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9009 - loss: 0.5039 - val_accuracy: 0.9086 - val_loss: 0.4753\n",
      "Epoch 11/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9030 - loss: 0.4885 - val_accuracy: 0.9118 - val_loss: 0.4619\n",
      "Epoch 12/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9059 - loss: 0.4757 - val_accuracy: 0.9105 - val_loss: 0.4510\n",
      "Epoch 13/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9064 - loss: 0.4683 - val_accuracy: 0.9126 - val_loss: 0.4476\n",
      "Epoch 14/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9088 - loss: 0.4554 - val_accuracy: 0.9148 - val_loss: 0.4388\n",
      "Epoch 15/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9106 - loss: 0.4470 - val_accuracy: 0.9157 - val_loss: 0.4261\n",
      "Epoch 16/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9123 - loss: 0.4332 - val_accuracy: 0.9140 - val_loss: 0.4197\n",
      "Epoch 17/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9121 - loss: 0.4309 - val_accuracy: 0.9189 - val_loss: 0.4091\n",
      "Epoch 18/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9136 - loss: 0.4236 - val_accuracy: 0.9201 - val_loss: 0.4036\n",
      "Epoch 19/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9144 - loss: 0.4162 - val_accuracy: 0.9180 - val_loss: 0.4010\n",
      "Epoch 20/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9140 - loss: 0.4166 - val_accuracy: 0.9174 - val_loss: 0.4038\n",
      "Epoch 21/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9148 - loss: 0.4087 - val_accuracy: 0.9149 - val_loss: 0.3997\n",
      "Epoch 22/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9158 - loss: 0.4012 - val_accuracy: 0.9204 - val_loss: 0.3933\n",
      "Epoch 23/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9171 - loss: 0.3980 - val_accuracy: 0.9196 - val_loss: 0.3849\n",
      "Epoch 24/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9162 - loss: 0.3975 - val_accuracy: 0.9180 - val_loss: 0.3867\n",
      "Epoch 25/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9169 - loss: 0.3927 - val_accuracy: 0.9239 - val_loss: 0.3754\n",
      "Epoch 26/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9173 - loss: 0.3886 - val_accuracy: 0.9239 - val_loss: 0.3739\n",
      "Epoch 27/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9188 - loss: 0.3824 - val_accuracy: 0.9161 - val_loss: 0.3860\n",
      "Epoch 28/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9140 - loss: 0.3916 - val_accuracy: 0.9204 - val_loss: 0.3756\n",
      "Epoch 29/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9155 - loss: 0.3867 - val_accuracy: 0.9220 - val_loss: 0.3724\n",
      "Epoch 30/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9184 - loss: 0.3831 - val_accuracy: 0.9215 - val_loss: 0.3683\n",
      "Epoch 31/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9183 - loss: 0.3776 - val_accuracy: 0.9221 - val_loss: 0.3672\n",
      "Epoch 32/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9179 - loss: 0.3749 - val_accuracy: 0.9221 - val_loss: 0.3609\n",
      "Epoch 33/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9185 - loss: 0.3732 - val_accuracy: 0.9236 - val_loss: 0.3615\n",
      "Epoch 34/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9182 - loss: 0.3727 - val_accuracy: 0.9211 - val_loss: 0.3615\n",
      "Epoch 35/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9180 - loss: 0.3725 - val_accuracy: 0.9194 - val_loss: 0.3637\n",
      "Epoch 36/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9176 - loss: 0.3741 - val_accuracy: 0.9207 - val_loss: 0.3614\n",
      "Epoch 37/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9189 - loss: 0.3657 - val_accuracy: 0.9237 - val_loss: 0.3528\n",
      "Epoch 38/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9191 - loss: 0.3627 - val_accuracy: 0.9235 - val_loss: 0.3583\n",
      "Epoch 39/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9186 - loss: 0.3640 - val_accuracy: 0.9250 - val_loss: 0.3482\n",
      "Epoch 40/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9186 - loss: 0.3638 - val_accuracy: 0.9248 - val_loss: 0.3499\n",
      "Epoch 41/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9223 - loss: 0.3554 - val_accuracy: 0.9225 - val_loss: 0.3490\n",
      "Epoch 42/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9214 - loss: 0.3573 - val_accuracy: 0.9231 - val_loss: 0.3456\n",
      "Epoch 43/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9206 - loss: 0.3533 - val_accuracy: 0.9257 - val_loss: 0.3431\n",
      "Epoch 44/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9219 - loss: 0.3517 - val_accuracy: 0.9246 - val_loss: 0.3424\n",
      "Epoch 45/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9218 - loss: 0.3493 - val_accuracy: 0.9239 - val_loss: 0.3458\n",
      "Epoch 46/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9221 - loss: 0.3514 - val_accuracy: 0.9257 - val_loss: 0.3412\n",
      "Epoch 47/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9207 - loss: 0.3515 - val_accuracy: 0.9251 - val_loss: 0.3373\n",
      "Epoch 48/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9218 - loss: 0.3448 - val_accuracy: 0.9234 - val_loss: 0.3370\n",
      "Epoch 49/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9216 - loss: 0.3445 - val_accuracy: 0.9257 - val_loss: 0.3367\n",
      "Epoch 50/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9224 - loss: 0.3470 - val_accuracy: 0.9265 - val_loss: 0.3327\n",
      "Epoch 51/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9236 - loss: 0.3402 - val_accuracy: 0.9229 - val_loss: 0.3363\n",
      "Epoch 52/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9211 - loss: 0.3467 - val_accuracy: 0.9219 - val_loss: 0.3446\n",
      "Epoch 53/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9209 - loss: 0.3464 - val_accuracy: 0.9245 - val_loss: 0.3333\n",
      "Epoch 54/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9224 - loss: 0.3421 - val_accuracy: 0.9266 - val_loss: 0.3292\n",
      "Epoch 55/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9221 - loss: 0.3378 - val_accuracy: 0.9240 - val_loss: 0.3422\n",
      "Epoch 56/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9205 - loss: 0.3490 - val_accuracy: 0.9233 - val_loss: 0.3348\n",
      "Epoch 57/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9243 - loss: 0.3352 - val_accuracy: 0.9249 - val_loss: 0.3305\n",
      "Epoch 58/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9238 - loss: 0.3383 - val_accuracy: 0.9226 - val_loss: 0.3340\n",
      "Epoch 59/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9198 - loss: 0.3431 - val_accuracy: 0.9275 - val_loss: 0.3282\n",
      "Epoch 60/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9212 - loss: 0.3400 - val_accuracy: 0.9238 - val_loss: 0.3307\n",
      "Epoch 61/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9237 - loss: 0.3364 - val_accuracy: 0.9248 - val_loss: 0.3263\n",
      "Epoch 62/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9246 - loss: 0.3320 - val_accuracy: 0.9266 - val_loss: 0.3238\n",
      "Epoch 63/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9254 - loss: 0.3289 - val_accuracy: 0.9244 - val_loss: 0.3303\n",
      "Epoch 64/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9247 - loss: 0.3332 - val_accuracy: 0.9278 - val_loss: 0.3205\n",
      "Epoch 65/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9259 - loss: 0.3272 - val_accuracy: 0.9234 - val_loss: 0.3277\n",
      "Epoch 66/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9240 - loss: 0.3346 - val_accuracy: 0.9279 - val_loss: 0.3184\n",
      "Epoch 67/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9253 - loss: 0.3291 - val_accuracy: 0.9240 - val_loss: 0.3331\n",
      "Epoch 68/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9221 - loss: 0.3371 - val_accuracy: 0.9273 - val_loss: 0.3226\n",
      "Epoch 69/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9248 - loss: 0.3306 - val_accuracy: 0.9255 - val_loss: 0.3221\n",
      "Epoch 70/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9263 - loss: 0.3263 - val_accuracy: 0.9279 - val_loss: 0.3184\n",
      "Epoch 71/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9249 - loss: 0.3294 - val_accuracy: 0.9271 - val_loss: 0.3185\n",
      "Epoch 72/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9268 - loss: 0.3232 - val_accuracy: 0.9253 - val_loss: 0.3159\n",
      "Epoch 73/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9256 - loss: 0.3250 - val_accuracy: 0.9216 - val_loss: 0.3213\n",
      "Epoch 74/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9269 - loss: 0.3217 - val_accuracy: 0.9255 - val_loss: 0.3193\n",
      "Epoch 75/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9252 - loss: 0.3270 - val_accuracy: 0.9245 - val_loss: 0.3223\n",
      "Epoch 76/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9263 - loss: 0.3211 - val_accuracy: 0.9266 - val_loss: 0.3182\n",
      "Epoch 77/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9286 - loss: 0.3198 - val_accuracy: 0.9271 - val_loss: 0.3152\n",
      "Epoch 78/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9280 - loss: 0.3173 - val_accuracy: 0.9264 - val_loss: 0.3190\n",
      "Epoch 79/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9258 - loss: 0.3242 - val_accuracy: 0.9265 - val_loss: 0.3141\n",
      "Epoch 80/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9265 - loss: 0.3231 - val_accuracy: 0.9219 - val_loss: 0.3259\n",
      "Epoch 81/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9245 - loss: 0.3252 - val_accuracy: 0.9276 - val_loss: 0.3196\n",
      "Epoch 82/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9283 - loss: 0.3191 - val_accuracy: 0.9281 - val_loss: 0.3105\n",
      "Epoch 83/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9257 - loss: 0.3241 - val_accuracy: 0.9206 - val_loss: 0.3212\n",
      "Epoch 84/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9274 - loss: 0.3170 - val_accuracy: 0.9303 - val_loss: 0.3080\n",
      "Epoch 85/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9278 - loss: 0.3190 - val_accuracy: 0.9304 - val_loss: 0.3056\n",
      "Epoch 86/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9301 - loss: 0.3084 - val_accuracy: 0.9294 - val_loss: 0.3083\n",
      "Epoch 87/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9292 - loss: 0.3121 - val_accuracy: 0.9265 - val_loss: 0.3104\n",
      "Epoch 88/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9287 - loss: 0.3128 - val_accuracy: 0.9281 - val_loss: 0.3112\n",
      "Epoch 89/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9288 - loss: 0.3122 - val_accuracy: 0.9305 - val_loss: 0.3076\n",
      "Epoch 90/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9276 - loss: 0.3111 - val_accuracy: 0.9316 - val_loss: 0.3007\n",
      "Epoch 91/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9299 - loss: 0.3073 - val_accuracy: 0.9305 - val_loss: 0.3010\n",
      "Epoch 92/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9299 - loss: 0.3073 - val_accuracy: 0.9292 - val_loss: 0.3026\n",
      "Epoch 93/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9290 - loss: 0.3089 - val_accuracy: 0.9283 - val_loss: 0.3059\n",
      "Epoch 94/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9272 - loss: 0.3146 - val_accuracy: 0.9244 - val_loss: 0.3139\n",
      "Epoch 95/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9287 - loss: 0.3100 - val_accuracy: 0.9222 - val_loss: 0.3232\n",
      "Epoch 96/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9265 - loss: 0.3191 - val_accuracy: 0.9264 - val_loss: 0.3063\n",
      "Epoch 97/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9290 - loss: 0.3095 - val_accuracy: 0.9322 - val_loss: 0.2994\n",
      "Epoch 98/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9302 - loss: 0.3042 - val_accuracy: 0.9302 - val_loss: 0.3011\n",
      "Epoch 99/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9291 - loss: 0.3087 - val_accuracy: 0.9287 - val_loss: 0.3045\n",
      "Epoch 100/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9305 - loss: 0.3047 - val_accuracy: 0.9317 - val_loss: 0.3036\n",
      "Epoch 101/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9305 - loss: 0.3055 - val_accuracy: 0.9311 - val_loss: 0.2978\n",
      "Epoch 102/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9305 - loss: 0.2994 - val_accuracy: 0.9261 - val_loss: 0.3059\n",
      "Epoch 103/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9284 - loss: 0.3085 - val_accuracy: 0.9273 - val_loss: 0.3033\n",
      "Epoch 104/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9303 - loss: 0.3048 - val_accuracy: 0.9281 - val_loss: 0.3036\n",
      "Epoch 105/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9303 - loss: 0.3073 - val_accuracy: 0.9235 - val_loss: 0.3120\n",
      "Epoch 106/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9266 - loss: 0.3123 - val_accuracy: 0.9290 - val_loss: 0.3023\n",
      "Epoch 107/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9311 - loss: 0.2993 - val_accuracy: 0.9277 - val_loss: 0.3049\n",
      "Epoch 108/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9295 - loss: 0.3040 - val_accuracy: 0.9293 - val_loss: 0.3075\n",
      "Epoch 109/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9318 - loss: 0.3019 - val_accuracy: 0.9296 - val_loss: 0.2993\n",
      "Epoch 110/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9303 - loss: 0.3036 - val_accuracy: 0.9321 - val_loss: 0.2974\n",
      "Epoch 111/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9318 - loss: 0.2949 - val_accuracy: 0.9303 - val_loss: 0.2977\n",
      "Epoch 112/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9307 - loss: 0.3034 - val_accuracy: 0.9325 - val_loss: 0.2913\n",
      "Epoch 113/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9299 - loss: 0.3008 - val_accuracy: 0.9323 - val_loss: 0.2937\n",
      "Epoch 114/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9323 - loss: 0.2963 - val_accuracy: 0.9256 - val_loss: 0.3069\n",
      "Epoch 115/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9312 - loss: 0.2967 - val_accuracy: 0.9327 - val_loss: 0.2943\n",
      "Epoch 116/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9305 - loss: 0.2982 - val_accuracy: 0.9321 - val_loss: 0.3007\n",
      "Epoch 117/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9306 - loss: 0.3007 - val_accuracy: 0.9272 - val_loss: 0.3021\n",
      "Epoch 118/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9292 - loss: 0.3027 - val_accuracy: 0.9236 - val_loss: 0.3085\n",
      "Epoch 119/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9298 - loss: 0.3020 - val_accuracy: 0.9277 - val_loss: 0.2984\n",
      "Epoch 120/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9312 - loss: 0.2977 - val_accuracy: 0.9289 - val_loss: 0.3036\n",
      "Epoch 121/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9293 - loss: 0.3007 - val_accuracy: 0.9345 - val_loss: 0.2891\n",
      "Epoch 122/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9335 - loss: 0.2885 - val_accuracy: 0.9321 - val_loss: 0.2911\n",
      "Epoch 123/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9342 - loss: 0.2890 - val_accuracy: 0.9310 - val_loss: 0.2923\n",
      "Epoch 124/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9324 - loss: 0.2929 - val_accuracy: 0.9330 - val_loss: 0.2920\n",
      "Epoch 125/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9310 - loss: 0.2957 - val_accuracy: 0.9314 - val_loss: 0.2977\n",
      "Epoch 126/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9298 - loss: 0.3036 - val_accuracy: 0.9294 - val_loss: 0.2967\n",
      "Epoch 127/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9334 - loss: 0.2913 - val_accuracy: 0.9312 - val_loss: 0.2940\n",
      "Epoch 128/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9302 - loss: 0.3004 - val_accuracy: 0.9320 - val_loss: 0.2985\n",
      "Epoch 129/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9299 - loss: 0.2984 - val_accuracy: 0.9318 - val_loss: 0.2983\n",
      "Epoch 130/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9317 - loss: 0.2972 - val_accuracy: 0.9344 - val_loss: 0.2874\n",
      "Epoch 131/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9342 - loss: 0.2878 - val_accuracy: 0.9334 - val_loss: 0.2914\n",
      "Epoch 132/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9326 - loss: 0.2896 - val_accuracy: 0.9304 - val_loss: 0.2943\n",
      "Epoch 133/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9308 - loss: 0.2973 - val_accuracy: 0.9268 - val_loss: 0.3044\n",
      "Epoch 134/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9319 - loss: 0.2975 - val_accuracy: 0.9333 - val_loss: 0.2936\n",
      "Epoch 135/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9338 - loss: 0.2939 - val_accuracy: 0.9320 - val_loss: 0.2931\n",
      "Epoch 136/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9326 - loss: 0.2900 - val_accuracy: 0.9336 - val_loss: 0.2890\n",
      "Epoch 137/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9348 - loss: 0.2870 - val_accuracy: 0.9306 - val_loss: 0.2921\n",
      "Epoch 138/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9325 - loss: 0.2888 - val_accuracy: 0.9322 - val_loss: 0.2954\n",
      "Epoch 139/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9327 - loss: 0.2929 - val_accuracy: 0.9322 - val_loss: 0.2898\n",
      "Epoch 140/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9324 - loss: 0.2907 - val_accuracy: 0.9305 - val_loss: 0.2972\n",
      "Epoch 141/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9316 - loss: 0.2976 - val_accuracy: 0.9316 - val_loss: 0.2887\n",
      "Epoch 142/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9316 - loss: 0.2940 - val_accuracy: 0.9293 - val_loss: 0.2895\n",
      "Epoch 143/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9314 - loss: 0.2921 - val_accuracy: 0.9318 - val_loss: 0.2891\n",
      "Epoch 144/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9334 - loss: 0.2873 - val_accuracy: 0.9303 - val_loss: 0.2891\n",
      "Epoch 145/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9327 - loss: 0.2887 - val_accuracy: 0.9292 - val_loss: 0.2982\n",
      "Epoch 146/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9333 - loss: 0.2882 - val_accuracy: 0.9302 - val_loss: 0.2966\n",
      "Epoch 147/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9320 - loss: 0.2908 - val_accuracy: 0.9303 - val_loss: 0.2990\n",
      "Epoch 148/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9316 - loss: 0.2916 - val_accuracy: 0.9254 - val_loss: 0.3084\n",
      "Epoch 149/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9311 - loss: 0.2980 - val_accuracy: 0.9287 - val_loss: 0.3045\n",
      "Epoch 150/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9283 - loss: 0.3033 - val_accuracy: 0.9344 - val_loss: 0.2902\n",
      "Epoch 151/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9318 - loss: 0.2969 - val_accuracy: 0.9333 - val_loss: 0.2842\n",
      "Epoch 152/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9333 - loss: 0.2858 - val_accuracy: 0.9295 - val_loss: 0.2925\n",
      "Epoch 153/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9333 - loss: 0.2871 - val_accuracy: 0.9318 - val_loss: 0.2944\n",
      "Epoch 154/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9306 - loss: 0.2958 - val_accuracy: 0.9293 - val_loss: 0.2964\n",
      "Epoch 155/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9338 - loss: 0.2838 - val_accuracy: 0.9337 - val_loss: 0.2834\n",
      "Epoch 156/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9335 - loss: 0.2854 - val_accuracy: 0.9329 - val_loss: 0.2846\n",
      "Epoch 157/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9336 - loss: 0.2839 - val_accuracy: 0.9328 - val_loss: 0.2829\n",
      "Epoch 158/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9351 - loss: 0.2782 - val_accuracy: 0.9303 - val_loss: 0.2851\n",
      "Epoch 159/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9344 - loss: 0.2847 - val_accuracy: 0.9340 - val_loss: 0.2858\n",
      "Epoch 160/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 18ms/step - accuracy: 0.9347 - loss: 0.2811 - val_accuracy: 0.9345 - val_loss: 0.2889\n",
      "Epoch 161/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 23ms/step - accuracy: 0.9343 - loss: 0.2832 - val_accuracy: 0.9348 - val_loss: 0.2810\n",
      "Epoch 162/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.9348 - loss: 0.2819 - val_accuracy: 0.9314 - val_loss: 0.2895\n",
      "Epoch 163/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9339 - loss: 0.2794 - val_accuracy: 0.9258 - val_loss: 0.2949\n",
      "Epoch 164/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9323 - loss: 0.2846 - val_accuracy: 0.9283 - val_loss: 0.2912\n",
      "Epoch 165/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9319 - loss: 0.2865 - val_accuracy: 0.9308 - val_loss: 0.2889\n",
      "Epoch 166/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9316 - loss: 0.2869 - val_accuracy: 0.9265 - val_loss: 0.3010\n",
      "Epoch 167/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9295 - loss: 0.2959 - val_accuracy: 0.9290 - val_loss: 0.2976\n",
      "Epoch 168/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9322 - loss: 0.2884 - val_accuracy: 0.9287 - val_loss: 0.2920\n",
      "Epoch 169/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9340 - loss: 0.2849 - val_accuracy: 0.9288 - val_loss: 0.2896\n",
      "Epoch 170/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9354 - loss: 0.2776 - val_accuracy: 0.9315 - val_loss: 0.2884\n",
      "Epoch 171/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.9322 - loss: 0.2861 - val_accuracy: 0.9317 - val_loss: 0.2812\n",
      "Epoch 172/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9349 - loss: 0.2826 - val_accuracy: 0.9337 - val_loss: 0.2809\n",
      "Epoch 173/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9337 - loss: 0.2812 - val_accuracy: 0.9335 - val_loss: 0.2781\n",
      "Epoch 174/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9350 - loss: 0.2765 - val_accuracy: 0.9282 - val_loss: 0.2984\n",
      "Epoch 175/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9321 - loss: 0.2871 - val_accuracy: 0.9348 - val_loss: 0.2792\n",
      "Epoch 176/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9350 - loss: 0.2790 - val_accuracy: 0.9319 - val_loss: 0.2816\n",
      "Epoch 177/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9344 - loss: 0.2768 - val_accuracy: 0.9278 - val_loss: 0.2885\n",
      "Epoch 178/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9343 - loss: 0.2801 - val_accuracy: 0.9315 - val_loss: 0.2837\n",
      "Epoch 179/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9361 - loss: 0.2757 - val_accuracy: 0.9330 - val_loss: 0.2806\n",
      "Epoch 180/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9357 - loss: 0.2762 - val_accuracy: 0.9355 - val_loss: 0.2739\n",
      "Epoch 181/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9365 - loss: 0.2727 - val_accuracy: 0.9339 - val_loss: 0.2765\n",
      "Epoch 182/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9367 - loss: 0.2708 - val_accuracy: 0.9365 - val_loss: 0.2728\n",
      "Epoch 183/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9375 - loss: 0.2726 - val_accuracy: 0.9328 - val_loss: 0.2768\n",
      "Epoch 184/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9361 - loss: 0.2748 - val_accuracy: 0.9324 - val_loss: 0.2839\n",
      "Epoch 185/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9355 - loss: 0.2749 - val_accuracy: 0.9297 - val_loss: 0.2855\n",
      "Epoch 186/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9335 - loss: 0.2802 - val_accuracy: 0.9343 - val_loss: 0.2785\n",
      "Epoch 187/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9365 - loss: 0.2736 - val_accuracy: 0.9331 - val_loss: 0.2780\n",
      "Epoch 188/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9363 - loss: 0.2716 - val_accuracy: 0.9179 - val_loss: 0.3128\n",
      "Epoch 189/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9309 - loss: 0.2868 - val_accuracy: 0.9353 - val_loss: 0.2779\n",
      "Epoch 190/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9344 - loss: 0.2822 - val_accuracy: 0.9302 - val_loss: 0.2856\n",
      "Epoch 191/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9360 - loss: 0.2710 - val_accuracy: 0.9330 - val_loss: 0.2791\n",
      "Epoch 192/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9347 - loss: 0.2745 - val_accuracy: 0.9306 - val_loss: 0.2914\n",
      "Epoch 193/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9359 - loss: 0.2734 - val_accuracy: 0.9358 - val_loss: 0.2734\n",
      "Epoch 194/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9336 - loss: 0.2800 - val_accuracy: 0.9228 - val_loss: 0.3004\n",
      "Epoch 195/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9316 - loss: 0.2835 - val_accuracy: 0.9302 - val_loss: 0.2902\n",
      "Epoch 196/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9338 - loss: 0.2807 - val_accuracy: 0.9331 - val_loss: 0.2808\n",
      "Epoch 197/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9350 - loss: 0.2735 - val_accuracy: 0.9312 - val_loss: 0.2828\n",
      "Epoch 198/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9347 - loss: 0.2750 - val_accuracy: 0.9347 - val_loss: 0.2742\n",
      "Epoch 199/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9371 - loss: 0.2695 - val_accuracy: 0.9344 - val_loss: 0.2789\n",
      "Epoch 200/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9343 - loss: 0.2739 - val_accuracy: 0.9312 - val_loss: 0.2807\n",
      "Epoch 201/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9328 - loss: 0.2812 - val_accuracy: 0.9291 - val_loss: 0.2898\n",
      "Epoch 202/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9336 - loss: 0.2788 - val_accuracy: 0.9338 - val_loss: 0.2797\n",
      "Epoch 203/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9343 - loss: 0.2770 - val_accuracy: 0.9320 - val_loss: 0.2752\n",
      "Epoch 204/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9349 - loss: 0.2762 - val_accuracy: 0.9329 - val_loss: 0.2777\n",
      "Epoch 205/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9362 - loss: 0.2667 - val_accuracy: 0.9300 - val_loss: 0.2842\n",
      "Epoch 206/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9364 - loss: 0.2707 - val_accuracy: 0.9331 - val_loss: 0.2737\n",
      "Epoch 207/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9356 - loss: 0.2696 - val_accuracy: 0.9357 - val_loss: 0.2774\n",
      "Epoch 208/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9381 - loss: 0.2675 - val_accuracy: 0.9345 - val_loss: 0.2737\n",
      "Epoch 209/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9361 - loss: 0.2694 - val_accuracy: 0.9346 - val_loss: 0.2784\n",
      "Epoch 210/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9382 - loss: 0.2661 - val_accuracy: 0.9349 - val_loss: 0.2714\n",
      "Epoch 211/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9341 - loss: 0.2704 - val_accuracy: 0.9334 - val_loss: 0.2791\n",
      "Epoch 212/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9341 - loss: 0.2771 - val_accuracy: 0.9351 - val_loss: 0.2793\n",
      "Epoch 213/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9334 - loss: 0.2800 - val_accuracy: 0.9353 - val_loss: 0.2816\n",
      "Epoch 214/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9351 - loss: 0.2735 - val_accuracy: 0.9350 - val_loss: 0.2743\n",
      "Epoch 215/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9376 - loss: 0.2710 - val_accuracy: 0.9373 - val_loss: 0.2699\n",
      "Epoch 216/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9390 - loss: 0.2628 - val_accuracy: 0.9290 - val_loss: 0.2782\n",
      "Epoch 217/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9334 - loss: 0.2735 - val_accuracy: 0.9319 - val_loss: 0.2823\n",
      "Epoch 218/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9336 - loss: 0.2759 - val_accuracy: 0.9231 - val_loss: 0.3074\n",
      "Epoch 219/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9313 - loss: 0.2858 - val_accuracy: 0.9328 - val_loss: 0.2777\n",
      "Epoch 220/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9369 - loss: 0.2685 - val_accuracy: 0.9374 - val_loss: 0.2661\n",
      "Epoch 221/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9366 - loss: 0.2659 - val_accuracy: 0.9322 - val_loss: 0.2790\n",
      "Epoch 222/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9313 - loss: 0.2827 - val_accuracy: 0.9249 - val_loss: 0.2937\n",
      "Epoch 223/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9325 - loss: 0.2806 - val_accuracy: 0.9279 - val_loss: 0.2896\n",
      "Epoch 224/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9347 - loss: 0.2779 - val_accuracy: 0.9368 - val_loss: 0.2677\n",
      "Epoch 225/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9379 - loss: 0.2631 - val_accuracy: 0.9340 - val_loss: 0.2742\n",
      "Epoch 226/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9371 - loss: 0.2629 - val_accuracy: 0.9319 - val_loss: 0.2779\n",
      "Epoch 227/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9354 - loss: 0.2682 - val_accuracy: 0.9335 - val_loss: 0.2776\n",
      "Epoch 228/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9376 - loss: 0.2650 - val_accuracy: 0.9339 - val_loss: 0.2755\n",
      "Epoch 229/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9349 - loss: 0.2715 - val_accuracy: 0.9289 - val_loss: 0.2846\n",
      "Epoch 230/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9343 - loss: 0.2755 - val_accuracy: 0.9320 - val_loss: 0.2756\n",
      "Epoch 231/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9357 - loss: 0.2710 - val_accuracy: 0.9349 - val_loss: 0.2736\n",
      "Epoch 232/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9364 - loss: 0.2687 - val_accuracy: 0.9283 - val_loss: 0.2856\n",
      "Epoch 233/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9325 - loss: 0.2815 - val_accuracy: 0.9356 - val_loss: 0.2791\n",
      "Epoch 234/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9358 - loss: 0.2732 - val_accuracy: 0.9350 - val_loss: 0.2742\n",
      "Epoch 235/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9351 - loss: 0.2725 - val_accuracy: 0.9345 - val_loss: 0.2707\n",
      "Epoch 236/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9354 - loss: 0.2676 - val_accuracy: 0.9350 - val_loss: 0.2755\n",
      "Epoch 237/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9366 - loss: 0.2663 - val_accuracy: 0.9334 - val_loss: 0.2662\n",
      "Epoch 238/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9382 - loss: 0.2619 - val_accuracy: 0.9304 - val_loss: 0.2804\n",
      "Epoch 239/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9335 - loss: 0.2756 - val_accuracy: 0.9334 - val_loss: 0.2787\n",
      "Epoch 240/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9382 - loss: 0.2658 - val_accuracy: 0.9345 - val_loss: 0.2757\n",
      "Epoch 241/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9386 - loss: 0.2594 - val_accuracy: 0.9335 - val_loss: 0.2761\n",
      "Epoch 242/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9352 - loss: 0.2672 - val_accuracy: 0.9367 - val_loss: 0.2639\n",
      "Epoch 243/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9387 - loss: 0.2634 - val_accuracy: 0.9366 - val_loss: 0.2647\n",
      "Epoch 244/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9378 - loss: 0.2629 - val_accuracy: 0.9323 - val_loss: 0.2777\n",
      "Epoch 245/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9369 - loss: 0.2673 - val_accuracy: 0.9364 - val_loss: 0.2682\n",
      "Epoch 246/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9362 - loss: 0.2657 - val_accuracy: 0.9330 - val_loss: 0.2736\n",
      "Epoch 247/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9382 - loss: 0.2607 - val_accuracy: 0.9338 - val_loss: 0.2715\n",
      "Epoch 248/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9387 - loss: 0.2603 - val_accuracy: 0.9350 - val_loss: 0.2669\n",
      "Epoch 249/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9390 - loss: 0.2577 - val_accuracy: 0.9358 - val_loss: 0.2713\n",
      "Epoch 250/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9350 - loss: 0.2688 - val_accuracy: 0.9340 - val_loss: 0.2741\n",
      "Epoch 251/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9370 - loss: 0.2662 - val_accuracy: 0.9308 - val_loss: 0.2719\n",
      "Epoch 252/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9318 - loss: 0.2803 - val_accuracy: 0.9312 - val_loss: 0.2806\n",
      "Epoch 253/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9349 - loss: 0.2736 - val_accuracy: 0.9358 - val_loss: 0.2694\n",
      "Epoch 254/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9383 - loss: 0.2640 - val_accuracy: 0.9352 - val_loss: 0.2718\n",
      "Epoch 255/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9390 - loss: 0.2595 - val_accuracy: 0.9339 - val_loss: 0.2737\n",
      "Epoch 256/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9366 - loss: 0.2668 - val_accuracy: 0.9324 - val_loss: 0.2781\n",
      "Epoch 257/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9374 - loss: 0.2639 - val_accuracy: 0.9347 - val_loss: 0.2691\n",
      "Epoch 258/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9369 - loss: 0.2643 - val_accuracy: 0.9358 - val_loss: 0.2702\n",
      "Epoch 259/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9350 - loss: 0.2672 - val_accuracy: 0.9229 - val_loss: 0.2982\n",
      "Epoch 260/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9300 - loss: 0.2863 - val_accuracy: 0.9362 - val_loss: 0.2738\n",
      "Epoch 261/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9350 - loss: 0.2723 - val_accuracy: 0.9299 - val_loss: 0.2849\n",
      "Epoch 262/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9373 - loss: 0.2666 - val_accuracy: 0.9330 - val_loss: 0.2793\n",
      "Epoch 263/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9361 - loss: 0.2704 - val_accuracy: 0.9296 - val_loss: 0.2803\n",
      "Epoch 264/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9342 - loss: 0.2709 - val_accuracy: 0.9277 - val_loss: 0.2884\n",
      "Epoch 265/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9362 - loss: 0.2703 - val_accuracy: 0.9355 - val_loss: 0.2704\n",
      "Epoch 266/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9394 - loss: 0.2588 - val_accuracy: 0.9314 - val_loss: 0.2848\n",
      "Epoch 267/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9340 - loss: 0.2725 - val_accuracy: 0.9285 - val_loss: 0.2949\n",
      "Epoch 268/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9314 - loss: 0.2811 - val_accuracy: 0.9321 - val_loss: 0.2842\n",
      "Epoch 269/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9339 - loss: 0.2712 - val_accuracy: 0.9351 - val_loss: 0.2717\n",
      "Epoch 270/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.9356 - loss: 0.2681 - val_accuracy: 0.9360 - val_loss: 0.2700\n",
      "Epoch 271/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9363 - loss: 0.2630 - val_accuracy: 0.9374 - val_loss: 0.2681\n",
      "Epoch 272/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.9378 - loss: 0.2640 - val_accuracy: 0.9363 - val_loss: 0.2710\n",
      "Epoch 273/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9368 - loss: 0.2671 - val_accuracy: 0.9337 - val_loss: 0.2733\n",
      "Epoch 274/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9348 - loss: 0.2676 - val_accuracy: 0.9351 - val_loss: 0.2764\n",
      "Epoch 275/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9333 - loss: 0.2715 - val_accuracy: 0.9314 - val_loss: 0.2821\n",
      "Epoch 276/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 11ms/step - accuracy: 0.9330 - loss: 0.2751 - val_accuracy: 0.9348 - val_loss: 0.2767\n",
      "Epoch 277/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9371 - loss: 0.2648 - val_accuracy: 0.9338 - val_loss: 0.2749\n",
      "Epoch 278/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9344 - loss: 0.2691 - val_accuracy: 0.9328 - val_loss: 0.2779\n",
      "Epoch 279/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9356 - loss: 0.2659 - val_accuracy: 0.9305 - val_loss: 0.2867\n",
      "Epoch 280/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9359 - loss: 0.2683 - val_accuracy: 0.9317 - val_loss: 0.2763\n",
      "Epoch 281/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.9358 - loss: 0.2652 - val_accuracy: 0.9318 - val_loss: 0.2833\n",
      "Epoch 282/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9363 - loss: 0.2609 - val_accuracy: 0.9348 - val_loss: 0.2749\n",
      "Epoch 283/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9383 - loss: 0.2614 - val_accuracy: 0.9352 - val_loss: 0.2641\n",
      "Epoch 284/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9396 - loss: 0.2564 - val_accuracy: 0.9367 - val_loss: 0.2593\n",
      "Epoch 285/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9407 - loss: 0.2521 - val_accuracy: 0.9313 - val_loss: 0.2708\n",
      "Epoch 286/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9354 - loss: 0.2634 - val_accuracy: 0.9287 - val_loss: 0.2823\n",
      "Epoch 287/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9364 - loss: 0.2630 - val_accuracy: 0.9313 - val_loss: 0.2789\n",
      "Epoch 288/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9367 - loss: 0.2686 - val_accuracy: 0.9315 - val_loss: 0.2691\n",
      "Epoch 289/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9340 - loss: 0.2696 - val_accuracy: 0.9357 - val_loss: 0.2812\n",
      "Epoch 290/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 15ms/step - accuracy: 0.9368 - loss: 0.2673 - val_accuracy: 0.9365 - val_loss: 0.2658\n",
      "Epoch 291/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9366 - loss: 0.2632 - val_accuracy: 0.9335 - val_loss: 0.2735\n",
      "Epoch 292/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9354 - loss: 0.2646 - val_accuracy: 0.9300 - val_loss: 0.2843\n",
      "Epoch 293/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9319 - loss: 0.2775 - val_accuracy: 0.9277 - val_loss: 0.3010\n",
      "Epoch 294/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9337 - loss: 0.2729 - val_accuracy: 0.9264 - val_loss: 0.2935\n",
      "Epoch 295/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9316 - loss: 0.2754 - val_accuracy: 0.9292 - val_loss: 0.2867\n",
      "Epoch 296/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9363 - loss: 0.2664 - val_accuracy: 0.9358 - val_loss: 0.2678\n",
      "Epoch 297/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9363 - loss: 0.2678 - val_accuracy: 0.9328 - val_loss: 0.2739\n",
      "Epoch 298/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 13ms/step - accuracy: 0.9349 - loss: 0.2656 - val_accuracy: 0.9335 - val_loss: 0.2695\n",
      "Epoch 299/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 12ms/step - accuracy: 0.9364 - loss: 0.2660 - val_accuracy: 0.9365 - val_loss: 0.2674\n",
      "Epoch 300/300\n",
      "\u001b[1m10/10\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 14ms/step - accuracy: 0.9402 - loss: 0.2537 - val_accuracy: 0.9343 - val_loss: 0.2706\n"
     ]
    }
   ],
   "source": [
    "out = model.fit(\n",
    "    x_train,\n",
    "    y_train,\n",
    "    batch_size=6000,\n",
    "    epochs=300,\n",
    "    validation_data=(x_test, y_test),\n",
    "    verbose=1,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Check the different keys associated with the out.history dictionnary\n",
    "- Plot the evolution of the loss function and success rate for the training and validation samples as a function of the number of epochs. What is the maximum success rate achieved with this neural network architecture? Does it appear to have converged? Increase the number of epochs in the training phase so that it converges to within $\\sim10^{-3}$. What maximum value do you obtain?\n",
    "- Perform the same training with a learning rate of $0.2$. What is your maximum success rate?\n",
    "- Change the number of neurons in the hidden layer, add an extra hidden layer, change the size of the batch size, and check the impact of these changes on the succes rate.\n",
    "- What do you notice about the loss function of the validation sample if you use a network with two hidden layers and a small batch size? "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dict_keys(['accuracy', 'loss', 'val_accuracy', 'val_loss'])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "out.history.keys()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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kQpLhQ0RERERERERqbBU2BCRUpOcnMzDDz9MrVq18PHxISIigp49e7Jx40YADMNg/vz55dtIERER8QjKS0Q8h1d5N0BErh133XUXeXl5fPjhh9SpU4eTJ0+yYsUKzpw5U95NExEREQ+jvETEcximaZrl3QgRqfjOnTtH5cqVWb16NV26dCm0vnbt2hw+fNj9ODo6msTERAAWLlzIhAkT2L17N1FRUQwePJhnn30WLy+r9moYBlOnTmXBggWsXr2aiIgIXn31Vfr161cmxyYiIiIVi/ISEc+iS1FEpFQEBgYSGBjI/PnzycnJKbR+69atAMyYMYOkpCT34yVLljBo0CAee+wx9uzZw7vvvssHH3zA3//+9wLPf+6557jrrrv49ttvGTRoEAMHDmTv3r2//4GJiIhIhaO8RMSzqMeGiJSaOXPmMHz4cLKysmjVqhVdunRhwIABNG/eHLB+4Zg3bx533HGH+zk33ngjvXr14plnnnEv++STT/jLX/7C8ePH3c8bMWIE77zzjnub9u3b06pVK6ZOnVo2ByciIiIVivISEc+hHhsiUmruuusujh8/zoIFC+jZsyerV6+mVatWfPDBB8U+Z/v27bz44ovuX1YCAwMZPnw4SUlJZGZmureLjY0t8LzY2Fj9MiIiIiLFUl4i4jk0eKiIlCpfX1969OhBjx49GD9+PMOGDeP5559nyJAhRW7vcrl44YUX6Nu3b5H7+iWGYZRGk0VEROQapbxExDOox4aI/K4aN25MRkYGAA6HA6fTWWB9q1at2LdvH/Xq1St0s9ku/YnatGlTgedt2rSJhg0b/v4HICIiItcM5SUi1yb12BCRUpGSkkK/fv148MEHad68OUFBQWzbto1XX32V22+/HbBGIF+xYgUdO3bEx8eHypUrM378eG699VZq1qxJv379sNls7Ny5k127dvHSSy+59//555/Tpk0bOnXqxKeffsqWLVuYPn16eR2uiIiIXMWUl4h4Fg0eKiKlIicnhwkTJrB06VIOHjxIXl6eOykYN24cfn5+LFy4kDFjxpCYmEj16tXd06otWbKEF198kfj4eBwOBw0bNmTYsGEMHz4csLp2vv3228yfP5+1a9cSERHBpEmTGDBgQDkesYiIiFytlJeIeBYVNkTkqlfUqOUiIiIi5UF5icjVR2NsiIiIiIiIiEiFpcKGiIiIiIiIiFRYuhRFRERERERERCos9dgQERERERERkQpLhQ0RERERERERqbBU2BARERERERGRCkuFDRERERERERGpsFTYEBEREREREZEKS4UNEREREREREamwVNgQERERERERkQpLhQ0RERERERERqbBU2BARERERERGRCuv/AakcNMreATxtAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1300x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_results(loss, accuracy, loss_val, accuracy_val):\n",
    "    \"\"\"plot the evolution of training metrics\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    loss, accuracy: array\n",
    "        value of loss function and network accuracy\n",
    "        for the training sample\n",
    "    loss_val, accuracy_val: array\n",
    "        value of loss function and network accuracy\n",
    "        for the test sample\n",
    "\n",
    "    \"\"\"\n",
    "\n",
    "    fig, ax = plt.subplots(1, 2, figsize=(13, 5))\n",
    "    # training/test loss\n",
    "    ax[0].plot(loss, label=\"training\")\n",
    "    ax[0].plot(loss_val, label=\"testing\")\n",
    "    ax[0].set_xlabel(\"Step\")\n",
    "    ax[0].set_ylabel(\"Loss\")\n",
    "    ax[0].legend()\n",
    "    # training/test accuracy\n",
    "    ax[1].plot(accuracy, label=\"training\")\n",
    "    ax[1].plot(accuracy_val, label=\"testing\")\n",
    "    ax[1].set_xlabel(\"Step\")\n",
    "    ax[1].set_ylabel(\"Accuracy\")\n",
    "    ax[1].legend()\n",
    "    plt.show()\n",
    "\n",
    "plot_results(\n",
    "    out.history[\"loss\"],\n",
    "    out.history[\"accuracy\"],\n",
    "    out.history[\"val_loss\"],\n",
    "    out.history[\"val_accuracy\"],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "provenance": [
    {
     "file_id": "https://github.com/gmention-at-cea/sos2021/blob/main/Welcome_To_Colaboratory.ipynb",
     "timestamp": 1715332750197
    }
   ],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "sos2024DL",
   "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.9.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
