{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Basics with numerical time-series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Find this notebook at `EpyNN/epynnlive/dummy_time/train.ipynb`.\n", "* Regular python code at `EpyNN/epynnlive/dummy_time/train.py`.\n", "\n", "Run the notebook online with [Google Colab](https://colab.research.google.com/github/Synthaze/EpyNN/blob/main/epynnlive/dummy_time/train.ipynb).\n", "\n", "**Level: Intermediate**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this notebook we will review:\n", "\n", "* Handling univariate time series data to proceed with Neural Network regression.\n", "* Training of Feed-Forward (FF) and Recurrent Neural Network (RNN) for binary classification tasks.\n", "* Overfitting of the model to the training data and the impact of Dropout regularization.\n", "\n", "**It is assumed that the following *basics* notebooks were already reviewed:**\n", "\n", "* [Basics with Perceptron (P)](../dummy_boolean/train.ipynb)\n", "* [Basics with string sequence](../dummy_string/train.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**This notebook does not enhance, extend or replace EpyNN's documentation.**\n", "\n", "**Relevant documentation pages for the current notebook:**\n", "\n", "* [Fully Connected (Dense)](https://epynn.net/Dense.html)\n", "* [Recurrent Neural Network (RNN)](https://epynn.net/RNN.html)\n", "* [Dropout - Regularization](https://epynn.net/Dropout.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Environment and data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Follow [this link](prepare_dataset.ipynb) for details about data preparation." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Briefly, sample features are univariate time series which may consist of only white noise (negative) or white noise supplemented with a pure sine-wave of random frequency (positive). \n", "\n", "The goal of the game is to train a Neural Network which may be able to detect if sample features do or do not contain a true signal." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# EpyNN/epynnlive/dummy_time/train.ipynb\n", "# Install dependencies\n", "!pip3 install --upgrade-strategy only-if-needed epynn\n", "\n", "# Standard library imports\n", "import random\n", "\n", "# Related third party imports\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "# Local application/library specific imports\n", "import epynn.initialize\n", "from epynn.commons.maths import relu, softmax\n", "from epynn.commons.library import (\n", " configure_directory,\n", " read_model,\n", ")\n", "from epynn.network.models import EpyNN\n", "from epynn.dropout.models import Dropout\n", "from epynn.embedding.models import Embedding\n", "from epynn.flatten.models import Flatten\n", "from epynn.rnn.models import RNN\n", "from epynn.dense.models import Dense\n", "from epynnlive.dummy_time.prepare_dataset import prepare_dataset\n", "from epynnlive.dummy_time.settings import se_hPars\n", "\n", "\n", "########################## CONFIGURE ##########################\n", "random.seed(1)\n", "np.random.seed(1)\n", "\n", "np.set_printoptions(threshold=10)\n", "\n", "np.seterr(all='warn')\n", "\n", "configure_directory()\n", "\n", "\n", "############################ DATASET ##########################\n", "X_features, Y_label = prepare_dataset(N_SAMPLES=1024)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's control what we retrieved." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(128, 1)\n", "[[-0.35376783]\n", " [-0.17895082]\n", " [-0.29156932]\n", " ...\n", " [-0.25263271]\n", " [-0.74700792]\n", " [-0.16726332]]\n" ] } ], "source": [ "print(X_features[0].shape)\n", "print(X_features[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is called a *univariate time series* because it contains a single measurement per time step. Note we retrieved data with a sampling rate of 128 Hz and duration of 1 second for a total of 128 points." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(X_features[0], label='label: %s' % Y_label[0])\n", "plt.plot(X_features[1], label='label: %s' % Y_label[1])\n", "plt.legend()\n", "plt.show()\n", "plt.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "While sample features corresponding to ``label: 1`` do not contain a true signal, sample features corresponding to ``label: 0`` do contain a true signal of random frequency." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feed-Forward (FF)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Feed-Forward Neural Networks are advantageous compared to other architectures because they are relatively fast to train, and most often less sensitive to parameters of training, also called *hyperparameters*. Therefore, they are most commonly a first choice when dealing with a new problem and prior to further insights." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Embedding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In EpyNN, sample features (X_features) and labels (Y_label) are passed to the corresponding arguments value when instantiating the *embedding* or *input* layer. It is required to use this layer in EpyNN, which is then always the first layer of the network architecture. The layer consists of a simple forward pass but contains several routines to prepare data according to user choices." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "embedding = Embedding(X_data=X_features,\n", " Y_data=Y_label,\n", " Y_encode=True,\n", " relative_size=(2, 1, 0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Herein, we instructed to the class constructor ``Embedding`` to one-hot encode the set of sample label ``Y_encode=True``. We also instructed to split data in order to build a training set contraining ``2/3`` of the whole set while the validation set will contain ``1/3``." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The training procedure is exclusively driven by the training data. However, one may judge how general the model can be by comparing metrics with evaluation on the validation set." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Flatten-(Dense)n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As introduced before, sample features are univariate time series and as such the set of sample features has 3 dimensions." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(683, 128, 1)\n" ] } ], "source": [ "print(embedding.dtrain.X.shape) # (m, s, v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It contains 683 samples (m), each described by a sequence of 128 features (s) containing 1 element (v).\n", "\n", "However, the fully-connected or *dense* layer can only process bi-dimensionnal input arrays. That is the reason why we need to invoke a *flatten* layer in between the *embedding* and *dense* layer." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(683, 128, 1)\n", "(683, 128)\n", "(683, 128, 1)\n" ] } ], "source": [ "flatten = Flatten()\n", "\n", "# Original shape (m, s, v)\n", "print(embedding.dtrain.X.shape)\n", "\n", "# Flatten on forward pass (m, s * v)\n", "print (flatten.forward(embedding.dtrain.X).shape)\n", "\n", "# Reverse on backward pass (m, s, v)\n", "print (flatten.backward(flatten.forward(embedding.dtrain.X)).shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In other words, the *flatten* layer is an adapter.\n", "\n", "Let's now build the network architecture." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "name = 'Flatten_Dense-64-relu_Dense-2-softmax'\n", "\n", "# Tune defaults learning rate from 0.1 to 0.005\n", "se_hPars['learning_rate'] = 0.005\n", "\n", "flatten = Flatten()\n", "\n", "hidden_dense = Dense(64, relu)\n", "\n", "dense = Dense(2, softmax)\n", "\n", "layers = [embedding, flatten, hidden_dense, dense]\n", "\n", "model = EpyNN(layers=layers, name=name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The network - or model - architecture is composed of the mandatory *embedding* input layer, one *hidden_dense* layer with 64 nodes and *ReLU* activation function and finally an output *dense* layer with 2 nodes - because we have two distinct one-hot encoded labels - and a *softmax* activation function.\n", "\n", "We now initialize the model and instruct it to use a *Mean Square Error* cost function with network *seeding* for reproducibility and we provide our custom hyperparameters." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m--- EpyNN Check OK! --- \u001b[0m\r" ] } ], "source": [ "model.initialize(loss='MSE', seed=1, se_hPars=se_hPars.copy(), end='\\r')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The initialize method performs a dry epoch which includes all steps but omits parameters update.\n", "\n", "We can now proceed with the training." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[37mEpoch 99 - Batch 0/0 - Accuracy: 1.0 Cost: 0.00075 - TIME: 7.75s RATE: 1.29e+01e/s TTC: 0s \u001b[0m\n", "\n", "+-------+----------+----------+----------+-------+--------+-------+--------------------------------------------------+\n", "| \u001b[1m\u001b[37mepoch\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[32maccuracy\u001b[0m | | \u001b[1m\u001b[31mMSE\u001b[0m | | \u001b[37mExperiment\u001b[0m |\n", "| | \u001b[37mDense\u001b[0m | \u001b[37mDense\u001b[0m | \u001b[1m\u001b[32mdtrain\u001b[0m | \u001b[1m\u001b[32mdval\u001b[0m | \u001b[1m\u001b[31mdtrain\u001b[0m | \u001b[1m\u001b[31mdval\u001b[0m | |\n", "+-------+----------+----------+----------+-------+--------+-------+--------------------------------------------------+\n", "| \u001b[1m\u001b[37m0\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.722\u001b[0m | \u001b[1m\u001b[32m0.695\u001b[0m | \u001b[1m\u001b[31m0.197\u001b[0m | \u001b[1m\u001b[31m0.214\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m10\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.975\u001b[0m | \u001b[1m\u001b[32m0.868\u001b[0m | \u001b[1m\u001b[31m0.031\u001b[0m | \u001b[1m\u001b[31m0.097\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m20\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.894\u001b[0m | \u001b[1m\u001b[31m0.008\u001b[0m | \u001b[1m\u001b[31m0.080\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m30\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.900\u001b[0m | \u001b[1m\u001b[31m0.004\u001b[0m | \u001b[1m\u001b[31m0.077\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m40\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.909\u001b[0m | \u001b[1m\u001b[31m0.003\u001b[0m | \u001b[1m\u001b[31m0.076\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m50\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.909\u001b[0m | \u001b[1m\u001b[31m0.002\u001b[0m | \u001b[1m\u001b[31m0.075\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m60\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.909\u001b[0m | \u001b[1m\u001b[31m0.001\u001b[0m | \u001b[1m\u001b[31m0.075\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m70\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.912\u001b[0m | \u001b[1m\u001b[31m0.001\u001b[0m | \u001b[1m\u001b[31m0.075\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m80\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.912\u001b[0m | \u001b[1m\u001b[31m0.001\u001b[0m | \u001b[1m\u001b[31m0.075\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m90\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.912\u001b[0m | \u001b[1m\u001b[31m0.001\u001b[0m | \u001b[1m\u001b[31m0.075\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m99\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m1.000\u001b[0m | \u001b[1m\u001b[32m0.909\u001b[0m | \u001b[1m\u001b[31m0.001\u001b[0m | \u001b[1m\u001b[31m0.074\u001b[0m | \u001b[37m1635012768_Flatten_Dense-64-relu_Dense-2-softmax\u001b[0m |\n", "+-------+----------+----------+----------+-------+--------+-------+--------------------------------------------------+\n" ] } ], "source": [ "model.train(epochs=100, init_logs=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can observe on the logs that an accuracy of 1 was reached after 40 iterations on the training set with a cost near zero. By contrast, we can observe that - although good - the metrics and cost computed on the validation set ran behind from the early epochs of the regression." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABHh0lEQVR4nO3deZgU1bn48e/bPT37PuwMArIIsgwCAolRiWiiWTSiiEZNUKMxXjUu12iMP4NbNs3NTW5MjCYGTUjwqtcECWpCADVxBdwAcQXZYfaZnqXX8/vjVDc9Sw8zMD1NT7+f5+lnquqcqj5V3VNvn3OqTokxBqWUUunLlewCKKWUSi4NBEopleY0ECilVJrTQKCUUmlOA4FSSqU5DQRKKZXmNBAopVSa00Cguk1EjIiMTXY51OETkSUicneyy9GfiEiOiDwtIvUi8niyy9MT/SoQiMjVIrJORHwisqRdWq6I/EpEqpwP6oWYtOtF5GMRaRCR3SLyMxHJiEnfJiItIuJ1Xn9vt+3rRWSvs/7DIpIVk3aXiLwjIkERWdxuvS+KyL9EpM5Z/7ciUhCTvinmPb3ONp6OSXeLyN1OmRtF5A0RKXbSxEnb5ezvWhGZ1I1juFZEWtu976e6cfhjtzHKCRqxx3CRiPyrJ9s5FM4Jzu8cj0YR2SgiPxSRokS/d0919Z2MyZMpIu+KyM5klLErqXKsRWSOiPxDRGpEpFJEHheRoQl4q3OBwUCZMWZBKgXbfhUIgN3A3cDDnaQ9CJQCE52/18ekLQemG2MKgclABXBtu/W/bIzJd16fiywUkc8DtwDzgJHA0cAdMet9CHwH+FsnZSpyyjvMKddw4N5IojFmUuQ9gQJgBxD7S+MO4NPAp4BC4GKg1UlbAFwKnOjs78vAHzopQ2eujtnXfGPMy91c70jxE2NMATAQuASYA/xbRPKSW6wOuvpORtwEVPZko86PgL76306FY12CPdajsP+jjcDvE/A+I4H3jTHBBGw7sYwx/e6FPbkuiZmfADQAhd1YtwxYBfwqZtk24NQ4+f8E/CBmfh6wt5N8fwQWH+S95wPvxEk7GfsFznPmSwAvMCZO/puB/42ZnwS0dmP/1wLfiJNmgLHO9BeBN5zjuiN234DtTl6v8/oUNkCFnPk6J18WcJ+Tfx/wAJDjpM0FdgI3AvuBPcAl3Sj/EuDudssKnPWvjll2KfAuUAs8B4xst59XAh8AdcD9gDhpY4HngXqgCnis3ffsH0AN8B5wXhflPOh3EhjtlPEMYGc3Prd7gH8DLU4545Yn9jgBi4B/xfusU/1Yd1Lu6UBjF+kDgBVOeWqAFwGXkzbROdZ1wCbgTGf5HYAfCGC/4990pv3O/NPmwLnkJuBtoAn4HbYW8Qz2/3sVUBJTlseBvc4xeAGY5CzPBN4ErnHm3c5nf3t3j0ObfT6UlY70Fx0DwdeAd4CfOV+od4Bz2q3zVew/psH+AquISduGPVFVAn9vl/YWsLDdl8hgq4ex2+9OIPhvYFmctIfb7dNJzpfxZueL8j7wHzHpI4H1wHjAA/wE+Es3jt1auhcI5gJTsLXKqc7x+YqTNsrJmxGz7iI6nmx+hq2NlWJPIE8DP4zZfhC40yn/F4Dm2H+SOGVcQruTk7P8UZwTCXAWtqY2EcgAbgNearefK4Bi4Cjncz/dSfsz8D1nv7OBzzjL87AB8RJnm8c537Vj45SzO9/JFcDZzrHoTiDYjg34GdjaZtzykKBAcCQe607Kdx3wShfpP8T+KPE4rxMBcaY/BG7FnohPwZ68j3HWWwz8savjgz2XvII9+Q/H/sjZ4OxDNrAa+H5M/kux/xtZ2PPDmzFpk7HBdaJznF4B3N05Bu1f/a1pKJ5y7EGrxzbDXA08IiITIxmMMX8ytmloPPZLsC9m/Qs5UK1cAzwXaYsH8p3tRkSmC+gBETkN+Dpweydpudj2xyXt9qnIKe9oJ32xsx2wv8r+hf211IJtKuqs6aEzv3D6LepEZENnGYwxa40x7xhjwsaYt7H/tCd3c/uIiABXANcbY2qMMY3AD4DzY7IFgDuNMQFjzErsL6tjuvse7ezGBhywv0B/aIx519hq/A+AaSIyMib/j4wxdcaY7djPfFpMmUYCw4wxrcaYSL/Hl4BtxpjfG2OCxpg3gCexx70zXX4nReRs7D/1Uz3YxyXGmE3OPp3ew/L0piPtWEeJyFTs/9hNXWQLAEOxNZeAMeZFY8+8c7D/7z8yxviNMauxQeyCg71vO/9jjNlnjNmFrW28aox5wxjTCjyFDQoAGGMeNsY0GmN82EBTEemDMcZsxP7o/Qvwn8DFxphQD8sC9L8+gnhasB/u3c4H+Dz2C/e59hmNMR9gq3y/iln2b2NMizGm2RjzQ+wv8ROdZC+2fT4iMt3Y3cKJyBxsE9O5xpj3O8kyH1tFfb7dPoE9UbY4J+Nl2F/OYL/sxwMjsL807gBWO0HlYK41xhQ7r+lxyjxbRNY4nW/12H/4Ad3YdsRAIBdYHwk6wLPO8ohq07a9tRn7j3gohmOPIdiTy89j3rcG+4tveEz+vXHe9ztO3teczvxLY7Y5OyaA1mF/QAwRkaNiO9+d/HG/k077+k/o2E8FgIg8ELO9W2OSdsRMxy3PQY/U4TvSjjUAYq94ewb4tjHmRWdZZ/nvxf7y/7vYi0hucZYPA3YYY8Ixm/2k3b50R+yPzJZO5vOdsrlF5Eci8pGINGBrE9D2/+wR53isdM5dhyTj4Fn6hbc7WWa6yJ8BjOki3WC/oGCDRgXwv858BbDPGFPdnYKJyHHY5pFLjTH/jJPt68Cjzq+SiMg+xS6LnZ6GrZ5HrjZZIiL/DRwLrOtO2Q7iT8AvgTOMMa3OtiNf0M6ObftlVdgv/STnl1HCiEg+cCq2DR3sCfMeY8zSnm7LGLMXuNzZ7meAVc7VPjuA540xp8VZtX0A6+o7OQ5bA33RVpzIBIpEZC8wxxhzJTbwxlufbpQnVhM2KAMgIoccLI7QY41TA1kF3GWMiV404dRC2uR3aqc3AjeKyGTsD6jXsTWdESLiigkGR2GbZTvdhe7taVxfxTatnYoNAkXYpiCJyfMrbK3k8yLymZhaU4/0qxqBiGSISDa248QtItliL2F8Adt++l0nzwnAZ7EdV4jIN0RkkDN9LPBd4J/O/FEicoJzGV+2iNyEPeH923nbR4HLRORYp7noNmKacETE45TJBWQ423A7aZOxv4KvMcZELwttt0/lTlkfiV1ujPkIW638nohkOU0K52O/FACvAwtEZLCIuETkYg60cfaGAqDGCQKzsF/aiEogjL2CKmIfUC4imU75w8BDwM9ijv1w5yqsXuEclxnYqnMtB64UeQD7XZjk5CsSkW41mYjIAuczwdmmwe7rCmC8iFzsfOYeETk+tvmxna6+kxuxNblpzusb2OM3jba/+rvSk/K8BUwSkWnOd3VxN98j6kg+1iIyHNv2/ktjzAPdeN8vichYsVG4HnuRQxh4FVtj+Y7znnOBL2Nr4p3ZR9v/gZ4qAHxANTZQ/6BdOS8GZmD7eK7FNi0eWo35UDoWjtQX9gts2r0WO2mTsJdQNgGbgbNj1vs99kNrwkbee4HsmPUiPfzV2AAxs9373uCs3+BsKysmbUknZVoU875hDlxd4wU2tdv2d4EX4+zvcGwg8QIfA9+MScvGXoGxxynXBpxOuIMcw7V0r7P4XGy1uBH7j/lL2naU3YkNCHXYttVM7CW0NUBVTBl/4JS9AXtlybVO2lzadZDSxdVb7Y633ymXF1tj+zFQ3C7fxdgO2shVTw93tp8x24x0rP4E2OVs+yPgiph8xzj7WOl8V1YD07ooa9zvZLt8HY5Fdz63rspDu45MbGdjlXMsLmp/DFL5WAPfp+1VbF7A28V+Xe9815qwV679v3afWeRKpvbnkcW0/R8Yh72ypw7nQg3afYdpdxEJNuivcqbzgb86x/cT7AUGBns11VHOfp8Qs+5jwEMH+x/v7BW5TEsppVSa6ldNQ0oppXpOA0EakrbDR8S+Tjz42sknHYfeiLwuTHbZ+hs91ulBm4aUUirNpdzlowMGDDCjRo1KdjGUUiqlrF+/vsoYM7CztJQLBKNGjWLdut64DF4ppdKHiHwSL037CJRSKs1pIFBKqTSngUAppdKcBgKllEpzGgiUUirNJSwQiH12734R2RgnXUTkFyLyoYi8LSKdDneslFIqsRJZI1iCfThGPGdgB2Uah31Aya8TWBallFJxJOw+AmPMCyIyqossZ3FgjP1XRKRYRIYaY/YkqkyprDUQorLRR02Tn3And4OHjaGmKUBlo48qr49gKNzJVpRSqWzexMFUjCju9e0m84ay4bQdW32ns6xDIBCRK7C1Bo466qg+KVwyBENhXvygisfX7+CVj2uiJ/xgyOD1BQ+ydlsiB8+jlEotgwqz+10g6DZjzIPAgwAzZ85M+cGR6lsCvPRhFWvfq+TDygNP09te00xlo4/SvEzmTRhEbqYbAJdLGJCfxcCCLEpzM3G7O57lBSjNy2RgQRZleVlkZuh1AEqp7klmINiFfQpTRLmzrN9q9gf5/l838X9v7CIUNhRkZzB5WBFulz2xzxpdypenDuOUCYP0RK6U6jPJDATLgatFZBkwG6jvz/0D7+9r5KqlG/io0svXPzWKL0wZynFHFeNx6wlfKZVcCQsEIvJn7CP2BojITuzj4jwAxj43dCXwBewzdJuBSxJVlmT729t7+M/H3yIvy80fL5vNCWMHHHwlpZTqI4m8auiCg6Qb4D8S9f5Hite31XDdY28wtbyYX184nUGF2ckuklJKtZESncWpalddC9/643rKS3J5+OvHU5TrSXaRlFKqAw0ECdLiD3HFo+toDYRZdsUMDQJKqSOWBoIEufWpd9i8p4HffX0mYwcVJLs4SikVl16ykgDPbtzDU2/s4tpTxnHKhMHJLo5SSnVJA0Evq23yc9tfNjJpWCFXnzI22cVRSqmD0qahXrb46U3UNQf4w2Wz9R4BpVRK0DNVL3pu017++uZurjllHBOHFia7OEop1S0aCHrRz/7xPscMLuCqz45JdlGUUqrbNBD0ospGH8ePLtEmIaVUStEzVi9q9AXJz9L7BZRSqUU7i3uJPxjGHwyTn+VOdlGU6rmgH5qrk12K/s+TDTklyS5FBxoIekmT8+CY/Cw9pF2q+Rg2/xVaG5JdEoWBxn2w9x2o3ALhQLILlB4KhsHQqTBgHLh62IIw4YtQPrPXi6RnrV4SeYJYfnY/bRqq/gh2rgMO8lwgVwYMnAADjwG3B0JBqHofdr4Gbz0G219y8vXT45RqckpgyBQYdyoUH4V9xJFKGF8D7N1og+9Ha8D08JGyxUdpIDiSNbZGagQHaRoKtELIB9lFfVCqOMJhqPsEWmoPnnfvO/Dmn2DHKz17D3em/dLW7bD7C1A2FuZ9HyrOh8JhPS+3UiohNBD0kiZ/JBAc5Jfu41+H7S/DhU/AiFmH96atDbBvE+x9G/a/CyF/1/lNGGo/gX0b7S+T7howHk69A8afDhmZXecNtNiy7H3b1iKOOQOGTLW/OgdO0IcpK3UE0kDQS7yRGkF2F4d027/g/WchIwce/Qpc8Cc4eu6BdGOgdpv9FV671c63F2yF/ZttnpqPDyzPKYHM/IMXtHA4TF1oT8z53RgHqWAwDJ3WsxP44Ekw5dzu51dKJZUGgl7S2L6zeNUd9hf65+62J1Fj7LKCYXDpM/DnC2DpAjj5ZmiqtCf2vRvBV3/wNys92p7IK75qO52GTIGCofprWyl1SDQQ9JJojSArA/xN8PL9tm08Iwvm3Q7vPWM7TL/8cygZBYv+BkvPhdV3gScXBk+GKefYZpShU6FsnO14bc/ltttUSqleooGgl0QvH83OgI9X2yBQfjy8+FP7a/3139nO0mkX2RVyS+HSv0PDLigqtyd4pZRKAg0EvaTRF0QEcj1u+OA5yCyAry2HxxfByv+0mRYsAXfMIXdnQMnIZBRXKaWidIiJXuJtDZKXmYFLgPf/DmM+C5m5sOD3MGI2HPVpmHhWsouplFIdaI2glzT5grZ/YO870Lgbxn/eJmTmwaXPQTgELo27Sqkjj56ZeonXF7T9Ax88ZxeMPe1AokjbJiGllDqCaCDoJY2RGsH7z8Gw4+z190oplQI0EPQSb2uAoRleOx7P+NOTXRyllOo2DQS9pMkXYlZoA2Bg3OeSXRyllOo2bbjuJV5fkOPMq5A3yA7JoJRSKUIDQS9pbA0wKvwujD9Rrw5SSqUUPWP1AmMMXl+QnFCjrREopVQK0UDQC1oDYcSEyAo1QU5xsoujlFI9ooGgFzT6AhTSZGeyi5NaFqWU6qmEBgIROV1E3hORD0Xklk7SjxKRNSLyhoi8LSJfSGR5EsXbGqRInECgNQKlVIpJWCAQETdwP3AGcCxwgYgc2y7bbcD/GmOOA84HfpWo8iSS1xekSGsESqkUlcgawSzgQ2PMx8YYP7AMaD/qmgEKnekiYHcCy5MwXp/WCJRSqSuRgWA4sCNmfqezLNZi4CIR2QmsBK7pbEMicoWIrBORdZWVlYko62HxtmqNQCmVupLdWXwBsMQYUw58AfiDiHQokzHmQWPMTGPMzIEDB/Z5IQ9GawRKqVSWyECwCxgRM1/uLIt1GfC/AMaYl4FsYEACy5QQTb6gXjWklEpZiQwErwPjRGS0iGRiO4OXt8uzHZgHICITsYHgyGv7Aaq9PowxnaY1OjUCk5ENnuw+LplSSh2ehAUCY0wQuBp4DngXe3XQJhG5U0TOdLLdCFwuIm8BfwYWmXhn2yRqbA3w6R+t5k+vbe803dsapESatTaglEpJCR1ryBizEtsJHLvs9pjpzcAJiSxDb6hp8uMLhnlqwy4unN3xGcNeX5BSdzOi/QNKqRSU7M7ilNDYGgRg3Se17K1v7ZDu9QUpcTVpjUAplZI0EHRDky8YnX5m454O6fbO4ma9YkgplZI0EHSD1wkEWRkuVr7TSSDwBSk0Xq0RKKVSkgaCbogEgi9MGcq6T2rZ19DaIT3feCG7KBnFU0qpw6KBoBsigWDBzHKMgWfa1QqaW33kGm0aUkqlJg0E3eB1Oosryos5ZnABK9/Z2yZdWhvshDYNKaVSkAaCbvD6gohAbqabL0wZyuuf1LA/pnnI7a+3E1ojUEqlIA0E3eD1BcnPykBE+OLUIRgDz22ytYJQ2JAZ0BqBUip1pU0g2LC9lv9e9T7hcM9vXPa22kAAMHZQAQMLsnhrp60FNPl1wDmlVGpLn0DwSS3/veoDGmPuCegury/IaE8thMMATBhSwJa9thbgbQ1SSLPNqDUCpVQKSptAUJybCUB9c6DH64Zb6ljivRLe+AMAE4cW8v4+L8FQWIegVkqlvPQJBDkeAGqb/T1e19NSSSYB2PYvwNYI/MEw26qb9DGVSqmUlzaBoCTPBoK6lp7XCNytdXZi13oAJgyxT9d8d09j9MH1YVcmeHJ6paxKKdWX0icQSBOTZCt1B6kRbK1q6rDME7k8tOYjaK5hzKA8MlzClr0NdngJvISzikAkEUVXSqmESptAMPiDZfwt63s0NjbEzbNxVz2fvW8tG7bXtlmeGaw/MLN7A1kZbsYMzGdLTI3A6PASSqkUlTaBILt4MAC++v1x82yvsVf/7KxtiS4zxpAdjAkeuzYAMGFoAVv2Nkb7CCSnJAGlVkqpxEubQODOtw+9DzXGDwTVXh9Am+ajZn+IIpowCJSNa9NPsKuuhd11LRRJE67c4sQVXimlEihtAgF5NhCYpqq4Waq8NgDUNh3oUG7yBSnCi99TACNm2UBgDBOGFgDw+ie1FEszLq0RKKVSVBoFggEAuFviB4LqJlsjiL3EtNEXpFi8BDKLYPh0aKqEuu1MdK4c2rSr3t5HoPcQKKVSVPoEglwbCDJaa+JmqWq0AaA+5hJTb2uQYpoIZRXD8Bl24a71DC7MojjXQygcIh99cL1SKnWlTyDIzMMvWWT74weCzmoETU6NwGQVw6BJ4M6CXesRESYMKaCAZlwYrREopVJW+gQCEZoziskN1MbNUh3pI4gZhqLR6SMgtwQyMmHo1DYdxtHhJbRGoJRKURnJLkBfas0qpaC1jlDY4HZ1vPmrspOrhrytQYqlCXeu0xk8fCasXwKhIBOHFrAOHWdI9R+BQICdO3fS2tp68MzqiJSdnU15eTkej6fb66RVIAhklVIqe2hsDUQHoYvwBUM0Ok8iq22KbRryU0gTvrwyu2D4DHj111D5LhOGjNAagepXdu7cSUFBAaNGjUL0TvmUY4yhurqanTt3Mnr06G6vlz5NQ0A4dwBl0tCm6Seixjn5DyrIoqE1SDBkh5z2NdXjFoMnv9RmHD7d/t35OuMHF1CsI4+qfqS1tZWysjINAilKRCgrK+txjS6tAoHkDaCMBuqcTuFYkf6BsYPyAWhwagehJtu5nJHnBILSo6GwHN57hpxMN1+dai8j1RqB6i80CKS2Q/n80ioQuAsGkSN+GhvqO6RF+gfGOYEgeuVQiw0EkusEAhGYcg58+E9oquKE4U7rmtYIlOp1ixcv5r777gNgyZIl7N69u8fbeOCBB3j00Ud7u2j9SloFgszCQQC01O/tkNa+RhDtMG6us39jf/FPWQAmBJv/Ai114PKAJzcxhVZKAV0HglAoFHe9K6+8kq997WuJKtZhCQZ7/sTEREirQJDjDDznr6/skBYZZ2hMpEbgDDPh8jmXm8YOITF4MgycCO88Aa11tjag1WmlesU999zD+PHj+cxnPsN7770HwBNPPMG6deu48MILmTZtGi0tLYwaNYqbb76Z6dOn8/jjj/PQQw9x/PHHU1FRwTnnnENzsx1EMrZWMXfuXG6++WZmzZrF+PHjefHFFzu8v9frZd68eUyfPp0pU6bw17/+NZr26KOPMnXqVCoqKrj44osB2LdvH2effTYVFRVUVFTw0ksvsW3bNiZPnhxd77777mPx4sXRMlx33XXMnDmTn//85zz99NPMnj2b4447jlNPPZV9+/ZFy3HJJZcwZcoUpk6dypNPPsnDDz/MddddF93uQw89xPXXX3/YxzytrhrKKR4CQMjbceC56iY/eR7DMTv/jwwGR5uGMnxOM1JsIBCBKefC6rsg5Nf+AdUv3fH0Jjbvjj9s+6E4dlgh3//ypLjp69evZ9myZbz55psEg0GmT5/OjBkzOPfcc/nlL3/Jfffdx8yZM6P5y8rK2LDBjghcXV3N5ZdfDsBtt93G7373O6655poO7xEMBnnttddYuXIld9xxB6tWrWqTnp2dzVNPPUVhYSFVVVXMmTOHM888k82bN3P33Xfz0ksvMWDAAGpqbLPxtddey8knn8xTTz1FKBTC6/VSWxv/fiUAv9/PunXrAKitreWVV15BRPjtb3/LT37yE376059y1113UVRUxDvvvBPN5/F4uOeee7j33nvxeDz8/ve/5ze/+c3BDvtBJTQQiMjpwM8BN/BbY8yPOslzHrAYMMBbxpivJqo87oL4A89VNfr4XPZ7lK25k5NdN1LXPAWAzEAkEBS3XSESCHath/LjE1VkpdLKiy++yNlnn01urm1qPfPMM7vMv3Dhwuj0xo0bue2226irq8Pr9fL5z3++03Xmz58PwIwZM9i2bVuHdGMMt956Ky+88AIul4tdu3axb98+Vq9ezYIFCxgwwA5XU1pq+w1Xr14d7YNwu90UFRUdNBDElnvnzp0sXLiQPXv24Pf7o5d9rlq1imXLlkXzlZTYH6OnnHIKK1asYOLEiQQCAaZMmdLle3VHwgKBiLiB+4HTgJ3A6yKy3BizOSbPOOC7wAnGmFoRGZSo8gDR8YbczZ0EgiY/n8naDwEY6aqK1ggyAw34JJusjKy2K5SMghGzYcerWiNQ/VJXv9yPFHl5edHpRYsW8Ze//IWKigqWLFnC2rVrO10nK8v+L7vd7k7b6JcuXUplZSXr16/H4/EwatSoHl+OmZGRQTgcjs63Xz+23Ndccw033HADZ555JmvXro02IcXzjW98gx/84AdMmDCBSy65pEfliieRfQSzgA+NMR8bY/zAMuCsdnkuB+43xtQCGGPiPyygN2Tm0kJ2pwPPVXt9HC22E3mMpyr6bOOcYAMtGYWdb2/KAvtXn06mVK846aST+Mtf/kJLSwuNjY08/fTT0bSCggIaGxvjrtvY2MjQoUMJBAIsXbr0kMtQX1/PoEGD8Hg8rFmzhk8++QSwv8Qff/xxqqurAaJNQ/PmzePXv/41YDut6+vrGTx4MPv376e6uhqfz8eKFSu6fL/hw4cD8Mgjj0SXn3baadx///3R+UgtY/bs2ezYsYM//elPXHDBBYe8n7ESGQiGAzti5nc6y2KNB8aLyL9F5BWnKakDEblCRNaJyLrKyo4dvT3hdReTE+gYCKq8PsrNHgBGuquiVw3lhRtpzYhzop90NrgyILfssMqklLKmT5/OwoULqaio4IwzzuD44w80uy5atIgrr7wy2lnc3l133cXs2bM54YQTmDBhwiGX4cILL2TdunVMmTKFRx99NLqtSZMm8b3vfY+TTz6ZiooKbrjhBgB+/vOfs2bNGqZMmcKMGTPYvHkzHo+H22+/nVmzZnHaaad1WZ7FixezYMECZsyYEW12AtvPUVtby+TJk6moqGDNmjXRtPPOO48TTjgh2lx0uMQY0ysb6rBhkXOB040x33DmLwZmG2OujsmzAggA5wHlwAvAFGNMXbztzpw500Q6WQ7FJz+aw15/NrNvXxtdZoxh3Pee4fXCmyhp3cnWjKO5ddCv+eM3ZrN+8WyGluQz4vrVnW/wozVQNhaKRxxymZQ6Urz77rtMnDgx2cVQB/GlL32J66+/nnnz5nWa3tnnKCLrjTEzO8ufyBrBLiD27FjuLIu1E1hujAkYY7YC7wPjElgmWjNLKQjXtVnW0BKEcIAin20aGhTeT22znyZ/kGK8BDO7aPoZ81kNAkqpPlFXV8f48ePJycmJGwQORSIDwevAOBEZLSKZwPnA8nZ5/gLMBRCRAdimoo8TWCaC2aUUm/roWEIAVU0+hksVLhOEgRPJC3sJNtVFRx4NZ+tjKJVSyVdcXMz777/P448/3qvbTVggMMYEgauB54B3gf81xmwSkTtFJHJN2HNAtYhsBtYANxljqhNVJnAGnqOB+pihpqsafYx2OooZ81kA8lp24W0NUIQXo1cFKaX6sYTeR2CMWQmsbLfs9phpA9zgvPqE5A0gS4LsrK+lrGAoYG8mGyn2bj6O/iy88isGh/dRU1/PeAkiuVojUEr1X2k1xASAOzLeUO2e6LJqr49RspdwZn70ucQjpJLKfbaW4I6MPKqUUv1Q2gWCrGgg2BddVun1M9q1Fyk9GnJLCWbkUi6V1FTbPBl5enmoUqr/SrtAEBlvyN944H6Eaq+Po137kLIxIIIvfwTlUkVjrc2Tma81AqWSIXbAuJ5atGgRTzzxRC+XqH/qdiAQkX4xznJeqQ0E4cYDNzHXNjYznP1QOsamFY2gXCppqbdDUeQUao1AKdUzR8oQ091x0EAgIp92rurZ4sxXiMivEl6yBCkotUNREzPwnLthO27C9uljgLtkJOVSScBr82QXDeiwHaVUYnQ2DPWWLVuYNWtWNM+2bduig63deeedHH/88UyePJkrrriCg90kG2+46s6Gk4bOh55uX9vIz7fD169du5YTTzyRM888k2OPPRaAr3zlK8yYMYNJkybx4IMPRtd59tlnmT59OhUVFcybN49wOMy4ceOIjJ4QDocZO3YshzuaQnd056qhnwGfx7kHwBjzloiclNBSJZB4cvCSg6vlQCDI9W63E2W2RpA5cDQZ0kKJbxdkgEf7CFQ6euYW2PtO725zyBQ4o8MgxFHxhqGeMGECfr+frVu3Mnr0aB577LHoCJ5XX301t99uL0a8+OKLWbFiBV/+8pfjvsf8+fM7Ha66s+GkN23a1OnQ013ZsGEDGzdujI4i+vDDD1NaWkpLSwvHH38855xzDuFwmMsvv5wXXniB0aNHU1NTg8vl4qKLLmLp0qVcd911rFq1ioqKCgYOHNjtw3uoutU0ZIzZ0W5R/McBpYB6KSLTd+ADLW51AoHTNJRROgqASbKNABmQmdd+E0qpBIgdhrqwsLDNMNTnnXcejz32GECbQLBmzRpmz57NlClTWL16NZs2beryPTZu3MiJJ57IlClTWLp0aTT/6tWr+da3vgUcGE463tDTXZk1a1Y0CAD84he/oKKigjlz5rBjxw4++OADXnnlFU466aRovsh2L7300uiQ1g8//HCvjS56MN2pEewQkU8DRkQ8wLexN4ilLK+7mGy/DQS+YIihwd34s/LIzHOagIqPAmCyaysNkk+ZPn1MpaMufrknw8KFC1mwYAHz589HRBg3bhytra1cddVVrFu3jhEjRrB48eKDDhnd3eGquxI7zHQ4HMbvP3CDauwQ02vXrmXVqlW8/PLL5ObmMnfu3C7LN2LECAYPHszq1at57bXXDmsU1Z7oTo3gSuA/sCOH7gKmOfMpq9lTQl6wDoCaJj+jZB/evKMOPG6yeCQApeKlSQqSVEql0k9Xw1CPGTMGt9vNXXfdFa0NRE6qAwYMwOv1dusqoXjDVXc2nHS8oadHjRrF+vXrAVi+fDmBQKDT96qvr6ekpITc3Fy2bNnCK6+8AsCcOXN44YUX2Lp1a5vtgn3ewEUXXcSCBQtwu93dOGqH76CBwBhTZYy50Bgz2BgzyBhzUaKHgUg0X1YphaE6AKoa/YySvfiKDlTlyCmmSWxUb3FrIFCqr3Q1DDXYWsEf//hHzjvvPMCOvXP55ZczefJkPv/5z3fI35l4w1V3Npx0vKGnL7/8cp5//nkqKip4+eWX29QCYp1++ukEg0EmTpzILbfcwpw5cwAYOHAgDz74IPPnz6eioqLNE8vOPPPM6POK+8pBh6EWkd9jHyPZhjHm0kQVqiuHOww1wL8euIbZe5Yi/6+Snz63mRtfO4nKaf/B0LPvjubZ+cPplPs+4s2cOUy7+bnDLbZSKUGHoU6+devWcf311/Piiy8e8jZ6Ogx1d/oIYh+tkw2cDew+5BIeAUxuGR4J8fv/+k921eWQkRlm8Ki2B60hexj4PsLv0aePKaX6xo9+9CN+/etf91nfQMRBA4Ex5snYeRH5M/CvhJWoD3gHH8/+j4q5pPlhLsm0y1wDxrfJ05I7HOoh0NWzCJRSqhfdcsst3HLLLX3+vocy+ug4ILEPmU+wOZ85jaUZ/+Crk7IpbdgCzVVQ3rbGFCgYAXsglFWcnEIqpVQfOWggEJFGbB+BOH/3AjcnuFwJVZKXydXznBrAkKM6zWOcS0jD+iwCpVQ/152mobS8bMY1wD4xM5Q/JMklUUqpxIobCERkelcrGmM29H5xjhyZQyYw37eYC8p777mgSil1JOrqPoKfdvE6tHFhU8jRA/NpHTKTKSN0CGqlkiV2GOolS5awe3fPL1h84IEHosM2dMe2bdsQEW677bbosqqqKjweD1dffTUA7733HnPnzmXatGlMnDiRK664ArB3EhcVFTFt2rToa9WqVT0uc1+LWyMwxny2LwtypCnK8bDy2ycmuxhKKceSJUuYPHkyw4YN65AWCoXi3oV75ZVX9vi9Ro8ezd/+9jfuvtveW/T4448zadKkaPq1117L9ddfz1lnnQXAO+8cGJzvxBNPZMWKFaSSbg06JyKTReQ8Efla5JXogiml0lNnw1A/8cQTrFu3jgsvvJBp06bR0tLCqFGjuPnmm5k+fTqPP/543OGlY2sVc+fO5eabb2bWrFmMHz8+7k1bubm5TJw4kcjNq4899lj0bmaAPXv2UF5eHp2PDImdqrpz1dD3gbnAsdgH0Z+BvY+g+3UtpVTK+fFrP2ZLzZZe3eaE0gncPCv+RYfxhqE+99xz+eUvf8l9993HzJkHLvUuKytjwwbbXVldXd3p8NLtBYNBXnvtNVauXMkdd9wRt+nm/PPPZ9myZQwePBi3282wYcOiTVPXX389p5xyCp/+9Kf53Oc+xyWXXEJxcTFgR1CdNm1adDtPPvkkY8aM6dFx6mvdqRGcC8wD9hpjLgEqgH5zl1W4pYWaRx/FhFJ6ZG2l+oWuhqHuTOwYPfGGl25v/vz5AMyYMYNt27bF3fbpp5/OP/7xD5YtW9bmfQAuueQS3n33XRYsWMDatWuZM2cOPp8PsE1Db775ZvR1pAcB6N4NZa3GmLCIBEWkENgPjEhwufqM9/nn2feDH5IzbRo5U6cmuzhKHTG6+uV+pIgd7K27w0tnZWUB9pkDXT1OMjMzkxkzZvDTn/6UzZs3s3z58jbpw4YN49JLL+XSSy9l8uTJbNy48fB3KEni1ghE5H4R+QzwmogUAw8B64ENwMt9U7zECzrDy4Zqa5NcEqVUV8NQFxQU0NjYGHfdeMNLH44bb7yRH//4xx0eSPPss89Gh57eu3cv1dXVDB8+vFfeMxm6qhG8D9wLDAOagD8DpwGFxpi3+6BsfSJUYwNAqK4uuQVRSrUZhnrQoEFthpVetGgRV155JTk5Obz8csffopHhpQcOHMjs2bO7DBrdNWnSpDZXC0X8/e9/59vf/jbZ2dkA3HvvvQwZMoQtW7Z06CO47bbbOPfccw+7LInUnWGoRwLnO68cbED4kzHmg8QXr6PeGIY61iffv43mx56k7JbvMGhR343/rdSRSIeh7h96Ogx1dx5M84kx5sfGmOOAC4CvAL17KUES7d/9IQD79nyY5JIopVRyHDQQiEiGiHxZRJYCzwDvAfMTXrI+Eq6tAyBQV9N1RqWU6qe6GmvoNGwN4AvAa8Ay4ApjTFMfla1PSL1tR9Q+AqVUuuqqs/i7wJ+AG40x/faSmowGe/ehqT/8jiWllEpFXY01dEpfFiQZjDFkNtqbQKTB2yHdv3MnnuHDEZG+LppSSvWZbo01dKhE5HQReU9EPhSRuM9fE5FzRMSISKc92okSbmzEHbZXTbkam9ukVX30Lh+cdhqb//bHviySUkr1uYQFAhFxA/djxyY6FrhARI7tJF8B8G3g1USVJZ5Qje0gbsyGDG9rm7TdH2zAZWDfx6l7t6BSqS52wLieWrRoEU888USny3Nzc9vcZ3DdddchIlRVVQF24LtJkyYxdepUpk2bxquv2tPT3LlzOeaYY6JDTB/p9wd016E8s7i7ZgEfGmM+BhCRZcBZwOZ2+e4CfgzclMCydCrgBILdZXDMrgAmEEA8HgBa9u3BAwTr6/u6WEqpBBs7dix//etfueiiiwiHw6xevTp6Z/DLL7/MihUr2LBhA1lZWVRVVeH3+6PrLl26tM3Ad/1BIpuGhgM7YuZ3OsuinKegjTDG/K2rDYnIFSKyTkTWVVZW9loBW6r2AbC71PYBhBoaomm+SpsWbtBOZKX6UmfDUG/ZsoVZs2ZF82zbti069POdd97J8ccfz+TJk7niiis42E2yYEcWfeyxxwD7MJkTTjiBjAz7u3jPnj0MGDAgOibRgAEDOn0GQn+SyBpBl0TEBfwXsOhgeY0xDwIPgr2zuLfK0LDfxqndZQIYQvX1ZJSVARByxiAy3o6dyEqlg70/+AG+d3v33tGsiRMYcuutcdPjDUM9YcIE/H4/W7duZfTo0Tz22GPREUGvvvpqbr/9dgAuvvhiVqxYwZe//OUuyzF+/HiWL19ObW0tf/7zn7nooot45plnAPjc5z7HnXfeyfjx4zn11FNZuHAhJ598cnTdCy+8kJycHABOO+007r333sM6JkeCRNYIdtF2lNJyZ1lEATAZWCsi24A5wPK+7DBuqtoLQO0gO15I7L0Epto2G0ljv7ptQqkjWlfDUJ933nnRX/GxgWDNmjXMnj2bKVOmsHr16rjDT7c3f/58li1bxquvvsqJJx54GmF+fj7r16/nwQcfZODAgSxcuJAlS5ZE05cuXRodYro/BAFIbI3gdWCciIzGBoDzga9GEo0x9cCAyLyIrAX+0xjTewMJHURr1X48GZA1tBx4n1Ddgf4AV41tJnI1tcZZW6n+ratf7smwcOFCFixYwPz58xERxo0bR2trK1dddRXr1q1jxIgRLF68mNbW7v3PLly4kBkzZvD1r38dl6vtb2K3283cuXOZO3cuU6ZM4ZFHHmHRokUJ2KsjQ8JqBMaYIHA18BzwLvC/xphNInKniHT9tIk+EqyupiEXSgcfZefrDtw356mzNQGP15eUsimVjroahnrMmDG43W7uuuuuaG0gctIfMGAAXq+306uE4hk5ciT33HMPV111VZvl7733Hh98cGBMzTfffJORI0cezm4d8RLaR2CMWYl9vGXsstvj5J2byLJ0JlxXT0MuDBo6BliFr6YqmpZV3wKAp8UfZ22lVG/rahhqsL/ib7rpJrZu3QpAcXExl19+OZMnT2bIkCEd8h/MN7/5zQ7LvF4v11xzDXV1dWRkZDB27FgefPDBaHpsH8GAAQPiPuoylRx0GOojTW8OQ/3SFz7DTqlH/uv/MfEr3yfvkosY/Z3vYUIhNk+ejMtAU66LmRu61+aoVKrTYaj7h14fhro/y6hvxl+QTUFWId4c8Ds1glBNDS4D3mzIbg1363I0pZRKVWkdCLK8PkKFeRR6CvFmQ6De9hFEHl+5uxTcYQg3NXe1GaWUSmlpGwjCPh+ZvjAUF1KQWUBjzoHLR/379wOwd4AbgNa6qnibUUqplJe2gSAyzpC7tISCzAK8ORIditq7195o1jis2P6t3pOUMiqVDNoUmtoO5fNL20Dgd5p/PKVlFDp9BJGhqJv27wYgdNQQO1/be8NaKHUky87Oprq6WoNBijLGUF1dTXZ2do/WS9oQE8lWv387ADkDBlPgsU1D7kZ7yahv/14CHsgbdhSwiRZtGlJpory8nJ07d9KbY3qpvpWdnU15eXmP1knbQNCwfycAeQOH4nF78OV6cPv8hP1+ApWV1OVB6UA7QkZrbXUyi6pUn/F4PIwePTrZxVB9LG2bhpor7ThDRYPsyT5YYG8QCdXVEa6uoS4fBg0+GjhwNZFSSvVHaRsIfFWVhARKnEAQLsgFbCCQ2nrq8oRhg2wgCNbXJauYSimVcGkbCPy11TTmwIDcgXZBYQEA4fp6Mmobqc8ThhWOoCkLgjHPKVBKqf4mbQOBqa3DmysUZNoA4CouAiBYWYnH66OlMIuCzAKassE06jMJlFL9V9oGAqlvpCXfg0vsIcgoLgbA99HHAARK8nC73LRmu0CfSaCU6sfSNhBkNLTgKzxwra2nuBQA30cfARAqKQSgNTcDt7el7wuolFJ9JG0DQVajj3BhXnQ+t6CEgBt8kXHIS21TUSAnE3ezPpxGKdV/pWUgMKEQOc1BTHFhdFlhVhGNOeD/ZBsAbufZxcH8LDKb9JkESqn+Ky0DQaihAZeBjJKS6LLCLDsCKcEQAFkDB9u8edlktgSTUUyllOoTaRkIImMJecqij0x2Bp6z095sKMi3fQamII8sXxgTCPR5OZVSqi+kZSCo3fsJYMcZioiMQApQlwdFWbaPQAryAQh59RJSpVT/lJaBoKFyFwB5A4ZGl0WeSQBQlyfRQOAusP0I4fr6Trdl/H4dqVEpldLSMhC0fmwvES0uPzC4VuQpZQD1eVCUaQNBRpH921pX02E7vo+38sG8eVQ/+FCCS6yUUomTloFAXt7Ax4NhwNAx0WVtmobyDzQNeYpsh3JT7f422wjs3s32yy4jVFmF770tfVRypZTqfWkXCIK1teRu2cF7EwsYlDsoujw/Mz/aWRzbNJTt3GjWXHNgfPZgdTXbL72MsNeLZ8QIAvvaBgmllEolaRcIvC++iMtA6FPTEJHo8gxXBoF82zZUlwfFWcUAZJfYK4ta6+wzCYwx7PjmlQT27mXEbx4gZ+pUgvv29e1OKKVUL0q7QLD/Hyupy4VRs+d1SAuU2DuNawqFfI+9Wii3xI5O6qu3gSCwfTutGzcy6IYbyJ0+nYzBgwnu368dxkqplJVWgcAEAvhfepU3xgozhh7fIb1qTBn3nOdi+7hC3C43APkFZQTcEHSuGmrdtAmAnBnTAfAMHoTx+wnV1fXNTiilVC9Lq0DQ/MYbuJtaeW9iAaMLOz6OryCzkLfGuCjKLolZVmCfSeAEgpZNmxCPh+xx4zDG8Nu9TwEQ3K/9BEqp1JRWgcC79nmCbsj+1Ow2/QMRhZn2noFIRzEQ80yCRgBaN24i65hjkMxMtjZs5dXghwDaT6CUSllpFQjqVq9i0whh6sjZnaYXZhW2+QuQ58mjKRtobMKEw7Ru3kz25EkAvLL7FWrsc20IaCBQSqWotAkE/k8+IbxtOxvGCjMHz+w0T+RpZZGbycBeTdSa40a8zQS2byfc2Ej2JBsIXt7zMrW2T5mgXkKqlEpRCQ0EInK6iLwnIh+KyC2dpN8gIptF5G0R+aeIjExUWbzPPw/A+xMLGFcyrtM8kUAQuXQ0wp+bibuplZZIR/GkSQTDQV7f+zoht9CQ59KmIaVUykpYIBARN3A/cAZwLHCBiBzbLtsbwExjzFTgCeAniSpP7syZrPx8KSMmHh99PGV7BR6nRhDTRwAQzMvC0+yndeMmJDOTrLFj2Vi1kaZAEyMKRlCdb7RpSCmVshJZI5gFfGiM+dgY4weWAWfFZjDGrDHGNDuzrwDliSpM46iBLJneELdZCGKahtoFglBeNplNAVo3box2FL+852UE4fRRp1NTAL59exJVdKWUSqhEBoLhwI6Y+Z3OsnguA57pLEFErhCRdSKyrrKysrMsB7V+33oAZgyeETdPZ1cNAYQLcnGHDS1vv032JFupeWX3KxxbdixHFx9NTYFeNaSUSl1HRGexiFwEzATu7SzdGPOgMWamMWbmwIEDD+k9moPNjCwcyYTSCXHzFGcXA1CSVdJmueTbO46Nz0fO5Mk0BZp4u/Jt5gydQ2l2KTX5AnUNhP36SEulVOpJZCDYBYyImS93lrUhIqcC3wPONMb4ElWY+ePms+LsFWS4MuLmmTZwGnd++k5mD217eamrsCA6nT1pEuv3rSdogswZNoey7LLoJaR6U5lSKhUlMhC8DowTkdEikgmcDyyPzSAixwG/wQaBpJ9F3S43Z487u0OwyCgsBoh2FL+8+2Wy3FkcN+g4ynLKqIleQqrNQ0qp1BP/5/FhMsYEReRq4DnADTxsjNkkIncC64wxy7FNQfnA486dvtuNMWcmqkyHyuM8nCbzmPGIx8Mre15h+qDpZLmzcGe5qS1wAWENBEqplJSwQABgjFkJrGy37PaY6VMT+f69JbPIPpPANWEcb1W+xYd1HzJ/3HzA3nAWKisCqvW5BEqplHREdBYf6bKHDGNvMYQ/M4P/2fA/lGaXcs64cw6kl5QR9Li0j0AplZI0EHRDXn4J134rg+eHN/Dq3lf5xpRvkOvJjaaX5pbRWOTRpiGlVErSQNAN+Zm2N/g3b/+GwbmDOe+Y89qk2yuHhMB+DQRKqdSjgaAbInccNwWa+GbFN8lyZ7VJL80upTIvpAPPKaVSkgaCbog8tnJEwQi+MvYrHdLLcsrYnxckuG+fPrJSKZVyNBB0w8DcgYwvGc9NM2/C4/J0SI/cXayPrFRKpaKEXj7aX2S5s3jyzCfjppdml7a5uzijpCRuXqWUOtJojaAXlOXYzmLQu4uVUqlHA0EviK0R6HMJlFKpRgNBLyjLLtNHViqlUpb2EfSCXE8umVm5+AoCBHbsOPgKSil1BNEaQS8pzS5lx+SBNKxciX/nzmQXRymluk0DQS8pzS5l7RnDICOD/ff9NNnFUUqpbtNA0EvKssvYntNE2WWX0fjsszSvW5fsIimlVLdoIOglpTmlVLdUU3bZpWQMGcK+H/4IEw7T8uab7LrhBnbf8l1CXm+yi6mUUh1oZ3EvKc0upba1FrKzGHTjDey+6Tt8/MUv4d+6FVdBAeHmZlreeovyX/ycrHHjMKEQLW+9RbixkbwTTkAy9KNQSiWHnn16SVl2GUETpNHfSOEXv0jd408Q2L2bwbfeSvE582nZtIldN9zI1vMWUnDqqTS99BKh6moAPOXllC5aROEXv0CopobArl2EGhvJGjOGrKOPRjIzk7x3Sqn+TANBLynNtk8xq26ppiiriKMeWYLz+E0A8mbNYvSTT7L7ppvwrllD/kknkj9vHpLhoebhh9l3993su/vujhv2eMgcMQIAEwhAKIQrPx93URGuokJcmZngzkA8HiQrE1d2DpKdhSszE8nMRDyRvx4k04Nk2Lw4fyP5yMiwaW43uN02f2TaeUWmieRzudrso1IqNWkg6CVlOWUAVLdWczRHd3qC9AwexMhHH8EY0ya94HOn0bJhA80bNuAZMgTP8HJceXn4PvgA35Z38X/yyYGTvctFyOslVF9HYPsOjN+PCQbty+cj3NqKaW2FvhoF1eWyAaKrvy4XuAQRF4gcCCBuN+J2gcTkQZxpJ09kfaHt+i45sJ4A4qwrEs3Tfh07LxCbT6Ttcpcrugyc7bZfB6LvabM46RCT3jbvgc875nvRJo/EbKJdngMzHdeL3WS0rO0T2m2ns+AtHdPil6NdWToTd3lslh6u23EDh/zebbP3tBzd/PHTS+WLlXv88WSPH9+99+8BDQS9JFIjqGmtOWje9l88ESF3xgxyZ8xoszz7mPHwpS/2uCzGGAgGMX4/Yb/f1iQCAcJ+v10eCNjAEQjYQBIJJqEQhEJOYAlhgrYGcmB5CMIhTCjspIUx4VCXfzFhTDjsTBuMCUPYQDiyPAQYTNjYaWMwmGh+TBgTnTZ2u8Gg3cfINpy06LoGiFluTLjjski+mHWjy8MmciA75o9d3tk0TrYu0iPTJmY6Xp720yZenthttM+j+o0hi7+vgeBIFts0lGwiAh6PbfrJy0t2cdQRpNPnZXQzCLWfjxtq4gWh7gSqrgJYTFr8bD3cbm8t75Cth4G4m/ldubkHz3QINBD0kuKsYlzi6laNQKlk6bQZ5BD7ebR3qP/Q+wh6idvlpjirmG0N25JdFKWU6hENBL3otJGn8dy257j/zfv1kZVKqZShTUO96LuzvksgHOCBtx6gJdDCjTNv1MsrlVJHPA0EvcjtcvP9T32fbHc2j2x+hOrWam6dfSsFmQXJLppSSsWlTUO9zCUubpl1C1dVXMXKrSs5+69n8+LOF5NdLKWUiksDQQKICN+a9i3+eMYfyffkc9U/r+K6Ndfx/I7nCYQDyS6eUkq1IanWqTlz5kyzLoWGePaH/Dz0zkMs27KMOl8dJVklnDryVOYMncOsIbMozi5OdhGVUmlARNYbY2Z2mqaBoG8EQgH+vfvfPP3R0/xr179oDjYjCONKxnFs2bFMLJ3IxLKJHF10NEVZRckurlKqn9FAcIQJhANsqtrEq3te5Y39b/BuzbttbkQryy5jVNEohucPZ2jeUIblD2NAzgAG5AxgYM5AirOL8bg8SdwDpVSq6SoQJPSqIRE5Hfg54AZ+a4z5Ubv0LOBRYAZQDSw0xmxLZJmOBB6Xh2mDpjFt0DTA3o6+r3kf79e+z8d1H/Nx/cd80vAJr+19jf3N+wmbcIdtFHgKKMkuoTCzkKKsIgozC8nPzCc/M58CTwG5nlxyM3Kjf3Mycsjx5JDjziErI4ssdxbZ7myy3FlkuDL0Mlel0ljCAoGIuIH7gdOAncDrIrLcGLM5JttlQK0xZqyInA/8GFiYqDIdqUSEIXlDGJI3hJPKT2qTFggHqGyupLKlkqrmKqpaqqjx1VDXWkdtay0N/gYa/A3saNyBN+DF6/fiD/t79P4ucZHpyiTT7bxcmXjcHjwu5+VMZ7gy2v6VDNwuNxmuDNxi/0am3eLG7XK3mXaJC7d08tdl/woSzefChcvl/JW2L0HsX5Fo3sh0bFqn00h0PjodMx/Jg3AgPwdG9WyzfmfLiB2RlI7vFTMwQ+x2Yte1b99225Hp2G0r1VsSWSOYBXxojPkYQESWAWcBsYHgLGCxM/0E8EsREZNq7VUJ5HF5GJY/jGH5w7q9jj/kpznQTFOwiaZAEy3BFvsKtOAL+WgJ2r+RV2uwFX/Ijz/sxx/yEwgHCIQC0flgOEjQBGkNtuINe+18OEjIhAiEAwTDQcIm3GZ5yIQIhUMETTCBR0d1CEidBJNIGtAmGHUWUDoLVO2Xt53sGKg62068sneWp817HeS9D7Z++231pEzx8sfL05N8h7rutyq+xemjT+/RdrsjkYFgOLAjZn4nMDteHmNMUETqgTKgKjaTiFwBXAFw1FFHJaq8/Ubkl30xxckuCgBhEyYUtsEhbMIEjR1GOjIfCocwOPPhMGHChEwIYwxhEz7wIhxdzzhDQ0fWjS53houOTsOBPE4+g91uJG/sfCQ97l9nGuiwLGZg6Q7rxS4DOk2LXR6djmwz+ifO9mJH5ozZRmQ++te0W9ZJvs620WmeLt6/M129V2d5DvbePVked5vdKfchlC/uIKiH+R6FmYVx0w5HStxZbIx5EHgQbGdxkoujesglLlxuFx60g1upI1EibyjbBYyImS93lnWaR0QygCJsp7FSSqk+kshA8DowTkRGi0gmcD6wvF2e5cDXnelzgdXaP6CUUn0rYU1DTpv/1cBz2MtHHzbGbBKRO4F1xpjlwO+AP4jIh0ANNlgopZTqQwntIzDGrARWtlt2e8x0K7AgkWVQSinVNR10Timl0pwGAqWUSnMaCJRSKs1pIFBKqTSXcqOPikgl8Mkhrj6Adnctp4l03O903GdIz/1Ox32Gnu/3SGPMwM4SUi4QHA4RWRdvGNb+LB33Ox33GdJzv9Nxn6F391ubhpRSKs1pIFBKqTSXboHgwWQXIEnScb/TcZ8hPfc7HfcZenG/06qPQCmlVEfpViNQSinVjgYCpZRKc2kTCETkdBF5T0Q+FJFbkl2eRBCRESKyRkQ2i8gmEfm2s7xURP4hIh84f0uSXdbeJiJuEXlDRFY486NF5FXn837MGQq9XxGRYhF5QkS2iMi7IvKpNPmsr3e+3xtF5M8ikt3fPm8ReVhE9ovIxphlnX62Yv3C2fe3RWR6T98vLQKBiLiB+4EzgGOBC0Tk2OSWKiGCwI3GmGOBOcB/OPt5C/BPY8w44J/OfH/zbeDdmPkfAz8zxowFaoHLklKqxPo58KwxZgJQgd3/fv1Zi8hw4FpgpjFmMnaI+/Ppf5/3EqD9w4njfbZnAOOc1xXAr3v6ZmkRCIBZwIfGmI+NMX5gGXBWksvU64wxe4wxG5zpRuyJYTh2Xx9xsj0CfCUpBUwQESkHvgj81pkX4BTgCSdLf9znIuAk7DM9MMb4jTF19PPP2pEB5DhPNcwF9tDPPm9jzAvYZ7TEivfZngU8aqxXgGIRGdqT90uXQDAc2BEzv9NZ1m+JyCjgOOBVYLAxZo+TtBcYnKxyJch/A98Bws58GVBnjAk68/3x8x4NVAK/d5rEfisiefTzz9oYswu4D9iODQD1wHr6/+cN8T/bwz6/pUsgSCsikg88CVxnjGmITXMeBdpvrhkWkS8B+40x65Ndlj6WAUwHfm2MOQ5ool0zUH/7rAGcdvGzsIFwGJBHxyaUfq+3P9t0CQS7gBEx8+XOsn5HRDzYILDUGPN/zuJ9kaqi83d/ssqXACcAZ4rINmyT3ynYtvNip+kA+ufnvRPYaYx51Zl/AhsY+vNnDXAqsNUYU2mMCQD/h/0O9PfPG+J/tod9fkuXQPA6MM65siAT27m0PMll6nVO2/jvgHeNMf8Vk7Qc+Loz/XXgr31dtkQxxnzXGFNujBmF/VxXG2MuBNYA5zrZ+tU+Axhj9gI7ROQYZ9E8YDP9+LN2bAfmiEiu832P7He//rwd8T7b5cDXnKuH5gD1MU1I3WOMSYsX8AXgfeAj4HvJLk+C9vEz2Ori28CbzusL2DbzfwIfAKuA0mSXNUH7PxdY4UwfDbwGfAg8DmQlu3wJ2N9pwDrn8/4LUJIOnzVwB7AF2Aj8Acjqb5838GdsH0gAW/u7LN5nCwj2qsiPgHewV1T16P10iAmllEpz6dI0pJRSKg4NBEopleY0ECilVJrTQKCUUmlOA4FSSqU5DQRKtSMiIRF5M+bVawO3icio2BEllToSZBw8i1Jpp8UYMy3ZhVCqr2iNQKluEpFtIvITEXlHRF4TkbHO8lEistoZC/6fInKUs3ywiDwlIm85r087m3KLyEPOmPp/F5GcpO2UUmggUKozOe2ahhbGpNUbY6YAv8SOegrwP8AjxpipwFLgF87yXwDPG2MqsOMAbXKWjwPuN8ZMAuqAcxK6N0odhN5ZrFQ7IuI1xuR3snwbcIox5mNncL+9xpgyEakChhpjAs7yPcaYASJSCZQbY3wx2xgF/MPYh4sgIjcDHmPM3X2wa0p1SmsESvWMiTPdE76Y6RDaV6eSTAOBUj2zMObvy870S9iRTwEuBF50pv8JfAuiz1Qu6qtCKtUT+ktEqY5yROTNmPlnjTGRS0hLRORt7K/6C5xl12CfFHYT9qlhlzjLvw08KCKXYX/5fws7oqRSRxTtI1Cqm5w+gpnGmKpkl0Wp3qRNQ0oplea0RqCUUmlOawRKKZXmNBAopVSa00CglFJpTgOBUkqlOQ0ESimV5v4/OXEM/9ecm3gAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "model.plot(path=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When plotting the accuracy and cost for training and validation sets, these differences are even more obvious.\n", "\n", "This is called *overfitting* of the model to the training data. In other words, the model represents very well - and even exactly - the data from which it was trained, but lacks such performance on independant data.\n", "\n", "There are many ways to limit such overfitting when designing or training a Neural Network. Herein we are going to experiment the *dropout* regularization method to see how it can impact such unwanted overfitting behavior." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For code, maths and pictures behind the *Flatten* and *Dense* layers, follow these links:\n", "\n", "* [Flatten - Adapter](https://epynn.net/Flatten.html)\n", "* [Fully Connected (Dense)](https://epynn.net/Dense.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Flatten-(Dense)n with Dropout" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can follow [this link]() for details on the *dropout* layer.\n", "\n", "Briefly, the *Dropout* regularization layer randomly subsamples the output of the previous layer and forwards the product to the next layer. By introducing such instability in the network, the layer reduces the thinning capacity of the network which may be of interest to prevent overfitting, which happens when the model is too closely related to the training data.\n", "\n", "In EpyNN, the class constructor ``Dropout()`` takes a single argument ``drop_prob`` which represents the probability of one element in the input array to be preserved in the output array.\n", "\n", "For instance." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-0.40461632 0.56992124 -0.188923 -1.92933133 -0.69195013]\n", " [ 1.04594288 -0.42813771 0.89180849 0.84383519 0.65651707]\n", " [-0.42446322 -1.20019422 2.12126642 0.27575357 -0.67915118]\n", " [-0.79589247 -0.40698592 -1.54560858 0.40910712 -0.89735926]\n", " [-1.02323887 -0.73387254 -0.17314366 0.50633278 2.35972254]]\n", "[[-0.40461632 0.56992124 -0.188923 -1.92933133 -0.69195013]\n", " [ 1.04594288 -0.42813771 0.89180849 0.84383519 0.65651707]\n", " [-0.42446322 -1.20019422 2.12126642 0.27575357 -0.67915118]\n", " [-0.79589247 -0.40698592 -1.54560858 0.40910712 -0.89735926]\n", " [-1.02323887 -0.73387254 -0.17314366 0.50633278 2.35972254]]\n", "[[-0.40461632 0.56992124 -0. -1.92933133 -0.69195013]\n", " [ 0. -0. 0.89180849 0. 0. ]\n", " [-0.42446322 -1.20019422 2.12126642 0.27575357 -0.67915118]\n", " [-0.79589247 -0.40698592 -1.54560858 0.40910712 -0.89735926]\n", " [-0. -0. -0. 0. 2.35972254]]\n", "[[-0. 0. -0. -0. -0.]\n", " [ 0. -0. 0. 0. 0.]\n", " [-0. -0. 0. 0. -0.]\n", " [-0. -0. -0. 0. -0.]\n", " [-0. -0. -0. 0. 0.]]\n" ] } ], "source": [ "test_array = np.random.standard_normal((5, 5))\n", "\n", "D1 = (np.random.uniform(0, 1, test_array.shape) < 1)\n", "D05 = (np.random.uniform(0, 1, test_array.shape) < 0.5)\n", "D0 = (np.random.uniform(0, 1, test_array.shape) < 0)\n", "\n", "print(test_array)\n", "print(test_array * D1) # drop_prob = 1 - No dropout\n", "print(test_array * D05) # drop_prob = 0.5 - Common value\n", "print(test_array * D0) # drop_prob = 0 - Output is null" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Usually, values for ``drop_prob`` are within 0-0.5.\n", "\n", "Let’s build the same Feed-Forward network as above but with the implementation of two *Dropout* layers." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "name = 'Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax'\n", "\n", "se_hPars['learning_rate'] = 0.005\n", "\n", "flatten = Flatten()\n", "\n", "dropout1 = Dropout(drop_prob=0.2)\n", "\n", "hidden_dense = Dense(64, relu)\n", "\n", "dropout2 = Dropout(drop_prob=0.5)\n", "\n", "dense = Dense(2, softmax)\n", "\n", "layers = [embedding, flatten, dropout1, hidden_dense, dropout2, dense]\n", "\n", "model = EpyNN(layers=layers, name=name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have set up a first *dropout1* between the *flatten* and *hidden_dense* layer as well as a second one between *hidden_dense* and *dense*.\n", "\n", "Note the ``drop_prob`` values are different for the two *dropout* layers. We will dropt 0.2 of the input for the first, and 0.5 for the second. Those settings are quite empirical, better just to test and see.\n", "\n", "Initialize with the same settings as is the no-dropout setup." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m--- EpyNN Check OK! --- \u001b[0m\r" ] } ], "source": [ "model.initialize(loss='MSE', seed=1, se_hPars=se_hPars.copy(), end='\\r')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see the *dropout* layers did appear in the check. Let's proceed with training." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[37mEpoch 99 - Batch 0/0 - Accuracy: 0.993 Cost: 0.0111 - TIME: 8.1s RATE: 1.23e+01e/s TTC: 0s \u001b[0m\n", "\n", "+-------+----------+----------+----------+-------+--------+-------+------------------------------------------------------------------------+\n", "| \u001b[1m\u001b[37mepoch\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[32maccuracy\u001b[0m | | \u001b[1m\u001b[31mMSE\u001b[0m | | \u001b[37mExperiment\u001b[0m |\n", "| | \u001b[37mDense\u001b[0m | \u001b[37mDense\u001b[0m | \u001b[1m\u001b[32mdtrain\u001b[0m | \u001b[1m\u001b[32mdval\u001b[0m | \u001b[1m\u001b[31mdtrain\u001b[0m | \u001b[1m\u001b[31mdval\u001b[0m | |\n", "+-------+----------+----------+----------+-------+--------+-------+------------------------------------------------------------------------+\n", "| \u001b[1m\u001b[37m0\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.518\u001b[0m | \u001b[1m\u001b[32m0.510\u001b[0m | \u001b[1m\u001b[31m0.303\u001b[0m | \u001b[1m\u001b[31m0.305\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m10\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.791\u001b[0m | \u001b[1m\u001b[32m0.736\u001b[0m | \u001b[1m\u001b[31m0.143\u001b[0m | \u001b[1m\u001b[31m0.173\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m20\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.922\u001b[0m | \u001b[1m\u001b[32m0.891\u001b[0m | \u001b[1m\u001b[31m0.061\u001b[0m | \u001b[1m\u001b[31m0.085\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m30\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.952\u001b[0m | \u001b[1m\u001b[32m0.897\u001b[0m | \u001b[1m\u001b[31m0.044\u001b[0m | \u001b[1m\u001b[31m0.079\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m40\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.971\u001b[0m | \u001b[1m\u001b[32m0.924\u001b[0m | \u001b[1m\u001b[31m0.030\u001b[0m | \u001b[1m\u001b[31m0.066\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m50\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.977\u001b[0m | \u001b[1m\u001b[32m0.927\u001b[0m | \u001b[1m\u001b[31m0.026\u001b[0m | \u001b[1m\u001b[31m0.068\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m60\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.980\u001b[0m | \u001b[1m\u001b[32m0.915\u001b[0m | \u001b[1m\u001b[31m0.022\u001b[0m | \u001b[1m\u001b[31m0.065\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m70\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.987\u001b[0m | \u001b[1m\u001b[32m0.918\u001b[0m | \u001b[1m\u001b[31m0.017\u001b[0m | \u001b[1m\u001b[31m0.061\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m80\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.985\u001b[0m | \u001b[1m\u001b[32m0.921\u001b[0m | \u001b[1m\u001b[31m0.014\u001b[0m | \u001b[1m\u001b[31m0.058\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m90\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.988\u001b[0m | \u001b[1m\u001b[32m0.891\u001b[0m | \u001b[1m\u001b[31m0.012\u001b[0m | \u001b[1m\u001b[31m0.073\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m99\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[37m5.00e-03\u001b[0m | \u001b[1m\u001b[32m0.974\u001b[0m | \u001b[1m\u001b[32m0.938\u001b[0m | \u001b[1m\u001b[31m0.021\u001b[0m | \u001b[1m\u001b[31m0.055\u001b[0m | \u001b[37m1635012776_Flatten_Dropout-02_Dense-64-relu_Dropout-05_Dense-2-softmax\u001b[0m |\n", "+-------+----------+----------+----------+-------+--------+-------+------------------------------------------------------------------------+\n" ] } ], "source": [ "model.train(epochs=100, init_logs=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is clear that the delta between training and validation set is much reduced now, both for accuracy metrics and MSE cost." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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LNXOd8MNN5zopB0zq9WKq6uEgeZGcszNWHp+CW1UOiXekWZAWHfzP3WHafgVO1Teiy1EA3viiSfo2rUrp556Kjt27ADg66+/Ji4ujmnTptG/f38KCwtp37499913HwMHDuSrr77inXfeYciQIfTr14+LL76YggLTd7pzrnv06NHcd999DB06lK5du7J8+fIq68/Ly+PMM89k4MCB9OnThx9++KF83EcffUTfvn3p168fV155JQDJyclMnDiRfv360a9fP/7++2/i4+Pp3bt3+XzPPfccjzzySHkabr/9dgYPHszLL7/Mjz/+yLBhwxgwYABjx44lOTm5PB0zZsygT58+9O3bl2+++Yb333+f22+/vXy577zzDnfccUfD7XwBSI65WUvPK6aNysDm6/iBlXXnuPcPyDoAw5rvnbgQx+vRH7ew9XBOgy6zZ5Q//3dBrxrHr1mzhs8//5z169djtVoZOHAggwYN4pJLLuG1117jueeeY/DgweXTh4SEsHbtWgDS09O57rrrAHjooYd47733uOWWW6qsw2q1snr1ahYsWMCjjz7KokWLKoz39PTku+++w9/fn7S0NIYPH86ECRPYunUr//3vf/n7778JDQ0lI8O8eOjWW2/l9NNP57vvvsNms5GXl0dmZmat+6GkpIS4uDgAMjMzWblyJUop3n33XZ555hmef/55Hn/8cQICAti0aVP5dG5ubjzxxBM8++yzuLm58cEHH/D2228fbbeLemrVgVkpNQ54GbAA72qtn6pmmkuBRwANbNBaX96oiaxFRn4JPVUGpQExZoBXIPhGwsYvzHdp+CVEg1q+fDkTJ07E29sbgAkTJtQ6/ZQpU8o/b968mYceeoisrCzy8vI455xzqp1n0qRJAAwaNIj4+Pgq47XWPPDAAyxbtgwXFxcOHTpEcnIyixcvZvLkyYSGmm5dg4ODAVi8eHF5HbbFYiEgIOCogdk53QkJCUyZMoXExERKSkrKH3NatGgRn3/+efl0QUGmT/gxY8Ywf/58evToQWlpKX369Kl1XaL+Wm1gVkpZgNeBs4AE4B+l1Dyt9VanaboA/wZGaq0zlVLhTZPa6mVnpeOnCskNjjkyMKwb7PsDLB4Q2bfpEifECVZbzra58PHxKf88ffp0vv/+e/r168ecOXNYunRptfN4eHgAJohardYq4+fOnUtqaipr1qzB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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "model.plot(path=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In brief, think about using *dropout* layers to reduce overfitting, alone or in combination with other methods." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For code, maths and pictures behind the *Dropout* layer, follow these links:\n", "\n", "* [Dropout - Regularization](https://epynn.net/Dropout.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Recurrent Neural Network (RNN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When dealing with any sort of sequential data, it is often suggested to use recurrent architectures because they can process three-dimensional input arrays and take advantage of the *sequential* nature of sample features." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Embedding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's embed our data again, using the same settings as before, and proceed with a little refresh." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(683, 128, 1)\n", "(683, 1)\n" ] } ], "source": [ "embedding = Embedding(X_data=X_features,\n", " Y_data=Y_label,\n", " Y_encode=True,\n", " relative_size=(2, 1, 0))\n", "\n", "print(embedding.dtrain.X.shape) # (m, s, v)\n", "print(embedding.dtrain.X[:, 0].shape) # Input shape at sequence step 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We have 683 samples (m) with sequential features of length 128 (s) which represents a univariate time series (v).\n", "\n", "We recalled before that sample features may be white noise, or white noise combined with a pure sine-wave of random frequency. While there is no expected **correlation through time** within the white noise, we expect a **periodic pattern** to repeat in the case where a pure since-wave is also present in sample features.\n", "\n", "Recurrent layers are said to have some internal memory of such periodic patterns because:\n", "\n", "* One recurrent layer is made of recurrent units or cells.\n", "* One unit processes every step in one sequence at time within a ``for`` loop.\n", "* The trick is: the output of every iteration - every step - is *fed back* in the unit for every *step forward* along the sequence.\n", "\n", "Said differently, the output of one recurrent cell does not only depend of the input at a given sequence step.\n", "\n", "This output of one iteration in sequence, called ``h`` for *hidden cell state*, becomes more and more \"impregnated\" by outputs of previous iterations along with the step forward in the sequence.\n", "\n", "These statements may be hard to understand. See [RNN - Forward](https://epynn.net/RNN.html) for some graphical elements." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### RNN-Dense" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below we will instantiate a simple *RNN* layer composed of 10 cells which forward the last (10th) hidden state to the output *dense* layer. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "name = 'RNN-10_Flatten_Dense-2-softmax'\n", "\n", "se_hPars['learning_rate'] = 0.01\n", "se_hPars['softmax_temperature'] = 5\n", "\n", "rnn = RNN(10)\n", "\n", "dense = Dense(2, softmax)\n", "\n", "layers = [embedding, rnn, dense]\n", "\n", "model = EpyNN(layers=layers, name=name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In contrast to the Feed-Forward network seen above, the *Flatten* layer is absent herein. This is because RNN returns the last hidden state of shape (10,). The flatten operation is therefore unnecessary. Note that RNN in EpyNN may return all hidden states sequences (``RNN(10, sequences=True)``) which then would require the use of a flatten layer because the shape would be (128, 10).\n", "\n", "Let's give a try to this RNN-based network." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m--- EpyNN Check OK! --- \u001b[0m\r" ] } ], "source": [ "model.initialize(loss='MSE', seed=1, se_hPars=se_hPars.copy(), end='\\r')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Start training." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[37mEpoch 99 - Batch 0/0 - Accuracy: 0.693 Cost: 0.2105 - TIME: 30.35s RATE: 3.29e+00e/s TTC: 1s \u001b[0m\n", "\n", "+-------+----------+----------+----------+-------+--------+-------+-------------------------------------------+\n", "| \u001b[1m\u001b[37mepoch\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[32maccuracy\u001b[0m | | \u001b[1m\u001b[31mMSE\u001b[0m | | \u001b[37mExperiment\u001b[0m |\n", "| | \u001b[37mRNN\u001b[0m | \u001b[37mDense\u001b[0m | \u001b[1m\u001b[32mdtrain\u001b[0m | \u001b[1m\u001b[32mdval\u001b[0m | \u001b[1m\u001b[31mdtrain\u001b[0m | \u001b[1m\u001b[31mdval\u001b[0m | |\n", "+-------+----------+----------+----------+-------+--------+-------+-------------------------------------------+\n", "| \u001b[1m\u001b[37m0\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.533\u001b[0m | \u001b[1m\u001b[32m0.499\u001b[0m | \u001b[1m\u001b[31m0.248\u001b[0m | \u001b[1m\u001b[31m0.251\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m10\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.561\u001b[0m | \u001b[1m\u001b[32m0.507\u001b[0m | \u001b[1m\u001b[31m0.247\u001b[0m | \u001b[1m\u001b[31m0.249\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m20\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.564\u001b[0m | \u001b[1m\u001b[32m0.510\u001b[0m | \u001b[1m\u001b[31m0.245\u001b[0m | \u001b[1m\u001b[31m0.248\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m30\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.581\u001b[0m | \u001b[1m\u001b[32m0.513\u001b[0m | \u001b[1m\u001b[31m0.242\u001b[0m | \u001b[1m\u001b[31m0.246\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m40\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.599\u001b[0m | \u001b[1m\u001b[32m0.528\u001b[0m | \u001b[1m\u001b[31m0.239\u001b[0m | \u001b[1m\u001b[31m0.244\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m50\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.609\u001b[0m | \u001b[1m\u001b[32m0.548\u001b[0m | \u001b[1m\u001b[31m0.236\u001b[0m | \u001b[1m\u001b[31m0.241\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m60\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.625\u001b[0m | \u001b[1m\u001b[32m0.589\u001b[0m | \u001b[1m\u001b[31m0.231\u001b[0m | \u001b[1m\u001b[31m0.237\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m70\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.638\u001b[0m | \u001b[1m\u001b[32m0.622\u001b[0m | \u001b[1m\u001b[31m0.226\u001b[0m | \u001b[1m\u001b[31m0.232\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m80\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.657\u001b[0m | \u001b[1m\u001b[32m0.628\u001b[0m | \u001b[1m\u001b[31m0.221\u001b[0m | \u001b[1m\u001b[31m0.227\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m90\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.673\u001b[0m | \u001b[1m\u001b[32m0.651\u001b[0m | \u001b[1m\u001b[31m0.215\u001b[0m | \u001b[1m\u001b[31m0.222\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m99\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.694\u001b[0m | \u001b[1m\u001b[32m0.663\u001b[0m | \u001b[1m\u001b[31m0.210\u001b[0m | \u001b[1m\u001b[31m0.216\u001b[0m | \u001b[37m1635012784_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "+-------+----------+----------+----------+-------+--------+-------+-------------------------------------------+\n" ] } ], "source": [ "model.train(epochs=100, init_logs=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We observe that the model was still converging at the end of the training. Interestingly, there is no overfitting at all. *Accuracy* and *cost* (MSE) are even higher and lower, respectively, for the validation set. " ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEWCAYAAABrDZDcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABJuklEQVR4nO3deXxU1fn48c8zSzLZF/YkCMgiSzDI7k7dtQotLmhFRavWtlirXbStX4tbF7Wt9qdVqVrUoqBWK6JiaxGXFkVAhIDgAsi+Zg/ZZub8/jh3JpOQFTJJyDzv12teuffc7dy5k/vce+6554gxBqWUUrHL1dEZUEop1bE0ECilVIzTQKCUUjFOA4FSSsU4DQRKKRXjNBAopVSM00CglFIxTgOBUodJROaIyD0dnQ/VOiLyfRHZLSJlItKto/PTkTQQNEJEZorIchGpEpE59aYlishfRGSfiBSLyHsR024WkY0iUiIiO0TkTyLiiZi+WUQqnB9fmYj8q966bxaRXc7yT4lIfMS0u0VkjYj4RWRWveW+KSIfiEiRs/wTIpISMX1txDbLnHW8FjH9NBFZ6Wx3o4hc38j38pSIGBEZ1ILvMHJfdzknzOSI6XOcdY2PSBskIiZifImIVIpI34i0M0RkcxPbzRWRt5zjc9AbkyKSKSKviEi5iHwtIt9pwb7MEJFAve/w4eaWa2A9S0Tk2nppLfo+D4eITBKRYETet4nICyIyLprbbS0RiReRJ53jUioiq0Tk3Chsxwv8ETjLGJMMjBSRbW29nSOFBoLG7QDuAZ5qYNpsIBMY5vy9OWLaAmC0MSYVyAXygB/VW/4CY0yy8zkrlCgiZwO3AacD/YCjgTsjlvsS+DnwegN5SnPym+XkKxu4PzTRGDMitE0gBdgKvOhs1wu8AjzurGca8EcRyYvcgIicBAxsYNtNucDZ5ijgOOAX9aYXOPluSjnwf63YZg3wAvDdRqY/AlQDvYDLgUdFZEQL1rs04rglG2NmtiJPncGOiOM/EVgPvC8ip3dsturwYH+bp2J/i7cDL4hI/zbeTi/AB6xt4/UemYwx+mnigz1JzYkYHwqUAKktWLYb8Dbwl4i0zcAZjcz/HPCbiPHTgV0NzPd3YFYz254KrGlk2qlAKZDkjPcCDJAYMc/HwGUR4x7gE+BYZ95BLdj/OvsK3Ae8HjE+B3tVtgs41UkbZH+W4XmWAL928jvQSTsD2NyC7ddZl5OWhA0CQyLSngV+18y6ZgAfNDJtDnCPM5wBLAT2AoXOcI4z7V4gAFQCZcDDwHvO91nupE1z5j0fWAUUAf8Djq33vf4UWA0UA/MBXzP5nwRsayD9YWB5vd/3v7EBegNwSb39fAR7IVIKfBRxTAT4E7AH+/+xBsh1psUDDwBbgN3AY0BCK/4HVwMXNjH9VmC7k6cNwOkR230Qe1G3wxmOB4Y437dxvvN3gAog6IyXYS+oZmEvlv7urHuNs+wvnP3cir2jCOXjauAzZ96NwPfq5fEjwOOMfx8bhJo8bu310TuC1hsPfA3c6RQ9rBGRCyNnEJHviEgJsA97R/B4vXXMFZG9IvKvelfdI4BPI8Y/BXodYvnlKTR+tXMV8A9jTDmAMWY38DxwtYi4ReR47B3JBxHL3Ay8Z4xZfQh5QURygHOxdzWRDgC/wZ4kG7Md+Ct1744O1RDAb4z5PCLtU+x33xZcwN+w399R2BPMwwDGmF8B7wMzjXNHYYw5xVkuz0mbLyLHYe9Ev4e9mHgcWBBZTAhcApwDDMAG5xmHmN+XgdEikiQiSdgg8BzQE7gU+IuIDI+Y/1LsccjAHsvQcTsL+5sbgr2SvwTY70z7nZM+Chucs4E7WpI5EenlLNvgb1lEjgFmAuOMMSnA2dhACfAr7J3PKOz/4XjgdufYh453ujHmG9jf5g5Te7e3w5l+AfZCIQN7IfQW9hhnA3dR9397DzaAp2KDwp9EZLQz7X6gCrhdRAZjf/PTjTGVLfkeoq6jI1Fn/3DwHcEvsVcSs4A47NV1GTCsgWUHA3cDvSPSTgQSgETslcUu7I8R4CvgnIh5vc62+tdbb5N3BMCZ2KvRIQ1MS8ResU2ql34B9mrN73yui5jWF/tPn+aMt+aOoAx7hWSA/4T21Zk+x/l+47FXi+fS8B3BtUAP7NXvCA7vjuBk6t1lAdcBS5pZ1wzneymK+EyM3I9GlhsFFNbfn3rz1Pk+gUeBu+vNs4Hau6bN2JNIaNp9wGPN5H8SDd8RDHW2n40tEny/3vTHgV9H7OcTEdPOA9Y7w6cBn2NPvK6IeQR79T0wIu14YFMLjp8Xe0f9eDPHeI/zm/DWm/YVcF7E+Nmh3w3Q39nv0BX6Qd8P9n/83/X+R8oAtzOe4qwjvZG8/RO4KWK8P/ZO6zPgF83tf3t+9I6g9SqwZdD3GGOqjTHvYm8tz6o/ozHmC+yVzF8i0v5rjKkwxhwwxvwWe0I52Zlchr2aCAkNl7Y0cyIyEXtFd5Gpe9UbMhX7Y3w3YpmhwDzgSmxwGwH8XES+6czyIHCXMaa4pfmI8C1jr9QmYU863evPYIypwgbMuxtbiTFmL/bK+q7IdBG5POIB6JstyE/97xhnvCXf8YfGmPSIz4f1ZxBbkeBx52FnCbboJ11E3C1Yf0g/4CfOg/8iESnCBuOsiHl2RQwfAJI5NNnYk1mRs90J9bZ7OdC7ue0aYxZjj88jwB4RmS0iqdgAngisiFjnIicdEXkz4vhdHlqxiLiwV+LV2Ct+GprfGPMl8GPsSXuPiMwTkdD3lIW9ew/5mrrfYUvsjhiuAPYZYwIR44S+AxE5V0Q+FJECZz/PI+L3bozZjD1X9He+p05DA0HrNVQ0clDNlAgemn7AarBXTWCDRmRRUR6w2xiz/6ClGuAUKSwArjHG/KeR2a4CnjHOJYojF/jcGPOWMSZojNmALQcO1dY4HbjfqfkTOhEsbUltmxAnYM7BlhU35G9AOjZQNeZ+4BvAmIj1zjW1t/MtqV3yOeBxbs9D8mi7h4Y/AY4BJhhbYSBU9BM6xk39VkK2AvfWCzqJxpjn2yiPkb4NrDS2mHAr8G697SYbY77fkhUZY/5sjBkDDMcW5/wMWzxaAYyIWGeasQ+tMcacG3H85gKIiABPYp9dXWiMqYnYxkHzG2OeM8achA1kBvi9M/sOJy3kKCetwey3ZB8b4xTb/QP7++5ljEkH3qD2uONcWB2PvTO+v4HVdBgNBI0QEY+I+AA34BYRn9hqoO9hizF+4cxzIvbk9Jaz3LUi0tMZHo4t/vmPM36UiJwoInHO+n6GvWL4r7PZZ4DvishwEUnH1piYE5Enr5MnF/Zk5gtdaYpILvZK60ZjTLhaaL19ynHy+nS9SZ8Ag8VWIRURGYgt6wwFvSHYk+Uo5wP2NvmVFn6dIQ8CZ9avjQRgjPFjHwrf2tjCxpgi4A/YmlONcvbBh727wfme4p11lGPLxe9yysVPBKZgrz7bQgr2xFckIpnYfYq0G1sbrKm0vwI3iMgEZ1+SxFYPTqENOOvMFpFfY4vdfulMWggMEZErnN+aV0TGiciwFqxznJNfL7YoqBIIGmOCzv78KeL/IltsDbnGPIqt+XaBMaaiifkQkWOc3228s83QQ1+wz71uF5EeItId+1zi742sajfQTUTSmtvXRsRhizj3An6xVV4jawR2B57Aft9XAReIyHmHuK2219FlU531g73VNPU+s5xpI4Cl2B/8OuDbEcv9DfujKseW5d6PUzPAWW61M20/NkCMrbfdW5zlS5x1xUdMm9NAnmZEbDey1kMZsLbeun9BvTLgiGmXAPnYIpJt2KsqVyPztuYZwRn10h7FPqgO7c89EdNcTh5MRNoSIsrUsbfhe2jiGQG15b+Rn80R0zOx5bfl2KD+nRbsywxaVmsoy8lzGfbu43vULYs+3kkvBP7spN0A7MQWz1zipJ2DrblV5Ex7EUhp6HvF/lb/3kz+J0X8PsqxV8Yv4TzniJjvGOzd4F7sb3QxMKqR4zUJp1wde9e42ln/PmAukOxM82Efjm7E/q4/A37USD5DV/WhmlWhz+WNzH8ssAz7uy3ABrOsiO3+2fn+djrDof/F0G/EE7Gup5x9LqK21tDfI6bXeTaFvds31NYK+yH2f7cIe2ExL+J38TIRz3FwHk4D3aJx/mrtR5xMKaWUilFaNKSUUjFOA4E6ZM4zj7JGPkd1dP5aS0Qea2RfHuvovLWEiPyykfy3pDaVimFaNKSUUjHO0/wsnUv37t1N//79OzobSil1RFmxYsU+Y0yPhqYdcYGgf//+LF++vKOzoZRSRxQR+bqxafqMQCmlYpwGAqWUinEaCJRSKsZFNRCIyDkiskFEvhSR2xqY/iexPRCtEpHPnYaalFJKtaOoPSx22sB5BNsk8jbgYxFZYIxZF5rHGHNzxPw3YnuwUkop1Y6ieUcwHvjSGLPRGFONbXdjShPzX4ZtJEoppVQ7imYgyMY2axuyzUk7iIj0w/a0tLiR6deL7Uh++d69e9s8o0opFcs6y8PiS4GXTG2HD3UYY2YbY8YaY8b26NHg+xBKKdXlGGPYVVzJfz7bzUNvf0H+9kPpG6p50XyhbDu2V6WQHCetIZdim3BVSqmYFwga5n+8lf+3+At2FttujUWgW3IcudmH2mVC46IZCD7GdnYyABsALgUO6tFKbDeJGdj2/ZVSKqZ9vLmAWQvWsnZHCeP6Z/C9U44mNzuNYX1SSYqPzik7aoHAGOMXkZnYnrvcwFPGmLUichew3BizwJn1UmCe0dbvlFIxbGdxBb99Yz0LPt1BVpqP/3fZcZx/bB9sz53RFdW2howxb2D77YxMu6Pe+Kxo5kEppTqrQNCwaV85b6zZyaNLviJoDD86bRDfnzSIhDh3u+XjiGt0TimljhSBoGHdjhLydxSTv72YrYUVoa4qKa/ys35XKQeqbR2Zc3N788vzhtE3M7Hd86mBQCmlomDpV/u587W1rN9VCkBKvIcBPZJwu2xRT7zHxSVj+5KbncaovmkM6pnSYXnVQKCUUm3kQLWfdTtK+Nt/N/P6mp1kpydw30XHMmFAJn0zEnG5ol/efyg0ECilVD3FB2ooqqhuch5jYEdxBWu31xb9bNxXjjHg87q45cwhXH/K0fi87VfWf6g0ECillKO8ys8j73zJE+9vojoQbPFyfdJ8jMhK5YK8LHKz0jjuqHS6JcdHMadtSwOBUirmGWN4ddUOfvvmZ+wuqeLbx2Vz8uDuzS7XLTme3KzUI+qk3xANBEqpmJa/vZhZC9ay/OtCjs1J4y+Xj2FMv4yOzla70kCglIopobr7a3cU8+7ne3nlk+10S4rjvguP5aIxOZ32gW40aSBQSsWEKn+AJz/YxGNLvqKk0g/YKpzfPXEAPzpjMKk+b8dmsKIQ1rwEG94AfyMPqo//IQw9r803rYFAKdUlVNYE2FZYARzcWs2Xe8r47Zvr+Xr/Ac4Y1pNzcvswIiuVQT2T8bo7sBFmY2DzB7DyGfhsAfgrocdQSGz++URb0kCglDrilFbW8NnOUvK3F7N2RwlrdxTzxZ4yAsHGmywb1DOZZ64ZzylDOkFT9lWlsOyv8MmzULAR4lNh1OUw+krIGtXu2dFAoJTqVIoOVPPKJ9t5Yfk2Nu4ta3CeKn9t1c7uyfGMzE7lzOG9GNgjOfzmbqQEr5tTj+nRsVf/IXvWw/zpsP8L6HcinHorDJsMce3ftESIBgKlVIcLBg1LN+5n/sdbWbR2F9X+IHk5aVx1Qn8aanwzJd7DiKw0RmSl0jPV1/4ZPlT5L8OrM+1J/6rXYMApHZ0jQAOBUqoDVdYEeGbpZp798Gu2FlSQluDlO+OP4pKxfRmeldrR2aurYBO8fB3sym9+3pTeMOo7trgnqQd8/qZ9DvDl29B3Alw8B1Kzop7lltJAoJRqd8YY/rVuN/e8vo6tBRUcf3Q3fnrWMZw9onfnbJJhwyJ45Xo7PO67IM0UMe38FN65F5b81pb/VxZBShZ841dw4o/BExftHLeKBgKlVNRF1t1fu6OEZZsKWLW1iCG9kpl77QROHNS+tWRarHgbfPgoLH0Yeo+ES56FzAEtW7ZgE6yaC0VbIfdCGHQ6uDphkEMDgVIqSvK3F/PPT7azamsR63aWhNvdj/O4GNo7hVkXDGf6xH542vMBbkURfLXYVtNsir8S1r8OX/4HMHDcFXDe/eBNaPm2MgfAabcfTm7bjQYCpVSbqPIH+GJ3GR9vLuClFdtYu6OEOI+LY7PTwmX+I7PT2r/uvjGwZSmseBrWvQr+ipYtl5oNp/wMjrscMvpHNYsdTQOBUuqQ7S2t4uWV21i4eifrd5VQE7D1+If3SeWuKSOYkpdNWmIHvrFbUwELb4FPn3Pq6l8GeZdBcs9mFhRIy+m0RTltTQOBUjHqzTU7WbujhGF9UsnNTiUxzhMuw99e1PxV856SSpZs2Is/aBh9VDrXnnw0uVlp5Gan0q9bUjvsQTMKNsELV8CuNXDKz+Gkmzu0rn5npoFAqRhT5Q9w12vrmPvRlkbn6ZYUhzRUgT9CQpyL7540gIvH9mVQz+S2zubhiazl850XYchZHZufTk4DgVIxZGvBAWY+t5JPtxXzvVOP5qbTB/PVnnLydxRzoDrA8D6pDM9KJS2hgxtgO1TBgK2y+d79ra/lE8M0ECjVxfkDQd79fC/zPt7K4vV7SPC6eWz6aM7J7QPAyJw0RuakdUzmAn7YtARKdrbN+ta+bGsFjZoO33ygdbV8YpgGAqWOQKEaOp/tLKEyot2dvhkJ5Gan0T05nq/3l/PC8q28tGIbu0uq6J4cx7UnD2D6hH70zYxSWbkxthG1mgNNz+evts0tr5oLpW0UBADccXDBQzD6Khpsm0I1SAOBUp3cgWo/n+0stQ9ynY7SP99dGq6h05DuyXHsK6vGJTDpmJ7cObkvpw/rGb1qm+X7YfV825rmnnUtW0ZcMOgMWz+/Tx7QBiduXyr4Ouju5gimgUCpTih/ezFPfbCJ1duL2bi3jFDryplJcYzISuW7Jx3NyOw0hmelkhxv/42Dxr69m7+9mM92ljKgeyIXjelL77QoNcoWDMKmd20bOusXQqAaskbDeQ/YtnaaJJB1HKRlRydvqlU0ECjViewvq+KBf33OvI+3kBLvYfyATL450naiMjInjd6pviZr8/RK9THx6G7Rz+j2FfDi1VD0NSRkwNhr7Nu3vXOjv23V5jQQKNUJfLW3jBc+3srzy7ZQXh1gxgn9+fHpQzr2ZazGFG2B5y4Fjw8ufBKGng/eI6gpaHUQDQRKtaPSyhpe+3QnK74uxDhdKm7Zf4DlXxfidglnDOvJT886hsG9Ujo4p42oLIa5l4C/CmYshB7HdHSOVBvQQKDUIfIHgmx0WtT0uFzkZqfRz6mNs6XgAPk7itlbWhWef+2OEl5fvZOKmgA9U+KJ89gHtyk+L7edO5Spo7PpmdKJr6z91fDiDNuz1vSXNQh0IRoIlGqBogPV/Oyl1WzeVw7YB7PbiyqorAnWmS853oMApVX+g9aRFOfmW8dlMW3cUeTlpDX75m6nse9L+OQZWPU8lO+ByQ/D0ad2dK5UG4pqIBCRc4CHADfwhDHmdw3McwkwCzDAp8aY70QzT0q11v6yKqY/uYyv9pRx2tCeuJwamKcO6cnInFRGZKVR7Q+yboet2hk0xmlzJ43s9IRwdfaEODfxniOoEbOaSlh0K6yYA+KGIefAuGtslU/VpUQtEIiIG3gEOBPYBnwsIguMMesi5hkM/AI40RhTKCLNNQmoVLvaU1rJ9Cc+4uv9B3jiqrGcMqRHo/PmZqdxCX3bMXdRVLQF5l8BO1fB8TPhhBtbUCVUHamieUcwHvjSGLMRQETmAVOAyLdNrgMeMcYUAhhj9kQxPyrG7SurYuPecoLGPqStrAmwflcpa3eU8PmuUmqCwYOWKSivpqomyN+uHscJAztpL1qHq6IQ1rwEu1bbcWNspyxBP1z6HAz9ZsfmT0VdNANBNrA1YnwbMKHePEMAROS/2OKjWcaYRVHMk+rijDG8tXYXi/J3hV/CKqvys25HCbtKGu6VKjs9gWF9UhrsK9fjEq48oT+jj8qIZrbb3tf/a/4NX2Ng6zL4bIHtkSupB7icU0KPY2DKI9BtYPTzqjpcRz8s9gCDgUlADvCeiIw0xhRFziQi1wPXAxx11FHtnEV1pNiwq5Q7X1vL/77aT/fkeFJ89ucd73Fx/MBujMhKZXCvFLxuW2jvdbsY1COZjKTO1ZH4YVv/Osy7HGi8CYqw+DQ4brp9GSxrVLRzpjqpaAaC7VCnwDTHSYu0DfjIGFMDbBKRz7GB4ePImYwxs4HZAGPHjm3Br1t1BVX+AP9au5sXlm9la0HTjZgZYFthBcnxHu6aMoLvjD+qffvC7Sx2fAL/uNY23zDt7+Bu5oU0Xxp44tsnb6rTimYg+BgYLCIDsAHgUqB+jaB/ApcBfxOR7tiioo1RzJPqxCprAmzYVUr+jmJWby3mrXW7KDpQQ3Z6AmP6ZTTbmOR5I/tw/clHd70r/JYq3mbf+E3sBpfNg5ReHZ0jdYSIWiAwxvhFZCbwFrb8/yljzFoRuQtYboxZ4Ew7S0TWAQHgZ8aY/dHKk+q8ln61nxuf/4R9ZfYFrLQELycN7s6l4/py4sDuuFxHSJ379lJRBGtehPyXoarEppXusg2/XfGWBgHVKmLMkVXSMnbsWLN8+fKOzoZqI8YYHn9vI/ctWs+A7kn85KxjGJmdRk5GwpHzwlV7qqmEN35qg4C/EnrlQkZ/O01cMPH70O+EDs2i6pxEZIUxZmxD0zr6YbGKEWVVfmqcDlT8QcOXe8pYu6OYJRv28sGX+/jmyD78/qJjw00qq0a8+3vb5v+Yq2HMDH3Aq9qE/tepqCgsr+a5ZVtYva2I/O0lbC+qaHC+3qk+/u/84VxzYn+9A2jOrjXw34dsN4wXPNjRuVFdiAYC1ab8gSDPLdvCH/71OcUVNRzdPYnR/TL4zoSjSIqz9fRFhH7dEhmRlUaPFK2x0iIBPyy40T4IPuvujs6N6mI0EKhDFmpS+f0v9hJw3t76am8ZX+0t54SB3fj1BSM4pncnbU75SPPRo7Zq6MVzIDGzo3OjuhgNBKrVvtxTyuPvbmSh06RyTkZCuGw/LcHLo5eP5pzc3lrU0xaKt8Oq5+D9P8Ax58Hwb3V0jlQXpIFA1bG7pJJ1O0rC48k+D0N7p5Di81JcUcNDb3/BM0s3E+9xHZlNKh8JAjXw+SLbF/CXb4MJwtGT4Pw/0ezLFEodAg0ECrAvcz327lc89u5XB7WxDzCgexLFFTUUHqjm0nFH8dOzhtAtWcv329SBAvjvg/YOoHwvpPSBk26xTUBkDujo3KkuTAPBEcYYw87iSvK3F/PFnjJqAgeftF0ijB+QyYQBmU1eqR+o9vPZzlI+3VrEkx9sYntRBd8c2YcZJ/bH6zTPUFBexdrtoXb24abTB5ObnRa1/YtZ21fCC1dCyQ445lwYfSUMPB3c+i+qok9/ZZ1cWZWfdzfsZc32YtbuKGbtjhIKyqtbtOyA7klcPDaHIT3tA9ugMWwpOMDaHSXkby/mq71l4RY6h/ZO4fnrJnL8wG4Hree0ofqWatQYAyufhjd+Bsm94Nq3IXt0R+dKxRgNBFHgDwR57N2v+Hr/AXKz08jNtr1YNdTMceQy+8pqT/BbCw/wwsdbeX3NTg5UB/C6hWN6p3DmsF7kZqcyPCuNYX1SSGhgnRU1Ad5cs4v5y7dy36INB03vneojNzuVc0f2ITcrldzsNPqk+bScvyN89Bgsug0GngZTn4CkgwOxUtGmTUy0sT2llcx87hOWbSogLcE+YAVIifdwwagsLh3Xl2N6p/DF7jLytxeTv6OY/O0lfLazhCp/3WKepDg3F+RlcdGYHI7NSQ93dt4a2woPUFheEx7vnebTuvudRcEm+Mvxtv/fS58D1xHUjaU64mgTE+1k2aYCZj63kpLKGh6cNoopo7LYVVLJmm3FLFq7i5dXbuO5j7bgEsJFMinxHoZnpTJ9Yj8GdE/C7TSulhzv4bShPUk6zCYXcjISyTnC+lSJCcbAwh/bjmC++UcNAqpDaSBopYLyav78ny/okRLPRWNy6JXqY09pJfct2sBLK7bRv1siz3x3PEN7pwLQJy2BPmkJnDWiN7Mmj+C1T3ewo6iC4X1skVHfjERtWTMWrXoONi6xQSAtu6Nzo2KcFg21wqdbi/jB3JXsLqnEHzS4BE4c1J1PthRR7Q9yzUkDmHnaIG04TTWtZCf8ZSL0HAYz3gBXDHago9qdFg21geeXbeHXr66lR0o8r/zgRFJ8Hl5YvpWFq3cy8ehu/OqbwxjQPamjs6k6QjAI1WXNz7drNax8Ftb90xYNXfBnDQKqU9A7gnoOVPtJjKsbH59ftoVfvLyGU4b04KFpo2K3Byx1sF358OJVsP/Lls0fnwojL4Jx10KvEdHNm1IR9I6ghZ78YBP3vL6Oq47vzy/PG0acx8X7X+zl9n/mc+qQHjx51djY7AdXNezTefDajyEhHc640z74bUpKb9teUFxie+ROqRbTQOD4y5IvuW/RBob0SmbO/zazZnsxPz5jMD/4+0oG90zm4e8cp0EgVhkD21fYE/+BfTatshi+Wgz9ToKLntKuIdURLeYDgTGGh/7zBQ++/QVTRmXxh4vzeDN/F7f+YzVXPLmMHinxPDljHCk+b0dnVbW38v2wer7tEWzPOvAmQlpO7fSTboFv/EqbgVBHvJj+BVfWBPj1q2uZv3wrF43J4fcXHovbJVyQl8UxvVN46O0v+P6kgWSnJ3R0VlV7CQZh0xLb8uf6121n8Nlj4IKHYMRU8KV2dA6VanMxGwi2Fhzg+3NXkL+9hJnfGMQtZw6pU59/SK8UHrlc23zp0qrL7YkeoKLIdgj/ybNQtAUSMmDsNXDcFdA7t0OzqVS0xUwgWPDpDp776Ovw+LodJRjgiSvHcsZwLd+NKcGg7QT+vftsW/+RBpwKp/8ahp4PXl/H5E+pdhYzgcAYE27WAeD4gd345XnD6NdN6/7HlAMF8PJ1tsOX3AshZ5xNd3lg0Bna7r+KSTETCKaMymbKKH2Vv8s7UACrX4At/7O1ferb8QmU7ba9fY25Wnv8UooYCgSqCwsGYfN79q3dz16DQBVk9AdPAw/5U7Pg4qchZ0y7Z/NIUFNTw7Zt26isrOzorKhD5PP5yMnJwetteU1HDQTqyFWyAz6Z6zzg/Rp86TBmBoy+AnqP7OjcHZG2bdtGSkoK/fv31/4pjkDGGPbv38+2bdsYMKDlxZwaCJpiTHSLDoyBYEDroTcnGLC1egAwsOVDp2P3f9uHvQNOgdPv0Ae8baCyslKDwBFMROjWrRt79+5t1XJ6BqrPXw2fL7Inmk3v2ivMs+4FTxu2L1SyA1bNtUUZ5Xth+LdsH7VHTdQy6/p25du+fAu+qpse7tj9csg8umPy1kVpEDiyHcrx00AQsvdz+OQZWPW8bUYgJQsGnwXLZsOOVXDJ07Z8+XC9fSf890F7Jdv/ZBhwMqz9J3z6HPTJg+mvxEZ3hWV74dPnYe0r9kQ++kr7fUS2xvnpfHjtJtuWz9m/AZdT5pk5AI7+ht5JxYBZs2aRnJzMT3/6U+bMmcNZZ51FVlbr/g8fe+wxEhMTufLKK6OUyyOf/icVb4d/XGtrmbg8MOQce1IadIbtNSr/ZXh1Jjx+Cpx6q205MuEQu/z6aDZ88Ec4dhpMuq32Svac30P+S/DGz2H+5XDlq+BppjvJgk22LnxVqR0XFwz8BuRedPDbr6G2clY9Z2vMHKrETJv3fic2fedSUwnrF8KGN8BfdfD06jLY/AEE/ZB1nC3iyX/JPuDt5by8VVUCm96zbflc/DdI7nno+VZdwpw5c8jNzW0wEAQCAdzuhnt5u+GGG6KdtUPm9/vxeDr+NKzNUL9yg70q/cYvIe+yhk84ezfY+XasBI8Phk22QaH7oJZv5/O34PlLbaCZ9veGuybM/we8dA2MvBim/rXxk+3nb9m68MEgZPSzaVWl9oGpJwGGT4FuA226v8qekENt5RxOMUrRFnuCzhwIwyfb9dVXttvuR0UhJPeGpO4HzyNiX9wafSX0OAZqKmxtn0+fh7I9tfMNOQcm/UKv/NvRZ599xrBhwzo0D/feey9PP/00PXv2pG/fvowZM4b+/fszY8YMsrOzSUhIYOnSpQwbNoxp06bx73//m5///OeUlpYye/ZsqqurGTRoEM8++yyJiYl17iomTZrEhAkTeOeddygqKuLJJ5/k5JNPrrP9srIypkyZQmFhITU1Ndxzzz1MmTIFgGeeeYYHHngAEeHYY4/l2WefZffu3dxwww1s3LgRgEcffZSsrCzOP/988vPzAXjggQcoKytj1qxZTJo0iVGjRvHBBx9w2WWXMWTIEO655x6qq6vp1q0bc+fOpVevXpSVlXHjjTeyfPlyRIRf//rXFBcXs3r1ah588EEA/vrXv7Ju3Tr+9Kc/1dmHho6jNkPdmL2f20bFJv4ATryp8fl6HAPXv2OLiFY+Y+upb3gTvvUXe0IM2ZVvy//rqyqxRRy9cu0JvrH+aXMvhIKNsPgeSOphiz/q27LU3lX0HgmXPFv7ApQxNlCtfAbW/AOqS2uXyRoN5z9o1384beVUH4B1r9paOh/8qeF53HH2oe3oK2DApJZ1vOJNgGMvsR/Vadz52lrW7Shp03UOz0rl1xc03g/DihUrmDdvHqtWrcLv9zN69GjGjBnDRRddxMMPP8wDDzzA2LG157Ju3bqxcuVKAPbv3891110HwO23386TTz7JjTfeeNA2/H4/y5Yt44033uDOO+/k7bffrjPd5/PxyiuvkJqayr59+5g4cSKTJ09m3bp13HPPPfzvf/+je/fuFBQUAPCjH/2IU089lVdeeYVAIEBZWRmFhYVNfg/V1dWELmgLCwv58MMPERGeeOIJ7rvvPv7whz9w9913k5aWxpo1a8Lzeb1e7r33Xu6//368Xi9/+9vfePzxx5v72psV1UAgIucADwFu4AljzO/qTZ8B3A9sd5IeNsY8Ec081bHkt/YK+qSbWzZ/1ij7OfkW+wDzhSvghB9B+lH2BLxrdePLpmbDd+ZDfHLT2zj5p7bY58O/2E9DRk2Hbz5gT6AhIrZxtOwx9qQf2XRCW3WMHpcIoy6zn2CgkZlEe91Sh+z999/n29/+NomJ9m5z8uTJTc4/bdq08HB+fj633347RUVFlJWVcfbZZze4zNSpUwEYM2YMmzdvPmi6MYZf/vKXvPfee7hcLrZv387u3btZvHgxF198Md2727vczMxMABYvXswzzzwDgNvtJi0trdlAEJnvbdu2MW3aNHbu3El1dXW42ufbb7/NvHnzwvNlZNgi6dNOO42FCxcybNgwampqGDny8KtKRy0QiIgbeAQ4E9gGfCwiC4wx6+rNOt8YMzNa+WjUrnxY+zKc/JOGiy+akpYDV78Ji34B//uzTet9LJz3gC3zpoEine6DwJfW/LpFYMojMOEGCNQcPD0uyd6hNFVGLwLSRif/xrRVcFGdVlNX7p1FUlJtEzEzZszgn//8J3l5ecyZM4clS5Y0uEx8vH3+5na78fv9B02fO3cue/fuZcWKFXi9Xvr379/qF+w8Hg/BYO3FWP3lI/N94403cssttzB58mSWLFnCrFmzmlz3tddey29+8xuGDh3K1Vdf3ap8NSaal27jgS+NMRuNMdXAPGBKFLfXOkt+a7sNPP4QY5AnHs7/I1y9CK5/F254H8ZfBzlj7Vur9T8tCQIhItDn2IbX03OoVjFVXdYpp5zCP//5TyoqKigtLeW1114LT0tJSaG0tLTRZUtLS+nTpw81NTXMnTv3kPNQXFxMz5498Xq9vPPOO3z9tW2s8rTTTuPFF19k//79AOGiodNPP51HH30UsA+ti4uL6dWrF3v27GH//v1UVVWxcOHCJreXnW2bv3n66afD6WeeeSaPPPJIeDx0lzFhwgS2bt3Kc889x2WXXXbI+xkpmoEgG9gaMb7NSavvQhFZLSIviUjfhlYkIteLyHIRWd7aFyXC1i2A56bZz98vsrVajp9pa8Icjn7H2+IipdRhGz16NNOmTSMvL49zzz2XcePGhafNmDGDG264gVGjRlFRUXHQsnfffTcTJkzgxBNPZOjQoYech8svv5zly5czcuRInnnmmfC6RowYwa9+9StOPfVU8vLyuOWWWwB46KGHeOeddxg5ciRjxoxh3bp1eL1e7rjjDsaPH8+ZZ57ZZH5mzZrFxRdfzJgxY8LFTmCfcxQWFpKbm0teXh7vvPNOeNoll1zCiSeeGC4uOlxRqzUkIhcB5xhjrnXGrwAmRBYDiUg3oMwYUyUi3wOmGWNOa2q9h1xraNXz8NGjteOJ3WybM9rRiFJhnaHWkGre+eefz80338zpp5/e4PTOVGtoOxB5hZ9D7UNhAIwx+yNGnwDui1puQg85lVLqCFVUVMT48ePJy8trNAgcimgGgo+BwSIyABsALgW+EzmDiPQxxux0RicDn0UxP0opdURLT0/n888/b/P1Ri0QGGP8IjITeAtbffQpY8xaEbkLWG6MWQD8SEQmA36gAJgRrfwopZRqWFTfIzDGvAG8US/tjojhXwC/iGYelFJKNU3f/FFKqRingUAppWKcBgKlVKc1a9YsHnjggUNadsaMGbz00kttnKOuqcWBQEQaaGpSKaVUQxpqvqKzajYQiMgJIrIOWO+M54lII62hKaXU4bn33nsZMmQIJ510Ehs2bABg/fr1jB8/PjzP5s2bw42t3XXXXYwbN47c3Fyuv/56mntJ9q9//Svjxo0jLy+PCy+8kAMHDgCwe/duvv3tb5OXl0deXh7/+9//ANv09LHHHkteXh5XXHEFcPDdRnKybUxyyZIlnHzyyUyePJnhw4cD8K1vfYsxY8YwYsQIZs+eHV5m0aJFjB49OvxOQDAYZPDgweFuJoPBIIMGDWp1t5OHoiW1hv4EnA0sADDGfCoip0Q1V0qpjvfmbbBrTduus/dIOPd3jU5urBnqoUOHUl1dzaZNmxgwYADz588Pt+A5c+ZM7rjDVka84oorWLhwIRdccEGj25g6dWqDzVU31Jz02rVrG2x6uikrV64kPz8/3IroU089RWZmJhUVFYwbN44LL7yQYDDIddddx3vvvceAAQMoKCjA5XIxffp05s6dy49//GPefvtt8vLy6NGjR4u/3kPVoqIhY8zWekmNtUGslFKHLLIZ6tTU1DrNUF9yySXMnz8foE4geOedd5gwYQIjR45k8eLFrF27tslt5Ofnc/LJJzNy5Ejmzp0bnn/x4sV8//vfB2qbk26s6emmjB8/PhwEAP785z+Tl5fHxIkT2bp1K1988QUffvghp5xySni+0HqvueaacJPWTz31VJu1LtqcltwRbBWREwAjIl7gJvQNYKW6viau3DvCtGnTuPjii5k6dSoiwuDBg6msrOQHP/gBy5cvp2/fvsyaNavZJqNb2lx1UyKbmQ4Gg1RXV4enRTYxvWTJEt5++22WLl1KYmIikyZNajJ/ffv2pVevXixevJhly5YdViuqrdGSO4IbgB9iWw7dDoxyxpVSqk011Qz1wIEDcbvd3H333eG7gdBJtXv37pSVlbWollBjzVU31Jx0Y01P9+/fnxUrVgCwYMECamoa6DsE28R0RkYGiYmJrF+/ng8//BCAiRMn8t5777Fp06Y66wXb38D06dO5+OKLG+2Hua01GwiMMfuMMZcbY3oZY3oaY6bXayxOKaXaRFPNUIO9K/j73//OJZfYbk3T09O57rrryM3N5eyzzz5o/oY01lx1Q81JN9b09HXXXce7775LXl4eS5curXMXEOmcc87B7/czbNgwbrvtNiZOnAhAjx49mD17NlOnTiUvL69Oj2WTJ0+mrKys3YqFoAXNUIvI34CDZjLGXBOtTDWlzTuvV0qFaTPUHW/58uXcfPPNvP/++4e8jmg0Qx3ZtY4P+DbQQA/tSimlDsfvfvc7Hn300XZ7NhDSbCAwxvwjclxEngc+iFqOlFIqRt12223cdttt7b7dQ2liYjDQs60zopRSqmM0e0cgIqXYZwTi/N0F3BrlfCmllGonLSkaSmmPjCillOoYjQYCERnd1ILGmJVtnx2llFLtralnBH9o4nNo7cIqpVQrRDZDPWfOHHbsaH2FxcceeyzcbENLbN68GRHh9ttvD6ft27cPr9fLzJkzAdiwYQOTJk1i1KhRDBs2jOuvvx6wbxKnpaUxatSo8Oftt99udZ7bW6N3BMaYb7RnRpRSqilz5swhNzeXrKysg6YFAoFG38K94YYbWr2tAQMG8Prrr3PPPfcA8OKLLzJixIjw9B/96EfcfPPNTJkyBYA1a2ob5zv55JNZuHAhR5IW1RoSkVwRuURErgx9op0xpVRsaqgZ6pdeeonly5dz+eWXM2rUKCoqKujfvz+33noro0eP5sUXX2y0eenIu4pJkyZx6623Mn78eIYMGdLoS1uJiYkMGzaM0Mur8+fPD7/NDLBz505ycnLC46EmsY9ULak19GtgEjAc2xH9udj3CFp+r6WUOuL8ftnvWV+wvk3XOTRzKLeOb7zSYWPNUF900UU8/PDDPPDAA4wdW/tybLdu3Vi50j6u3L9/f4PNS9fn9/tZtmwZb7zxBnfeeWejRTeXXnop8+bNo1evXrjdbrKyssJFUzfffDOnnXYaJ5xwAmeddRZXX3016enpgG1BddSoUeH1/OMf/2DgwIGt+p7aW0veLL4IyAM+McZcLSK9gL9HN1tKqVgU2Qw1UKcZ6oZEttGTn5/P7bffTlFREWVlZZx99tkNLjN16lQAxowZw+bNmxtd9znnnMP//d//0atXrzrbAbj66qs5++yzWbRoEa+++iqPP/44n376KXBkFg21JBBUGmOCIuIXkVRgD9A3yvlSSnWwpq7cO4vIxt5a2rx0fHw8YPscaKo7ybi4OMaMGcMf/vAH1q1bx4IFC+pMz8rK4pprruGaa64hNzeX/Pz8w9+hDtLoMwIReURETgKWiUg68FdgBbASWNo+2VNKxZKmmqFOSUmhtLS00WUba176cPzkJz/h97///UEd0ixatCjc9PSuXbvYv38/2dnZbbLNjtDUHcHnwP1AFlAOPA+cCaQaY1a3Q96UUjEmshnqnj171mlWesaMGdxwww0kJCSwdOnB16Kh5qV79OjBhAkTmgwaLTVixIg6tYVC/vWvf3HTTTfh8/kAuP/+++nduzfr168/6BnB7bffzkUXXXTYeYmmljRD3Q+41PkkYAPCc8aYL6KfvYNpM9RKRY82Q901tLYZ6pZ0TPO1Meb3xpjjgMuAbwFtW5VAKaVUh2k2EIiIR0QuEJG5wJvABmBq1HOmlFKqXTTV1tCZ2DuA84BlwDzgemNMeTvlTSmlVDto6mHxL4DngJ8YYwrbKT9KKaXaWVNtDZ3WnhlRSinVMQ6lhzKllFJdSFQDgYicIyIbRORLEWm0I04RuVBEjIg0WLVJKRWbIhuMa60ZM2bw0ksvNZiemJhY5z2DH//4x4gI+/btA2zDdyNGjODYY49l1KhRfPTRR4BttO6YY44JNzHd2d8PaKmWNDFxSETEDTyCfQltG/CxiCwwxqyrN18KcBPwUbTyopRSkQYNGsSrr77K9OnTCQaDLF68OPxm8NKlS1m4cCErV64kPj6effv2UV1dHV527ty5dRq+6wqieUcwHvjSGLPRGFONrXU0pYH57gZ+D1RGMS9KqSNEQ81Qr1+/nvHjx4fn2bx5c7jp57vuuotx48aRm5vL9ddfT3MvyYJtWXT+/PmA7UzmxBNPxOOx18U7d+6ke/fu4TaJunfv3mAfCF1J1O4IgGxga8T4NmBC5AxOd5h9jTGvi8jPGluRiFwPXA9w1FFHRSGrSqn6dv3mN1R91rbvjsYPG0rvX/6y0emNNUM9dOhQqqur2bRpEwMGDGD+/PnhFkFnzpzJHXfcAcAVV1zBwoULueCCC5rMx5AhQ1iwYAGFhYU8//zzTJ8+nTfffBOAs846i7vuuoshQ4ZwxhlnMG3aNE499dTwspdffjkJCQkAnHnmmdx///2H9Z10Bh32sFhEXMAfgZ80N68xZrYxZqwxZmyPHj2inzmlVIeIbIY6NTW1TjPUl1xySfgqPjIQvPPOO0yYMIGRI0eyePFi1q5d26JtTZ06lXnz5vHRRx9x8sknh9OTk5NZsWIFs2fPpkePHkybNo05c+aEp8+dO5dVq1axatWqLhEEILp3BNup21x1jpMWkgLkAktEBKA3sEBEJhtjtDEhpTpYU1fuHWHatGlcfPHFTJ06FRFh8ODBVFZW8oMf/IDly5fTt29fZs2aRWVly0qZp02bxpgxY7jqqqtwuepeE7vdbiZNmsSkSZMYOXIkTz/9NDNmzIjCXnUO0bwj+BgYLCIDRCQO22hduEFvY0yxMaa7Maa/MaY/8CGgQUCpGNZUM9QDBw7E7XZz9913h+8GQif97t27U1ZW1mAtocb069ePe++9lx/84Ad10jds2MAXX9S2qblq1Sr69et3OLvV6UXtjsAY4xeRmcBbgBt4yhizVkTuApYbYxY0vQalVKxpqhlqsFfxP/vZz9i0aRMA6enpXHfddeTm5tK7d++D5m/O9773vYPSysrKuPHGGykqKsLj8TBo0CBmz54dnh75jKB79+6NdnV5JGm2GerORpuhVip6tBnqrqHNm6FWSinVtWkgUEqpGKeBQCmlYpwGAqVUHUfac0NV16EcPw0ESqkwn8/H/v37NRgcoYwx7N+/H5/P16rlovlCmVLqCJOTk8O2bdvYu3dvR2dFHSKfz0dOTk6rltFAoJQK83q9DBgwoKOzodqZFg0ppVSM00CglFIxTgOBUkrFOA0ESikV4zQQKKVUjNNAoJRSMU4DgVJKxTgNBEopFeM0ECilVIzTQKCUUjFOA4FSSsU4DQRKKRXjNBAopVSM00CglFIxTgOBUkrFOA0ESikV4zQQKKVUjNNAoJRSMU4DgVJKxTgNBEopFeM0ECilVIzTQKCUUjFOA4FSSsU4DQRKKRXjNBAopVSMi2ogEJFzRGSDiHwpIrc1MP0GEVkjIqtE5AMRGR7N/CillDpY1AKBiLiBR4BzgeHAZQ2c6J8zxow0xowC7gP+GK38KKWUalg07wjGA18aYzYaY6qBecCUyBmMMSURo0mAiWJ+lFJKNcATxXVnA1sjxrcBE+rPJCI/BG4B4oDTGlqRiFwPXA9w1FFHtXlGlVIqlnX4w2JjzCPGmIHArcDtjcwz2xgz1hgztkePHu2bQaWU6uKiGQi2A30jxnOctMbMA74VxfwopZRqQDQDwcfAYBEZICJxwKXAgsgZRGRwxOg3gS+imB+llFINiNozAmOMX0RmAm8BbuApY8xaEbkLWG6MWQDMFJEzgBqgELgqWvlRSinVsGg+LMYY8wbwRr20OyKGb4rm9pVSSjWvwx8WK6WU6lgaCJRSKsZpIFBKqRingUAppWKcBgKllIpxGgiUUirGaSBQSqkYp4FAKaVinAYCpZSKcRoIlFIqxmkgUEqpGKeBQCmlYpwGAqWUinFRbX20Myn/8EPK3lmC+Hy4fPFIvA/xepG4OPvX60W8HsTjAY8H8XgRjwfxuMHtdsadYeeDx2P/ut12XncD010aa5VSnVvMBIIvlv8H9/z5uKv9SNC078YbCxL1A4bHjbg9B0/3euqmh9YXmt/jQbweCA2HxkMBze2OGPcg3rjwPOJ1Ap7Xa6d7vXZ6KDAeFCydj9vdvt+hUipqYiYQfPqNHB5Mc+MPGlxBQ1wNeAPgifwEwR0AdzA0bHAHweWMu4wzHKgddjvpbmfZ0LDHuPDiwhN04cGFNyh4cOEJCh5jcJsAHhPEE/TjMdW4jdh1hP4GwF0juIO1eXAFDa6AzX9oWALBep8A+AOIPxDdL9Ttrg0KcXG1wSLOjru8cbXp8fHOsBdXfLwNNKG0+DibFhdfOxw57vMhcfHOXZy9k3P54hGfzy4vEt39VCoGiDHtfHV8mMaOHWuWL19+yMsHTZDqQDVVgSr8QT81wRr8QX+d4YAJhMdDw/6gn0AwQI2pCQ+H0v3GXzvsjNcEaupMC627qb81gZrweHWgOpxeHaymJmD/tpgxNig5Ac4VrA10ngDEGzc+vCQYLz48+MJ/7SfeuIk3HuIDLuKMi3jjJi4geIMu4oKCNyA2kAYFj9/g9RsbOP1B3H6Dyx9AagLOXz9U10B1Daa6GlNVRbCmBlNZCcHgIR9LwAYHn88GkAQfrnjfQX9dCT7El2CDSoIPly+hNi3BhyQk2LTEBLuuhERcCT5cCQlIYqINcBpw1BFORFYYY8Y2NC1m7ghCXOLC5/Hh8/g6OiutZowJB5maYA3Vgerw38hgURWostOc8VDgC80XHnbSI8cLnfFQWmWgwv71V4bTa4I1h5R/j3jweXzEu334POkkeBJIEh9JxJEUjCPJeEl0PkkBD76gm4SAG1/AhS/gIt4vxAWEuBqD1w/emiCeGoO7OoC7JoBUVROsqsRUVBKsrCS4bz81ofGqKkxFBcGKitYHH7cbV0ICrsTEcHAIDYfTkxJtQElMxJWY5KQ5f53pddKSkrR4TXUaMRcIjmQigle8eF3eDs1HIBgIB4WqQFU4SFT4K8JpFf6KOumRw6H5Kv2V4fGiQImdL1AZTq8MVNZu1AXEOcMJDefLIx4SvAkkeBJI9CSS6E0k0dODRG9ibZoTfJIDXpL9HhKDHpICHhL8gs/vIr7aEF+DDTbVAaSy2gaSigM2kByoIHjgAMEDBwiUlODfvYtAeTnmgA0ypqqqxd+j+Hy1wSH8ScSdnOwEjCRcoeGkJFzJSXZa6JOUjDvZziMe/VdWh05/ParV3C43iS57oo2moAnWCRYNfQ7UHKgd9h8Ip0UO7z2wNzw9NC1oWnBXIOBJ9JCYlkiSN4kkbxKJ3kSSPEkkx2WS6KlNT/ImkexNJsntI9nvJdnvJrHGRUK14KsxxFeDu6IqHESC5eUEy0N/az+B/QXUbNlam3bgQIu+K/H5cCUn405KwpWS4gSLJNzJKc54aDgZd0oKruQU3CnJdlpKCu6UFPvcRYvAYpIGAtVpucRlr+rbOOAYY6gKVFFeU14nOByoOUB5TXmd9Mjx0HB5TTl7Duyh3F9OeXU55f7yFgUWj8tjg0VKEindUmqDhzeJlLgskr3JJMcl1/3rTiQ54CWpWkioBl+lgVAAKSsjWFZKoLycYFlovIxAWSnB0jJq9u+nsqyMYGkpwfJyaO55oMdjg0Rqig0akX9TUsN/3akpuFJTcaem2iDiDEtCggaSI5QGAhVzRCT8nKgb3Q57fcaY8B1HWXVZOECU1ZRRVlMWDh6l1aXh4dB8ew7sCaeX1pTiD/qb3V6iJ5HkuGRSvCmk9EghOTuZlLgUUuNSSfb2JSUupc4n2ZtMiieZZL+HpCrwHKgmWG4DRKCk1AaT0jKCpSUESm0QCZSWECwto3rfPgLFJQTKyjDN3Z14PDYopKTgSkvDnZKCOy3VCRppNoCkpdnhNBs83GlpuNLS7DMTDSIdRgOBUodJRMJ3Lt0Tuh/yekJ3KqHgUVZdRmlNqf1bXUpZjf0bGg5NL6wsZEvJFjutBcHE6/KGA0dqXCop3VNIybLjKXHppMTZYJIab6enxaXZICMJJFYZpPwAgZJSAiXFTjApIVhSUpsWHi6hZts2AqWlBIqLIdBElWa3OyIw2L/utHTnr/NJrx12pabhzki3dyL60P2waSBQqpOIvFM51IBijKEyUGmDhRMoSqpKwkGkpLokHExC4yXVJWwv226Hq0rwm6YDSbI32QYRJ1Ck9kglNccJGvE5daalxaeFA05SjQvjBIhAcYkNGsXFBIqLa8dD0woKqd64KRxkmuJyAog7PSJwpKc38KlNdyUn6x1IBA0ESnUhIkKCx9ac6pnYs9XLh4q5QgEjFBxCAaV+ekl1CZuKN4UDSlWg8VpTLnGREpcSvsNIi08jtWcq6X3TSYtPIy1ukP0bXzs9Mz6NFHcSUnaAQFGREyiKCRQVESgqrh0uKXHSiqjesiU8b6M8njrBwZOR4Yw7fzMycGc46c40V0pKl20yRgOBUiosspird1LvVi9fFaiiuKo4HCSKqorCQaO4ujj8t7jKfraUbqGoqoiy6jIMjT/MTvGmhINEenw6qemppPdKd8YHhNPT4py/vjSSJcEWXTkBIlBUHDFcRKCwsDZ4bN6Mv9AO42/kjsjtdoJEOp50J0A4H09mxHh67bgrMbo169qKBgKlVJuJd8fTM7Fnq+9GAsEAZTVl4QBRXF1MUVVROKgUVRXZcSeYhAJIaXVpo+t0izscPDLiM+zf3hmk9bPBIiO+v03zZZAen06P+HRSvClIRWVtkCgsDA/7CwsJFNSmV23aSOCTYgKFhY0+/xCfD3dmBp6MTBskQsOZmXY4MxN3RqYNHJmZ9q6jA4qsNBAopTqc21V70m6NQDAQvvMoripu8G/os61sG2v3raWwqrDRt+MFCd9dpMenk+5LJ6N7Buk56WTEZ5Ae3y8cODJ8GfTwZZDsTsKUlxMoKLDBorDQDhdEDBfZIFK9aRP+wsLGa2B5vbY4KjPTBonMTDzdMnFndsOdmUHimLHEHz2gtV9vszQQKKWOWG6XmwxfBhm+jBYvE3oOUlRVRGFVIcWVxRRWFYYDRmFl7fDOsp2s27euyeDhEQ/pPhs4Mn2ZNkjkZJAxKIP0+GwyfSNtHuMzwn/dNYHaYFGwH39Bgb3bKCwID/sL9tvnHQUF4RcLe995pwYCpZQ6XJHPQbKSs1q0TCh4FFQWhINFYVUhRZU2mBRWFoYDyOeFn9sAU1Xc6PpS4lLI9GWGg0Nmz0wyjsogI74HmQnHkBmfSWaCnZ7pywwHDldyclt9DXVoIFBKqWZEBo+clJwWLeMP+impLqGwspCCyoJwsCioKrABxBneVraNNfvWUFRZ1GjV3RRvChm+DH446oecl3peW+4aoIFAKaWiwuPykOnLJNOXyUAGNjt/0AQprS4NB42CyoLwJzTemiKwVuU1Kmt1iMg5wEOAG3jCGPO7etNvAa4F/MBe4BpjzNfRzJNSSnVGLnGFH5gPSGv75wBNbjtaKxYRN/AIcC4wHLhMRIbXm+0TYKwx5ljgJeC+aOVHKaVUw6L5mtx44EtjzEZjTDUwD5gSOYMx5h1jTKge1YdAywrflFJKtZloBoJsYGvE+DYnrTHfBd5saIKIXC8iy0Vk+d69e9swi0oppTpFwxkiMh0YC9zf0HRjzGxjzFhjzNgePXq0b+aUUqqLi+bD4u1A34jxHCetDhE5A/gVcKoxpuX9/CmllGoT0bwj+BgYLCIDRCQOuBRYEDmDiBwHPA5MNsbsiWJelFJKNSJqgcAY4wdmAm8BnwEvGGPWishdIjLZme1+IBl4UURWiciCRlanlFIqSqL6HoEx5g3gjXppd0QMnxHN7SullGqemOY6tO5kRGQvcKgvnXUH9rVhdo4UsbjfsbjPEJv7HYv7DK3f737GmAZr2xxxgeBwiMhyY8zYjs5He4vF/Y7FfYbY3O9Y3Gdo2/3uFNVHlVJKdRwNBEopFeNiLRDM7ugMdJBY3O9Y3GeIzf2OxX2GNtzvmHpGoJRS6mCxdkeglFKqHg0ESikV42ImEIjIOSKyQUS+FJHbOjo/0SAifUXkHRFZJyJrReQmJz1TRP4tIl84f6PTzVEHEhG3iHwiIgud8QEi8pFzvOc7zZx0KSKSLiIvich6EflMRI6PkWN9s/P7zheR50XE19WOt4g8JSJ7RCQ/Iq3BYyvWn519Xy0io1u7vZgIBC3sJKcr8AM/McYMByYCP3T28zbgP8aYwcB/nPGu5iZsUyYhvwf+ZIwZBBRimznvah4CFhljhgJ52P3v0sdaRLKBH2E7tMrF9n54KV3veM8BzqmX1tixPRcY7HyuBx5t7cZiIhDQgk5yugJjzE5jzEpnuBR7YsjG7uvTzmxPA9/qkAxGiYjkAN8EnnDGBTgN2+sddM19TgNOAZ4EMMZUG2OK6OLH2uEBEkTEAyQCO+lix9sY8x5QUC+5sWM7BXjGWB8C6SLSpzXbi5VA0NpOco54ItIfOA74COhljNnpTNoF9OqofEXJg8DPgaAz3g0ocho+hK55vAdg+/n+m1Mk9oSIJNHFj7UxZjvwALAFGwCKgRV0/eMNjR/bwz6/xUogiCkikgz8A/ixMaYkcpqx9YW7TJ1hETkf2GOMWdHReWlnHmA08Kgx5jignHrFQF3tWAM45eJTsIEwC0ji4CKULq+tj22sBIIWdZLTFYiIFxsE5hpjXnaSd4duFZ2/XanvhxOBySKyGVvkdxq27DzdKTqArnm8twHbjDEfOeMvYQNDVz7WAGcAm4wxe40xNcDL2N9AVz/e0PixPezzW6wEgmY7yekKnLLxJ4HPjDF/jJi0ALjKGb4KeLW98xYtxphfGGNyjDH9scd1sTHmcuAd4CJnti61zwDGmF3AVhE5xkk6HVhHFz7Wji3ARBFJdH7vof3u0sfb0dixXQBc6dQemggURxQhtYwxJiY+wHnA58BXwK86Oj9R2seTsLeLq4FVzuc8bJn5f4AvgLeBzI7Oa5T2fxKw0Bk+GlgGfAm8CMR3dP6isL+jgOXO8f4nkBELxxq4E1gP5APPAvFd7XgDz2OfgdRg7/6+29ixBQRbK/IrYA22RlWrtqdNTCilVIyLlaIhpZRSjdBAoJRSMU4DgVJKxTgNBEopFeM0ECilVIzTQKBUPSISEJFVEZ82a7hNRPpHtiipVGfgaX4WpWJOhTFmVEdnQqn2oncESrWQiGwWkftEZI2ILBORQU56fxFZ7LQF/x8ROcpJ7yUir4jIp87nBGdVbhH5q9Om/r9EJKHDdkopNBAo1ZCEekVD0yKmFRtjRgIPY1s9Bfh/wNPGmGOBucCfnfQ/A+8aY/Kw7QCtddIHA48YY0YARcCFUd0bpZqhbxYrVY+IlBljkhtI3wycZozZ6DTut8sY001E9gF9jDE1TvpOY0x3EdkL5BhjqiLW0R/4t7GdiyAitwJeY8w97bBrSjVI7wiUah3TyHBrVEUMB9BndaqDaSBQqnWmRfxd6gz/D9vyKcDlwPvO8H+A70O4T+W09sqkUq2hVyJKHSxBRFZFjC8yxoSqkGaIyGrsVf1lTtqN2J7CfobtNexqJ/0mYLaIfBd75f99bIuSSnUq+oxAqRZynhGMNcbs6+i8KNWWtGhIKaVinN4RKKVUjNM7AqWUinEaCJRSKsZpIFBKqRingUAppWKcBgKllIpx/x+I3157A1+WCAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "model.plot(path=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is clear that this model would need more training epochs to converge, but this would not fix the overfitting problem." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For code, maths and pictures behind the *RNN* layer, follow this link:\n", "\n", "* [Recurrent Neural Network (RNN)](https://epynn.net/RNN.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### RNN-Dense with SGD" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In the above-example we used Gradient Descent (GD) optimization, meaning that:\n", "\n", "* All training examples are in a single batch.\n", "* There is a single weight update by the training epoch.\n", "\n", "Below we set ``batch_size`` to ``32`` to use Stochastic Gradient Descent (SGD), meaning that:\n", "\n", "* All training examples are divided into batches of size 32, yielding ``N_SAMPLES // 32`` batches.\n", "* There are as many weight update by training epochs than training batches." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "embedding = Embedding(X_data=X_features,\n", " Y_data=Y_label,\n", " Y_encode=True,\n", " batch_size=32,\n", " relative_size=(2, 1, 0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We use the same network as before." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "name = 'RNN-10_Flatten_Dense-2-softmax'\n", "\n", "se_hPars['learning_rate'] = 0.01\n", "se_hPars['softmax_temperature'] = 5\n", "\n", "rnn = RNN(10)\n", "\n", "dense = Dense(2, softmax)\n", "\n", "layers = [embedding, rnn, dense]\n", "\n", "model = EpyNN(layers=layers, name=name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We initialize and train the nework." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[37mEpoch 99 - Batch 20/20 - Accuracy: 0.969 Cost: 0.02007 - TIME: 57.12s RATE: 1.75e+00e/s TTC: 1s \u001b[0m\n", "\n", "+-------+----------+----------+----------+-------+--------+-------+-------------------------------------------+\n", "| \u001b[1m\u001b[37mepoch\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[37mlrate\u001b[0m | \u001b[1m\u001b[32maccuracy\u001b[0m | | \u001b[1m\u001b[31mMSE\u001b[0m | | \u001b[37mExperiment\u001b[0m |\n", "| | \u001b[37mRNN\u001b[0m | \u001b[37mDense\u001b[0m | \u001b[1m\u001b[32mdtrain\u001b[0m | \u001b[1m\u001b[32mdval\u001b[0m | \u001b[1m\u001b[31mdtrain\u001b[0m | \u001b[1m\u001b[31mdval\u001b[0m | |\n", "+-------+----------+----------+----------+-------+--------+-------+-------------------------------------------+\n", "| \u001b[1m\u001b[37m0\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.540\u001b[0m | \u001b[1m\u001b[32m0.516\u001b[0m | \u001b[1m\u001b[31m0.247\u001b[0m | \u001b[1m\u001b[31m0.250\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m10\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.638\u001b[0m | \u001b[1m\u001b[32m0.630\u001b[0m | \u001b[1m\u001b[31m0.226\u001b[0m | \u001b[1m\u001b[31m0.230\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m20\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.900\u001b[0m | \u001b[1m\u001b[32m0.903\u001b[0m | \u001b[1m\u001b[31m0.119\u001b[0m | \u001b[1m\u001b[31m0.117\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m30\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.895\u001b[0m | \u001b[1m\u001b[32m0.900\u001b[0m | \u001b[1m\u001b[31m0.097\u001b[0m | \u001b[1m\u001b[31m0.094\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m40\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.959\u001b[0m | \u001b[1m\u001b[32m0.971\u001b[0m | \u001b[1m\u001b[31m0.038\u001b[0m | \u001b[1m\u001b[31m0.029\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m50\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.974\u001b[0m | \u001b[1m\u001b[32m0.977\u001b[0m | \u001b[1m\u001b[31m0.025\u001b[0m | \u001b[1m\u001b[31m0.022\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m60\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.974\u001b[0m | \u001b[1m\u001b[32m0.977\u001b[0m | \u001b[1m\u001b[31m0.023\u001b[0m | \u001b[1m\u001b[31m0.019\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m70\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.972\u001b[0m | \u001b[1m\u001b[32m0.974\u001b[0m | \u001b[1m\u001b[31m0.024\u001b[0m | \u001b[1m\u001b[31m0.024\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m80\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.966\u001b[0m | \u001b[1m\u001b[32m0.974\u001b[0m | \u001b[1m\u001b[31m0.028\u001b[0m | \u001b[1m\u001b[31m0.024\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m90\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.985\u001b[0m | \u001b[1m\u001b[32m0.991\u001b[0m | \u001b[1m\u001b[31m0.014\u001b[0m | \u001b[1m\u001b[31m0.010\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "| \u001b[1m\u001b[37m99\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[37m1.00e-02\u001b[0m | \u001b[1m\u001b[32m0.982\u001b[0m | \u001b[1m\u001b[32m0.991\u001b[0m | \u001b[1m\u001b[31m0.016\u001b[0m | \u001b[1m\u001b[31m0.009\u001b[0m | \u001b[37m1635012814_RNN-10_Flatten_Dense-2-softmax\u001b[0m |\n", "+-------+----------+----------+----------+-------+--------+-------+-------------------------------------------+\n" ] } ], "source": [ "model.initialize(loss='MSE', seed=1, se_hPars=se_hPars.copy(), end='\\r')\n", "\n", "model.train(epochs=100, init_logs=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For the same number of training epochs, accuracy is much higher." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "model.plot(path=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And there is no overfitting, this is an excellent model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For code, maths and pictures behind the *RNN* layer, follow this link:\n", "\n", "* [Recurrent Neural Network (RNN)](https://epynn.net/RNN.html)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Write, read & Predict" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A trained model can be written on disk such as:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[1m\u001b[32mMake: /media/synthase/beta/EpyNN/epynnlive/dummy_time/models/1635012814_RNN-10_Flatten_Dense-2-softmax.pickle\u001b[0m\n" ] } ], "source": [ "model.write()\n", "\n", "# model.write(path=/your/custom/path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A model can be read from disk such as:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "model = read_model()\n", "\n", "# model = read_model(path=/your/custom/path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can retrieve new features and predict on them." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "X_features, _ = prepare_dataset(N_SAMPLES=10)\n", "\n", "dset = model.predict(X_features)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Results can be extracted such as:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0 [0.98718813 0.01281187]\n", "1 0 [0.94121987 0.05878013]\n", "2 1 [0.02139625 0.97860375]\n", "3 0 [0.95959614 0.04040386]\n", "4 1 [0.02610764 0.97389236]\n", "5 1 [0.01849713 0.98150287]\n", "6 1 [0.018713 0.981287]\n", "7 1 [0.01967183 0.98032817]\n", "8 0 [0.96032797 0.03967203]\n", "9 0 [0.93915586 0.06084414]\n" ] } ], "source": [ "for n, pred, probs in zip(dset.ids, dset.P, dset.A):\n", " print(n, pred, probs)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.2" } }, "nbformat": 4, "nbformat_minor": 4 }