\n",
+ "\n",
+ "
\n",
+ "
\n",
+ "
"
]
},
{
@@ -28,9 +34,21 @@
"metadata": {},
"source": [
"
\n",
+ "\n",
+ "#### Right Now\n",
+ "\n",
+ "```shell\n",
+ "\n",
+ "git clone https://github.com/leriomaggio/deep-learning-keras-tensorflow.git -b euroscipy2017\n",
+ "```\n",
+ "\n",
+ "\n",
+ "#### Later\n",
+ "\n",
"```shell\n",
"\n",
"git clone https://github.com/leriomaggio/deep-learning-keras-tensorflow.git\n",
+ "git checkout tags/euroscipy2017\n",
"```"
]
},
@@ -43,75 +61,37 @@
},
{
"cell_type": "markdown",
- "metadata": {
- "collapsed": true
- },
+ "metadata": {},
"source": [
- "# Tentative Outline\n",
- "\n",
- "# Outline at a glance\n",
- "\n",
- "- **Part I**: **Introduction**\n",
- "\n",
- " - Intro to Deep Learning and ANN\n",
- " - Perceptron and MLP \n",
- "\t- naive pure-Python implementation\n",
- " - fast forward, sgd, backprop\n",
- " \n",
- " - Intro to Tensorflow \n",
- " - Model + SGD with Tensorflow\n",
- " \n",
- " - Introduction to Keras\n",
- " - Overview and main features\n",
- " - Keras Backend\n",
- " - Overview of the `core` layers\n",
- " - Multi-Layer Perceptron and Fully Connected\n",
- " - Examples with `keras.models.Sequential` and `Dense`\n",
- " - HandsOn: FC with keras\n",
- " \n",
- "- **Part II**: **Supervised Learning and Convolutional Neural Nets**\n",
- " \n",
- " - Intro: Focus on Image Classification\n",
- "\n",
- " - Intro to ConvNets\n",
- " - meaning of convolutional filters\n",
- " - examples from ImageNet \n",
- " - Visualising ConvNets \n",
- "\n",
- " - Advanced CNN\n",
- " - Dropout\n",
- " - MaxPooling\n",
- " - Batch Normalisation\n",
- "\t\t\n",
- " - HandsOn: MNIST Dataset\n",
- " - FC and MNIST\n",
- " - CNN and MNIST\n",
- " \n",
- " - Deep Convolutiona Neural Networks with Keras (ref: `keras.applications`)\n",
- " - VGG16\n",
- " - VGG19\n",
- " - ResNet50\n",
- " - Transfer Learning and FineTuning\n",
- " - Hyperparameters Optimisation \n",
- " \n",
- "- **Part III**: **Unsupervised Learning**\n",
- "\n",
- " - AutoEncoders and Embeddings\n",
- "\t- AutoEncoders and MNIST\n",
- " \t- word2vec and doc2vec (gensim) with `keras.datasets`\n",
- " - word2vec and CNN\n",
- " \n",
- "- **Part IV**: **Recurrent Neural Networks**\n",
- " - Recurrent Neural Network in Keras \n",
- " - `SimpleRNN`, `LSTM`, `GRU`\n",
- "\t\t\n",
- "- **PartV**: **Additional Materials**: \n",
- " - Quick tutorial on `theano`\n",
- " - Perceptron and Adaline (pure-python) implementations \n",
- " - MLP and MNIST (pure-python)\n",
- " - LSTM for Sentence Generation\n",
- " - Custom Layers in Keras \n",
- " - Multi modal Network Topologies with Keras"
+ "# Goal\n",
+ "\n",
+ "- **Introduce** main features of Keras APIs to build Neural Networks. \n",
+ "- **Learn** how to implement simple and complex Deep Neural Networks Architectures using Keras. \n",
+ "- **Discover** Keras Implementation and Internals.\n",
+ "\n",
+ "\n",
+ "- **Note**: examples and hands-on exercises will be provided along the way. This means that you should be able to run (almost) everything on your laptop without needing GPU(s). Even if, with GPUs code run faster :P"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Outline (in ten-ish Notebooks)\n",
+ "\n",
+ "1. _Multi-layer Fully Connected Networks (and the `backends`)_\n",
+ "2. _Hidden Layers features and Embeddings_\n",
+ "3. _Convolutional Networks_\n",
+ "4. _Hyperparameter Tuning_\n",
+ "5. _Cutsom Layers_\n",
+ "6. _Deep CNN and Residual Networks_\n",
+ "7. _Transfer Learning and Fine Tuning_\n",
+ "8. _Recurrent Neural Networks_\n",
+ "9. _AutoEncoders_\n",
+ "10. _Multi-Modal Networks_\n",
+ "\n",
+ "- - - -"
]
},
{
@@ -138,18 +118,18 @@
" - Python 3.4 should be fine as well\n",
" - likely Python 2.7 would be also fine, but *who knows*? :P\n",
" \n",
- "- `numpy` version 1.10 or later: http://www.numpy.org/\n",
- "- `scipy` version 0.16 or later: http://www.scipy.org/\n",
- "- `matplotlib` version 1.4 or later: http://matplotlib.org/\n",
- "- `pandas` version 0.16 or later: http://pandas.pydata.org\n",
- "- `scikit-learn` version 0.15 or later: http://scikit-learn.org\n",
- "- `keras` version 2.0 or later: http://keras.io\n",
- "- `tensorflow` version 1.0 or later: https://www.tensorflow.org\n",
- "- `ipython`/`jupyter` version 4.0 or later, with notebook support\n",
+ "\n",
+ "- `numpy` version >= 1.12: http://www.numpy.org/\n",
+ "- `scipy` version >= 0.19: http://www.scipy.org/\n",
+ "- `matplotlib` version >= 2.0: http://matplotlib.org/\n",
+ "- `pandas` version >= 0.19: http://pandas.pydata.org\n",
+ "- `scikit-learn` version >= 0.18: http://scikit-learn.org\n",
+ "- `keras` version >= 2.0: http://keras.io\n",
+ "- `tensorflow` version 1.2: https://www.tensorflow.org\n",
+ "- `ipython`/`jupyter` version >= 6.0, with notebook support\n",
"\n",
"(Optional but recommended):\n",
"\n",
- "- `pyyaml`\n",
"- `hdf5` and `h5py` (required if you use model saving/loading functions in keras)\n",
"- **NVIDIA cuDNN** if you have NVIDIA GPUs on your machines.\n",
" [https://developer.nvidia.com/rdp/cudnn-download]()\n",
@@ -157,6 +137,20 @@
"The easiest way to get (most) these is to use an all-in-one installer such as [Anaconda](http://www.continuum.io/downloads) from Continuum. These are available for multiple architectures."
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Setting up the Environment\n",
+ "\n",
+ "If you need support to setup and replicate the environment with all the required library, please\n",
+ "find all the step-by-step instructions in the [README.md](README.html) file.\n",
+ "\n",
+ "This repo ships with `.yml` files to replicate the Python Conda environment (on both Linux and OSX).\n",
+ "\n",
+ "Moreover, helpful tips on how to setup theano and tensorflow with GPU support are also provided"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
@@ -187,7 +181,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "Python 3.5.2\r\n"
+ "Python 3.5.4 :: Anaconda custom (64-bit)\r\n"
]
}
],
@@ -229,11 +223,11 @@
"output_type": "stream",
"text": [
"{\r\n",
- "\t\"epsilon\": 1e-07,\r\n",
- "\t\"backend\": \"tensorflow\",\r\n",
- "\t\"floatx\": \"float32\",\r\n",
- "\t\"image_data_format\": \"channels_last\"\r\n",
- "}"
+ " \"image_data_format\": \"channels_last\",\r\n",
+ " \"epsilon\": 1e-07,\r\n",
+ " \"floatx\": \"float32\",\r\n",
+ " \"backend\": \"tensorflow\"\r\n",
+ "}\r\n"
]
}
],
@@ -265,7 +259,9 @@
{
"cell_type": "code",
"execution_count": 3,
- "metadata": {},
+ "metadata": {
+ "collapsed": true
+ },
"outputs": [],
"source": [
"import numpy as np\n",
@@ -308,11 +304,11 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "numpy: 1.11.1\n",
- "scipy: 0.18.0\n",
- "matplotlib: 1.5.2\n",
- "iPython: 5.1.0\n",
- "scikit-learn: 0.18\n"
+ "numpy: 1.12.1\n",
+ "scipy: 0.19.1\n",
+ "matplotlib: 2.0.2\n",
+ "iPython: 6.1.0\n",
+ "scikit-learn: 0.19.0\n"
]
}
],
@@ -342,9 +338,17 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "keras: 2.0.2\n",
- "Theano: 0.9.0\n",
- "Tensorflow: 1.0.1\n"
+ "keras: 2.0.8\n",
+ "Theano: 0.9.0.dev-c697eeab84e5b8a74908da654b66ec9eca4f1291\n",
+ "TensorFlow: 1.2.1\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Using cuDNN version 5110 on context None\n",
+ "Mapped name None to device cuda0: Tesla K80 (FC0D:00:00.0)\n"
]
}
],
@@ -357,7 +361,7 @@
"print('Theano: ', theano.__version__)\n",
"\n",
"import tensorflow as tf\n",
- "print('Tensorflow: ', tf.__version__)"
+ "print('TensorFlow: ', tf.__version__)"
]
},
{
@@ -379,7 +383,7 @@
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python [default]",
"language": "python",
"name": "python3"
},
@@ -393,7 +397,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.5.3"
+ "version": "3.5.4"
}
},
"nbformat": 4,
diff --git a/1 Multi-layer Fully Connected Networks.ipynb b/1 Multi-layer Fully Connected Networks.ipynb
new file mode 100644
index 0000000..5da8333
--- /dev/null
+++ b/1 Multi-layer Fully Connected Networks.ipynb
@@ -0,0 +1,1392 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ "\n",
+ "## Keras: The Deep Learning library _for perfectionist, with deadlines_ $^1$\n",
+ "\n",
+ "_`[1]`: Freely borrowed by the [Django](https://www.djangoproject.com) payoff_"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**excerpt** from the officila documentation ([http://keras.io](http://keras.io))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ">Keras is a high-level neural networks API, written in Python and capable of running on top of [TensorFlow](https://github.com/tensorflow/tensorflow), [CNTK](https://github.com/Microsoft/cntk), or [Theano](https://github.com/Theano/Theano). It was developed with a focus on enabling fast experimentation. \n",
+ ">\n",
+ "> _Being able to go from idea to result with the least possible delay is key to doing good research._\n",
+ ">\n",
+ "> Use Keras if you need a deep learning library that:\n",
+ "> \n",
+ "> * Allows for easy and fast prototyping (through user friendliness, modularity, and extensibility).\n",
+ "> * Supports both convolutional networks and recurrent networks, as well as combinations of the two.\n",
+ "> * Runs seamlessly on CPU and GPU.\n",
+ ">\n",
+ ">\n",
+ "> Keras is compatible with: **Python 2.7-3.5**.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "
\n",
+ "### Kaggle Challenge Data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ">The Otto Group is one of the world’s biggest e-commerce companies, A consistent analysis of the performance of products is crucial. \n",
+ ">\n",
+ ">However, due to diverse global infrastructure, many identical products get classified differently.\n",
+ ">\n",
+ "> For this competition, we have provided a dataset with 93 features for more than 200,000 products. The objective is to build a predictive model which is able to distinguish between our main product categories.\n",
+ ">\n",
+ ">Each row corresponds to a single product. There are a total of 93 numerical features, which represent counts of different events. All features have been obfuscated and will not be defined any further.\n",
+ "\n",
+ "https://www.kaggle.com/c/otto-group-product-classification-challenge/data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### For this section we will use the Kaggle Otto Group Challenge Data. You will find these data in \n",
+ "`data/kaggle_ottogroup/` folder."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Logistic Regression\n",
+ "\n",
+ "This algorithm has nothing to do with the canonical _linear regression_, but it is an algorithm that allows us to solve problems of classification (supervised learning). \n",
+ "\n",
+ "In fact, to estimate the dependent variable, now we make use of the so-called **logistic function** or **sigmoid**. \n",
+ "\n",
+ "It is precisely because of this feature we call this algorithm logistic regression.\n",
+ "\n",
+ "![](imgs/sigmoid.png)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Data Preparation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Using TensorFlow backend.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from kaggle_data import load_data, preprocess_data, preprocess_labels\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "9 classes\n",
+ "93 features\n"
+ ]
+ }
+ ],
+ "source": [
+ "X_train, labels = load_data('data/kaggle_ottogroup/train.csv', train=True)\n",
+ "X_train, scaler = preprocess_data(X_train)\n",
+ "Y_train, encoder = preprocess_labels(labels)\n",
+ "\n",
+ "X_test, ids = load_data('data/kaggle_ottogroup/test.csv', train=False)\n",
+ "X_test, _ = preprocess_data(X_test, scaler)\n",
+ "\n",
+ "nb_classes = Y_train.shape[1]\n",
+ "print(nb_classes, 'classes')\n",
+ "\n",
+ "dims = X_train.shape[1]\n",
+ "print(dims, 'features')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array(['Class_1', 'Class_2', 'Class_3', 'Class_4', 'Class_5', 'Class_6',\n",
+ " 'Class_7', 'Class_8', 'Class_9'], dtype=object)"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.unique(labels)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 0., 0., 1., ..., 0., 0., 0.],\n",
+ " [ 0., 0., 1., ..., 0., 0., 0.],\n",
+ " [ 0., 0., 0., ..., 0., 0., 0.],\n",
+ " ..., \n",
+ " [ 0., 0., 1., ..., 0., 0., 0.],\n",
+ " [ 0., 1., 0., ..., 0., 0., 0.],\n",
+ " [ 0., 0., 0., ..., 0., 0., 0.]])"
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "Y_train # one-hot encoding"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Using Theano"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Using cuDNN version 5110 on context None\n",
+ "Mapped name None to device cuda0: Tesla K80 (FC0D:00:00.0)\n"
+ ]
+ }
+ ],
+ "source": [
+ "import theano as th\n",
+ "import theano.tensor as T"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Epoch 1\n",
+ "Epoch 2\n",
+ "Epoch 3\n",
+ "Epoch 4\n",
+ "Epoch 5\n",
+ "Epoch 6\n",
+ "Epoch 7\n",
+ "Epoch 8\n",
+ "Epoch 9\n",
+ "Epoch 10\n",
+ "target values for Data:\n",
+ "[ 0. 0. 0. ..., 0. 0. 0.]\n",
+ "prediction on training set:\n",
+ "[ True True False ..., False False False]\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Based on example from DeepLearning.net\n",
+ "rng = np.random\n",
+ "N = 400\n",
+ "feats = 93\n",
+ "training_steps = 10\n",
+ "\n",
+ "# Declare Theano symbolic variables\n",
+ "x = T.matrix(\"x\")\n",
+ "y = T.vector(\"y\")\n",
+ "w = th.shared(rng.randn(feats), name=\"w\")\n",
+ "b = th.shared(0., name=\"b\")\n",
+ "\n",
+ "# Construct Theano expression graph\n",
+ "p_1 = 1 / (1 + T.exp(-T.dot(x, w) - b)) # Probability that target = 1\n",
+ "prediction = p_1 > 0.5 # The prediction thresholded\n",
+ "xent = -y * T.log(p_1) - (1-y) * T.log(1-p_1) # Cross-entropy loss function\n",
+ "cost = xent.mean() + 0.01 * (w ** 2).sum() # The cost to minimize\n",
+ "gw, gb = T.grad(cost, [w, b]) # Compute the gradient of the cost\n",
+ " \n",
+ "\n",
+ "# Compile\n",
+ "train = th.function(\n",
+ " inputs=[x,y],\n",
+ " outputs=[prediction, xent],\n",
+ " updates=((w, w - 0.1 * gw), (b, b - 0.1 * gb)),\n",
+ " allow_input_downcast=True)\n",
+ "\n",
+ "predict = th.function(inputs=[x], outputs=prediction, allow_input_downcast=True)\n",
+ "\n",
+ "#Transform for class1\n",
+ "y_class1 = []\n",
+ "for i in Y_train:\n",
+ " y_class1.append(i[0])\n",
+ "y_class1 = np.array(y_class1)\n",
+ "\n",
+ "# Train\n",
+ "for i in range(training_steps):\n",
+ " print('Epoch %s' % (i+1,))\n",
+ " pred, err = train(X_train, y_class1)\n",
+ "\n",
+ "print(\"target values for Data:\")\n",
+ "print(y_class1)\n",
+ "print(\"prediction on training set:\")\n",
+ "print(predict(X_train))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Using Tensorflow"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "import tensorflow as tf"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Parameters\n",
+ "learning_rate = 0.01\n",
+ "training_epochs = 25\n",
+ "display_step = 1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# tf Graph Input\n",
+ "x = tf.placeholder(\"float\", [None, dims]) \n",
+ "y = tf.placeholder(\"float\", [None, nb_classes])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "
"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Model (Introducing Tensorboard)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Construct (linear) model\n",
+ "with tf.name_scope(\"model\") as scope:\n",
+ " # Set model weights\n",
+ " W = tf.Variable(tf.zeros([dims, nb_classes]))\n",
+ " b = tf.Variable(tf.zeros([nb_classes]))\n",
+ " activation = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax\n",
+ "\n",
+ " # Add summary ops to collect data\n",
+ " w_h = tf.summary.histogram(\"weights_histogram\", W)\n",
+ " b_h = tf.summary.histogram(\"biases_histograms\", b)\n",
+ " tf.summary.scalar('mean_weights', tf.reduce_mean(W))\n",
+ " tf.summary.scalar('mean_bias', tf.reduce_mean(b))\n",
+ "\n",
+ "# Minimize error using cross entropy\n",
+ "# Note: More name scopes will clean up graph representation\n",
+ "with tf.name_scope(\"cost_function\") as scope:\n",
+ " cross_entropy = y*tf.log(activation)\n",
+ " cost = tf.reduce_mean(-tf.reduce_sum(cross_entropy,reduction_indices=1))\n",
+ " # Create a summary to monitor the cost function\n",
+ " tf.summary.scalar(\"cost_function\", cost)\n",
+ " tf.summary.histogram(\"cost_histogram\", cost)\n",
+ "\n",
+ "with tf.name_scope(\"train\") as scope:\n",
+ " # Set the Optimizer\n",
+ " optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Accuracy"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "with tf.name_scope('Accuracy') as scope:\n",
+ " correct_prediction = tf.equal(tf.argmax(activation, 1), tf.argmax(y, 1))\n",
+ " # Calculate accuracy\n",
+ " accuracy = tf.reduce_mean(tf.cast(correct_prediction, \"float\"))\n",
+ " # Create a summary to monitor the cost function\n",
+ " tf.summary.scalar(\"accuracy\", accuracy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Learning in a TF Session"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "LOGDIR = \"/tmp/logistic_logs\"\n",
+ "import os, shutil\n",
+ "if os.path.isdir(LOGDIR):\n",
+ " shutil.rmtree(LOGDIR)\n",
+ "os.mkdir(LOGDIR)\n",
+ "\n",
+ "# Plug TensorBoard Visualisation \n",
+ "writer = tf.summary.FileWriter(LOGDIR, graph=tf.get_default_graph())"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "model/weights_histogram:0\n",
+ "model/biases_histograms:0\n",
+ "model/mean_weights:0\n",
+ "model/mean_bias:0\n",
+ "cost_function/cost_function:0\n",
+ "cost_function/cost_histogram:0\n",
+ "Accuracy/accuracy:0\n",
+ "Tensor(\"add:0\", shape=(), dtype=string)\n"
+ ]
+ }
+ ],
+ "source": [
+ "for var in tf.get_collection(tf.GraphKeys.SUMMARIES):\n",
+ " print(var.name)\n",
+ " \n",
+ "summary_op = tf.summary.merge_all()\n",
+ "print('Summary Op: ' + summary_op)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "accuracy epoch 0:0.6649529933929443\n",
+ "accuracy epoch 1:0.6652762293815613\n",
+ "accuracy epoch 2:0.6657125949859619\n",
+ "accuracy epoch 3:0.6659550070762634\n",
+ "accuracy epoch 4:0.6662943363189697\n",
+ "accuracy epoch 5:0.6666014194488525\n",
+ "accuracy epoch 6:0.6668115258216858\n",
+ "accuracy epoch 7:0.6671024560928345\n",
+ "accuracy epoch 8:0.6674579381942749\n",
+ "accuracy epoch 9:0.667829692363739\n",
+ "accuracy epoch 10:0.6680881977081299\n",
+ "accuracy epoch 11:0.6682336926460266\n",
+ "accuracy epoch 12:0.6684598922729492\n",
+ "accuracy epoch 13:0.6687508225440979\n",
+ "accuracy epoch 14:0.6690416932106018\n",
+ "accuracy epoch 15:0.6692517995834351\n",
+ "accuracy epoch 16:0.6695103645324707\n",
+ "accuracy epoch 17:0.6697850823402405\n",
+ "accuracy epoch 18:0.6699790358543396\n",
+ "accuracy epoch 19:0.6702214479446411\n",
+ "accuracy epoch 20:0.6705446243286133\n",
+ "accuracy epoch 21:0.670835554599762\n",
+ "accuracy epoch 22:0.6710779666900635\n",
+ "accuracy epoch 23:0.6713850498199463\n",
+ "accuracy epoch 24:0.6716920137405396\n",
+ "Training phase finished\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEKCAYAAAAB0GKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4FfX59/H3LUmFAhWpqBhQ9KlSCQQoEVmLlSIgtCil\npVJcqAo+lZ/yqIhbH62/Uqi0Wn9edeEpuKLUDaVqi2JdLzcCRBGoshTbRCoIBlmVwP38cSYhxCxz\nksxZP6/rysU5M9+Zc0+G5M58v997xtwdERGR+hyS7ABERCQ9KGGIiEgoShgiIhKKEoaIiISihCEi\nIqEoYYiISChKGCIiEooShoiIhKKEISIioeQkO4CmdMQRR3inTp2SHYaISNpYunTpp+7eLkzbjEoY\nnTp1oqioKNlhiIikDTP7KGxbdUmJiEgoShgiIhKKEoaIiIQS2RiGmXUEHgCOAhyY7e63V2vzM2Aa\nYMB24H+7+7vBumHA7UAz4E/uPjOqWCX17d27l5KSEvbs2ZPsUETSUvPmzenQoQO5ubkN3keUg97l\nwJXuvszMWgNLzewFd19Vpc0/gUHu/pmZDQdmA6eaWTPgj8AQoARYYmYLq20rWaSkpITWrVvTqVMn\nzCzZ4YikFXdny5YtlJSUcPzxxzd4P5ElDHffCGwMXm83s9VAHrCqSps3qmzyFtAheN0bWOvu6wHM\nbD4wquq2TeWp5aXMWvQBH5ft5pg2LZg6tDNn9cxr6o+RRtqzZ4+ShUgDmRnf/OY32bx5c6P2k5Ax\nDDPrBPQE3q6j2YXAX4PXecC/q6wrCZbVtO+JZlZkZkXxfjOeWl7KtU+uoLRsNw6Ulu3m2idX8NTy\n0rj2I4mhZCHScE3x8xN5wjCzVsATwBR3/7yWNt8jljCmxbt/d5/t7oXuXtiuXajak0qzFn3A7r37\nDlq2e+8+Zi36IN4wREQyXqQJw8xyiSWLee7+ZC1tCoA/AaPcfUuwuBToWKVZh2BZk/q4bHdcyyW7\ntWrVqtH7+PjjjxkzZkyt68vKyrjzzjtDt6/uggsu4Pjjj6dHjx50796dF198sVHxNrW7776bBx54\noFH7WLFiBT169KBHjx60bdu28ni///3vx7WfoUOHsn379jrbXH/99bz00kuNCbdeAwYMoLi4ONLP\naCpRzpIyYA6w2t1vraXNscCTwLnu/mGVVUuAE83seGKJ4qfAuKaO8Zg2LSitITkc06ZFU3+UJFiq\njk0dc8wxPP7447Wur0gYv/jFL0K1r8msWbMYM2YML730EhMnTmTNmjWNihmgvLycnJzG/7q45JJL\nGr2Pbt26Vf6CveCCCxg5cmSNSbW+mBctWlTvZ02fPr3hgWagKK8w+gPnAqebWXHwdaaZXWJmFf9r\n/i/wTeDOYH0RgLuXA5OBRcBq4FF3X9nUAU4d2pkWuc0OWtYitxlTh3Zu6o+SBErk2NSGDRs4/fTT\nKSgoYPDgwfzrX/8CYN26dfTp04du3bpxww03VF6dbNiwga5duwKwcuVKevfuTY8ePSgoKGDNmjVc\nc801rFu3jh49ejB16tSD2u/bt4+rrrqKrl27UlBQwB133FFnbH379qW09MAxL126lEGDBtGrVy+G\nDh3Kxo0bAViyZAkFBQWVn1nxeffddx8//OEPOf300xk8eDAQS0annHIKBQUF3HjjjQDs3LmTESNG\n0L17d7p27cqf//xnAK655hq6dOlCQUEBV111FQA33XQTv/vd7wAoLi6mT58+FBQUcPbZZ/PZZ58B\ncNpppzFt2jR69+7NSSedxGuvvRb6fCxevJjTTjuNkSNH0q1bNwB+8IMf0KtXL/Lz8/nTn/5U2bZD\nhw6UlZWxdu1aunbtyoUXXkh+fj7Dhw+vnL49fvx4nnrqqcr2N910Ez179qSgoIAPP4z9jbtp0yYG\nDx5Mfn4+kyZNIi8vj7KysoPiKi8vp02bNlx22WXk5+czZMgQtmzZUrl+/vz59O7dm86dO/PGG7G5\nQOvWrWPgwIH07NmTXr168fbbsSHg0tJSBgwYQI8ePejatWtl+7/+9a/07duX73znO4wdO5adO3eG\n/r6F5u4Z89WrVy+P14JlJd5vxoveadoz3m/Gi75gWUnc+5DorVq1KnTbfjNe9OOmPfOVr34zXmxU\nDC1btvzKspEjR/p9993n7u5z5szxUaNGubv7iBEj/OGHH3Z397vuuqty23/+85+en5/v7u6TJ0/2\nhx56yN3dv/jiC9+1a9dB66u3v/POO/1HP/qR7927193dt2zZ8pV4zj//fH/sscfc3X3BggV+zjnn\nuLv7l19+6X379vVNmza5u/v8+fN9woQJ7u6en5/vb7zxhru7T5s2rfLz7r33Xs/Ly6v8nEWLFvnF\nF1/s+/fv93379vmIESP8lVde8ccff9wvuuiiyhjKysr8008/9ZNOOsn379/v7u6fffaZu7vfeOON\nPmvWLHd379atm7/88svu7v7LX/7SL7/8cnd3HzRokF9xxRXu7v7ss8/64MGDazkjBx+vu/sLL7zg\nLVu29I8++qhyWUX8O3fu9JNPPtm3bt3q7u55eXn+2Wef+Zo1azwnJ8ffe+89d3c/++yz/ZFHHnF3\n95/97Ge+YMGCyvZ33nmnu7vffvvtPmnSJHd3nzRpkt9yyy3u7v6Xv/zFgcrjrbB3714HfP78+V85\n3v79+/vVV1/t7u5PP/20Dx06tDLe3bt3u7v76tWrvXfv3u7uPnPmTJ85c6a7u5eXl/v27dv9k08+\n8e9+97u+c+dOd3f/9a9/7dOnT//K96umnyOgyEP+js2omw82xFk981Kiq0KaTiLHpt58802efDI2\nPHfuuedy9dVXVy6v+Mt03LhxlX9hV9W3b1+mT59OSUkJo0eP5sQTT6zzsxYvXswll1xS2c3Stm3b\nGttNnTqV6667jpKSEt58800APvjgA95//32GDBkCxK5W2rdvT1lZGdu3b6dv376VsT7zzDOV+xoy\nZEjl5zz//PM8//zz9OzZE4AdO3awZs0aBg4cyJVXXsm0adMYOXIkAwcOpLy8nObNm3PhhRcycuRI\nRo4ceVCM27Zto6ysjEGDBgFw/vnn8+Mf/7hy/ejRowHo1asXGzZsqPP7Ul3fvn059thjK9/fdttt\nLFy4EIjV86xbt47CwsKDtvnWt75VeUVS12dWjeu5554D4PXXX+f6668HYOTIkbRu3brGbXNyciqP\ncfz48Ywbd6CXvabj/eKLL5g8eTLvvvsuOTk5rFu3DoBTTjmFSZMmsWfPHs466yy6d+/O4sWLWbVq\nFf369QPgyy+/ZMCAASG+W/HRrUEk49Q2BpVqY1Pjxo1j4cKFtGjRgjPPPJO///3vTbLfWbNm8eGH\nH/Lb3/6Wn//850CsJyE/P5/i4mKKi4tZsWIFzz//fL37atmyZeVrd+faa6+t3MfatWu58MILOemk\nk1i2bFll99vNN99MTk4O77zzDmPGjOGZZ55h2LBhcR3DoYceCkCzZs0oLy+Pa9uqMS9evJhXX32V\nt956i3fffZeCgoIa7xZQ8Xn1fWZj4qqu6jTXmvb7+9//no4dO7JixQreeecdvvjiCwBOP/10Xn75\nZdq3b895553HvHnzcHeGDRtWeW5WrVrF7NmzGxVfTZQwJOMkcmyqX79+zJ8/H4B58+YxcOBAAPr0\n6cMTTzwBULm+uvXr13PCCSdw2WWXMWrUKN577z1at25d68ydIUOGcM8991T+Qtm6dWudsU2ePJn9\n+/ezaNEiOnfuzObNmyuvOPbu3cvKlStp06YNrVu3ruwfry1WiM0qmjt3Ljt27ABifembNm3i448/\n5utf/zrjx49n6tSpLFu2jB07drBt2zbOPPNMbrvtNt59992D9nXYYYdx+OGHV45PPPjgg5VXG01p\n27ZttG3blhYtWrBy5UqWLFnS5J/Rv39/Hn30UQCee+65Ws9feXl55dXoww8/XO8VwLZt22jfvj1m\nxv3330+s9wg++ugjjj76aCZOnMiECRNYvnw5/fr145VXXmH9+vVAbFypKSY7VJf1XVLxStXZN3JA\nxflo6vO0a9cuOnToUPn+iiuu4I477mDChAnMmjWLdu3ace+99wLwhz/8gfHjxzN9+nSGDRvGYYcd\n9pX9Pfroozz44IPk5uZy9NFHc91119G2bVv69+9P165dGT58OJdeemll+4suuogPP/yQgoICcnNz\nufjii5k8eXKt8ZoZN9xwA7fccgtDhw7l8ccf57LLLmPbtm2Ul5czZcoU8vPzmTNnDhdffDGHHHII\ngwYNqjFWgDPOOIPVq1dXdl+1atWKhx56iLVr1zJ16lQOOeQQcnNzueuuu9i+fTujRo1iz549uDu3\n3vrViZL3338/l1xyCbt27eKEE06o/N41pREjRjB79my6dOlC586dOfXUU5v8M371q18xbtw47r33\nXgYMGMCRRx550FVOhcMOO4zXXnuNG2+8kfbt21dODqjN5MmTGTNmDHPnzmXEiBGVVyEvvvgit956\nK7m5ubRu3ZoHH3yQo446ijlz5jB27Fi+/PJLAH7zm9/U280ZL6vIWpmgsLDQo3yAUsXsm6rFfi1y\nmzFjdDcljYitXr2ak08+OdlhhLZr1y5atGiBmTF//nweeeQRnn766WSHVaMdO3ZUzuKaOXMmGzdu\n5Pbbb69nK6mwZ88ecnJyyMnJ4fXXX2fKlClfeZBbeXk5RxxxxFdmTyVaTT9HZrbU3Qtr2eQgusKI\nQ12V4UoYUtXSpUuZPHky7k6bNm2YO3duskOq1bPPPsuMGTMoLy/nuOOO47777kt2SGllw4YNnHPO\nOezbt49DDz2Ue+65J9khRUYJIw6qDJewBg4c+JV++1Q1duxYxo4dm+ww0ta3v/1tli9fXmebnJyc\n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\nAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1 5 5 ..., 2 1 1]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Launch the graph\n",
+ "with tf.Session() as session:\n",
+ " # Initializing the variables\n",
+ " session.run(tf.global_variables_initializer())\n",
+ " \n",
+ " cost_epochs = []\n",
+ " # Training cycle\n",
+ " for epoch in range(training_epochs):\n",
+ " _, summary, c = session.run(fetches=[optimizer, summary_op, cost], \n",
+ " feed_dict={x: X_train, y: Y_train})\n",
+ " cost_epochs.append(c)\n",
+ " writer.add_summary(summary=summary, global_step=epoch)\n",
+ " print(\"accuracy epoch {}:{}\".format(epoch, accuracy.eval({x: X_train, y: Y_train})))\n",
+ " \n",
+ " print(\"Training phase finished\")\n",
+ " \n",
+ " #plotting\n",
+ " plt.plot(range(len(cost_epochs)), cost_epochs, 'o', label='Logistic Regression Training phase')\n",
+ " plt.ylabel('cost')\n",
+ " plt.xlabel('epoch')\n",
+ " plt.legend()\n",
+ " plt.show()\n",
+ " \n",
+ " prediction = tf.argmax(activation, 1)\n",
+ " print(prediction.eval({x: X_test}))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Process is terminated.\n"
+ ]
+ }
+ ],
+ "source": [
+ "%%bash\n",
+ "python -m tensorflow.tensorboard --logdir=/tmp/logistic_logs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Using Keras"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.models import Sequential\n",
+ "from keras.layers import Dense, Activation"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "93 dims\n",
+ "Building model...\n",
+ "9 classes\n",
+ "Epoch 1/10\n",
+ "61878/61878 [==============================] - 5s - loss: 1.9928 \n",
+ "Epoch 2/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.8417 \n",
+ "Epoch 3/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.7851 \n",
+ "Epoch 4/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.7492 \n",
+ "Epoch 5/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.7235 \n",
+ "Epoch 6/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.7040 \n",
+ "Epoch 7/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.6886 \n",
+ "Epoch 8/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.6762 \n",
+ "Epoch 9/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.6661 \n",
+ "Epoch 10/10\n",
+ "61878/61878 [==============================] - 4s - loss: 1.6577 \n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dims = X_train.shape[1]\n",
+ "print(dims, 'dims')\n",
+ "print(\"Building model...\")\n",
+ "\n",
+ "nb_classes = Y_train.shape[1]\n",
+ "print(nb_classes, 'classes')\n",
+ "\n",
+ "model = Sequential()\n",
+ "model.add(Dense(nb_classes, input_shape=(dims,), activation='sigmoid'))\n",
+ "model.add(Activation('softmax'))\n",
+ "\n",
+ "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n",
+ "model.fit(X_train, Y_train)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Simplicity is pretty impressive, right? :)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Now lets understand:\n",
+ "- The core data structure of Keras is a model, a way to organize layers. \n",
+ "- The main type of model is the Sequential model, a linear stack of layers.\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "What we did here is stacking a Fully Connected (Dense) layer of trainable weights from the input to the output and an Activation layer on top of the weights layer."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "##### Dense"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "```python\n",
+ "from keras.layers.core import Dense\n",
+ "\n",
+ "Dense(units, activation=None, use_bias=True, \n",
+ " kernel_initializer='glorot_uniform', bias_initializer='zeros', \n",
+ " kernel_regularizer=None, bias_regularizer=None, \n",
+ " activity_regularizer=None, kernel_constraint=None, bias_constraint=None)\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "* `units`: int > 0.\n",
+ "\n",
+ "* `kernel_initializer`: Initializer for the kernel weights matrix.\n",
+ "\n",
+ "* `bias_initializer`: Initializer for the bias vector.\n",
+ "\n",
+ "* `activation`: name of activation function to use. If you don't specify anything, no activation is applied (ie. \"linear\" activation: `a(x) = x`).\n",
+ "\n",
+ "* `weights`: list of Numpy arrays to set as initial weights. The list should have 2 elements, of shape (input_dim, output_dim) and (output_dim,) for weights and biases respectively.\n",
+ "\n",
+ "* `kernel_regularizer`: Regulariser function (eg. L1 or L2 regularization), applied to the `kernel` weights matrix.\n",
+ "\n",
+ "* `bias_regularizer`: Regulariser function applied to the bias vector.\n",
+ "\n",
+ "* `activity_regularizer`: Regularizer function applied to the output of the layer (its \"activation\").\n",
+ "\n",
+ "* `kernel_constraint`: Constraint function applied to the main weights matrix.\n",
+ "\n",
+ "* `bias_constraint`: Constraint function applied to the bias.\n",
+ "\n",
+ "* `use_bias`: whether to include a bias (i.e. make the layer affine rather than linear)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Input and Output Shapes\n",
+ "\n",
+ "##### Input shape\n",
+ "\n",
+ "`nD` tensor with shape: `(batch_size, ..., input_dim)`. The most common situation would be a 2D input with shape `(batch_size, input_dim)`.\n",
+ "\n",
+ "##### Output shape\n",
+ "\n",
+ "`nD` tensor with shape: `(batch_size, ..., units)`. For instance, for a 2D input with shape `(batch_size, input_dim)`, the output would have shape `(batch_size, units)`."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Notes about `*_initializers`\n",
+ "\n",
+ "Weight initialization can critically affect the speed at which a neural network is able to learn. Under certain circumstances, a poor initialization of weights can prevent a neural network from learning anything.\n",
+ "\n",
+ "For further details, please refer to this super interesting article from NVIDIA DIGITS: [Weights Initialisers](https://github.com/NVIDIA/DIGITS/blob/master/examples/weight-init/README.md)\n",
+ "\n",
+ "Keras supports different initialisation strategies: [`keras.initializers`](https://keras.io/initializers/).\n",
+ "\n",
+ "\n",
+ "#### Some Recommended Papers:\n",
+ "\n",
+ "[1] Bengio, Yoshua. [\"Practical recommendations for gradient-based training of deep architectures.\"](http://arxiv.org/abs/1206.5533) Neural Networks: Tricks of the Trade. Springer Berlin Heidelberg, 2012. 437-478.\n",
+ "\n",
+ "[2] LeCun, Y., Bottou, L., Orr, G. B., and Muller, K. (1998a). [Efficient backprop. In Neural Networks](https://scholar.google.com/scholar?cluster=1366432119558306638&hl=en&as_sdt=0,22), Tricks of the Trade.\n",
+ "\n",
+ "[3] Glorot, Xavier, and Yoshua Bengio. [\"Understanding the difficulty of training deep feedforward neural networks.\"](https://scholar.google.com/scholar?cluster=17889055433985220047&hl=en&as_sdt=0,22) International conference on artificial intelligence and statistics. 2010."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## (some) others `keras.core.layers`"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "* `keras.layers.core.Flatten()`\n",
+ "* `keras.layers.core.Reshape(target_shape)`\n",
+ "* `keras.layers.core.Permute(dims)`\n",
+ "\n",
+ "```python\n",
+ "model = Sequential()\n",
+ "model.add(Permute((2, 1), input_shape=(10, 64)))\n",
+ "# now: model.output_shape == (None, 64, 10)\n",
+ "# note: `None` is the batch dimension\n",
+ "```\n",
+ "\n",
+ "* `keras.layers.core.Lambda(function, output_shape=None, arguments=None)`\n",
+ "* `keras.layers.core.ActivityRegularization(l1=0.0, l2=0.0)`"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "Credits: Yam Peleg ([@Yampeleg](https://twitter.com/yampeleg))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Activation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "```python\n",
+ "from keras.layers.core import Activation\n",
+ "\n",
+ "Activation(activation)\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Supported Activations** : [https://keras.io/activations/]\n",
+ "\n",
+ "**Advanced Activations**: [https://keras.io/layers/advanced-activations/]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Optimizer"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you need to, you can further configure your optimizer. A core principle of Keras is to make things reasonably simple, while allowing the user to be fully in control when they need to (the ultimate control being the easy extensibility of the source code).\n",
+ "Here we used SGD (stochastic gradient descent) as an optimization algorithm for our trainable weights. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "Source & Reference: http://sebastianruder.com/content/images/2016/09/saddle_point_evaluation_optimizers.gif"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\"Data Sciencing\" this example a little bit more\n",
+ "====="
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "What we did here is nice, however in the real world it is not useable because of overfitting.\n",
+ "Lets try and solve it with cross validation."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Overfitting"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In overfitting, a statistical model describes random error or noise instead of the underlying relationship. Overfitting occurs when a model is excessively complex, such as having too many parameters relative to the number of observations. \n",
+ "\n",
+ "A model that has been overfit has poor predictive performance, as it overreacts to minor fluctuations in the training data."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To avoid overfitting, we will first split out data to training set and test set and test out model on the test set.\n",
+ "Next: we will use two of keras's callbacks EarlyStopping and ModelCheckpoint
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's see first the model we implemented"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "dense_1 (Dense) (None, 9) 846 \n",
+ "_________________________________________________________________\n",
+ "activation_1 (Activation) (None, 9) 0 \n",
+ "=================================================================\n",
+ "Total params: 846\n",
+ "Trainable params: 846\n",
+ "Non-trainable params: 0\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "from keras.callbacks import EarlyStopping, ModelCheckpoint"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 52596 samples, validate on 9282 samples\n",
+ "Epoch 1/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6547 - val_loss: 1.6514\n",
+ "Epoch 2/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6532 - val_loss: 1.6499\n",
+ "Epoch 3/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6517 - val_loss: 1.6485\n",
+ "Epoch 4/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6503 - val_loss: 1.6471\n",
+ "Epoch 5/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6489 - val_loss: 1.6457\n",
+ "Epoch 6/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6476 - val_loss: 1.6444\n",
+ "Epoch 7/50\n",
+ "52596/52596 [==============================] - 1s - loss: 1.6462 - val_loss: 1.6431\n",
+ "Epoch 8/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6450 - val_loss: 1.6418\n",
+ "Epoch 9/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6437 - val_loss: 1.6406\n",
+ "Epoch 10/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6425 - val_loss: 1.6394\n",
+ "Epoch 11/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6413 - val_loss: 1.6383\n",
+ "Epoch 12/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6402 - val_loss: 1.6371\n",
+ "Epoch 13/50\n",
+ "52596/52596 [==============================] - 1s - loss: 1.6391 - val_loss: 1.6361\n",
+ "Epoch 14/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6380 - val_loss: 1.6350\n",
+ "Epoch 15/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6370 - val_loss: 1.6340\n",
+ "Epoch 16/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6360 - val_loss: 1.6330\n",
+ "Epoch 17/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6350 - val_loss: 1.6321\n",
+ "Epoch 18/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6340 - val_loss: 1.6311\n",
+ "Epoch 19/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6331 - val_loss: 1.6302\n",
+ "Epoch 20/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6322 - val_loss: 1.6294\n",
+ "Epoch 21/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6314 - val_loss: 1.6285\n",
+ "Epoch 22/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6305 - val_loss: 1.6277\n",
+ "Epoch 23/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6297 - val_loss: 1.6269\n",
+ "Epoch 24/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6289 - val_loss: 1.6261\n",
+ "Epoch 25/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6281 - val_loss: 1.6253\n",
+ "Epoch 26/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6274 - val_loss: 1.6246\n",
+ "Epoch 27/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6266 - val_loss: 1.6239\n",
+ "Epoch 28/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6259 - val_loss: 1.6232\n",
+ "Epoch 29/50\n",
+ "52596/52596 [==============================] - 1s - loss: 1.6252 - val_loss: 1.6225\n",
+ "Epoch 30/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6245 - val_loss: 1.6218\n",
+ "Epoch 31/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6239 - val_loss: 1.6212\n",
+ "Epoch 32/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6232 - val_loss: 1.6205\n",
+ "Epoch 33/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6226 - val_loss: 1.6199\n",
+ "Epoch 34/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6219 - val_loss: 1.6193\n",
+ "Epoch 35/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6213 - val_loss: 1.6187\n",
+ "Epoch 36/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6207 - val_loss: 1.6181\n",
+ "Epoch 37/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6202 - val_loss: 1.6176\n",
+ "Epoch 38/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6196 - val_loss: 1.6170\n",
+ "Epoch 39/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6190 - val_loss: 1.6165\n",
+ "Epoch 40/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6185 - val_loss: 1.6159\n",
+ "Epoch 41/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6179 - val_loss: 1.6154\n",
+ "Epoch 42/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6174 - val_loss: 1.6149\n",
+ "Epoch 43/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6169 - val_loss: 1.6144\n",
+ "Epoch 44/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6164 - val_loss: 1.6139\n",
+ "Epoch 45/50\n",
+ "52596/52596 [==============================] - 1s - loss: 1.6159 - val_loss: 1.6134\n",
+ "Epoch 46/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6154 - val_loss: 1.6130\n",
+ "Epoch 47/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6149 - val_loss: 1.6125\n",
+ "Epoch 48/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6145 - val_loss: 1.6120\n",
+ "Epoch 49/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6140 - val_loss: 1.6116\n",
+ "Epoch 50/50\n",
+ "52596/52596 [==============================] - 0s - loss: 1.6136 - val_loss: 1.6112\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size=0.15, random_state=42)\n",
+ "\n",
+ "fBestModel = 'best_model.h5' \n",
+ "early_stop = EarlyStopping(monitor='val_loss', patience=2, verbose=1) \n",
+ "best_model = ModelCheckpoint(fBestModel, verbose=0, save_best_only=True)\n",
+ "\n",
+ "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=50, \n",
+ " batch_size=128, verbose=True, callbacks=[best_model, early_stop]) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Multi-Layer Fully Connected Networks"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Forward and Backward Propagation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Q:** _How hard can it be to build a Multi-Layer Fully-Connected Network with keras?_\n",
+ "\n",
+ "**A:** _It is basically the same, just add more layers!_"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "dense_2 (Dense) (None, 100) 9400 \n",
+ "_________________________________________________________________\n",
+ "dense_3 (Dense) (None, 9) 909 \n",
+ "_________________________________________________________________\n",
+ "activation_2 (Activation) (None, 9) 0 \n",
+ "=================================================================\n",
+ "Total params: 10,309\n",
+ "Trainable params: 10,309\n",
+ "Non-trainable params: 0\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "model = Sequential()\n",
+ "model.add(Dense(100, input_shape=(dims,)))\n",
+ "model.add(Dense(nb_classes))\n",
+ "model.add(Activation('softmax'))\n",
+ "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n",
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 52596 samples, validate on 9282 samples\n",
+ "Epoch 1/20\n",
+ "52596/52596 [==============================] - 1s - loss: 1.1979 - val_loss: 0.8706\n",
+ "Epoch 2/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.8248 - val_loss: 0.7727\n",
+ "Epoch 3/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.7633 - val_loss: 0.7333\n",
+ "Epoch 4/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.7334 - val_loss: 0.7105\n",
+ "Epoch 5/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.7150 - val_loss: 0.6960\n",
+ "Epoch 6/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.7021 - val_loss: 0.6850\n",
+ "Epoch 7/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6927 - val_loss: 0.6775\n",
+ "Epoch 8/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6854 - val_loss: 0.6713\n",
+ "Epoch 9/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6794 - val_loss: 0.6659\n",
+ "Epoch 10/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6747 - val_loss: 0.6623\n",
+ "Epoch 11/20\n",
+ "52596/52596 [==============================] - 1s - loss: 0.6706 - val_loss: 0.6591\n",
+ "Epoch 12/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6672 - val_loss: 0.6556\n",
+ "Epoch 13/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6644 - val_loss: 0.6535\n",
+ "Epoch 14/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6619 - val_loss: 0.6512\n",
+ "Epoch 15/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6597 - val_loss: 0.6499\n",
+ "Epoch 16/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6578 - val_loss: 0.6479\n",
+ "Epoch 17/20\n",
+ "52596/52596 [==============================] - 1s - loss: 0.6560 - val_loss: 0.6462\n",
+ "Epoch 18/20\n",
+ "52596/52596 [==============================] - 1s - loss: 0.6545 - val_loss: 0.6456\n",
+ "Epoch 19/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6531 - val_loss: 0.6442\n",
+ "Epoch 20/20\n",
+ "52596/52596 [==============================] - 0s - loss: 0.6518 - val_loss: 0.6432\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 22,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n",
+ " batch_size=128, verbose=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Your Turn!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Hands On - Keras Fully Connected\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Take couple of minutes and try to play with the number of layers and the number of parameters in the layers to get the best results. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "model = Sequential()\n",
+ "model.add(Dense(100, input_shape=(dims,)))\n",
+ "\n",
+ "# ...\n",
+ "# ...\n",
+ "# Play with it! add as much layers as you want! try and get better results.\n",
+ "\n",
+ "model.add(Dense(nb_classes))\n",
+ "model.add(Activation('softmax'))\n",
+ "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n",
+ "\n",
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n",
+ " batch_size=128, verbose=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Building a question answering system, an image classification model, a Neural Turing Machine, a word2vec embedder or any other model is just as fast. The ideas behind deep learning are simple, so why should their implementation be painful?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Theoretical Motivations for depth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ">Much has been studied about the depth of neural nets. Is has been proven mathematically[1] and empirically that convolutional neural network benifit from depth! "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "[1] - On the Expressive Power of Deep Learning: A Tensor Analysis - Cohen, et al 2015"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Theoretical Motivations for depth"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "One much quoted theorem about neural network states that:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ">Universal approximation theorem states[1] that a feed-forward network with a single hidden layer containing a finite number of neurons (i.e., a multilayer perceptron), can approximate continuous functions on compact subsets of $\\mathbb{R}^n$, under mild assumptions on the activation function. The theorem thus states that simple neural networks can represent a wide variety of interesting functions when given appropriate parameters; however, it does not touch upon the algorithmic learnability of those parameters."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "[1] - Approximation Capabilities of Multilayer Feedforward Networks - Kurt Hornik 1991"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Addendum\n",
+ "\n",
+ "[1.1 Keras Backend](1.1 Keras Backend.ipynb)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python [default]",
+ "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.5.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/1.1 Keras Backend.ipynb b/1.1 Keras Backend.ipynb
new file mode 100644
index 0000000..1fd157a
--- /dev/null
+++ b/1.1 Keras Backend.ipynb
@@ -0,0 +1,492 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Keras Backend\n",
+ "\n",
+ "In this notebook we will be using the [Keras backend module](http://keras.io/backend/), which provides an abstraction over both Theano and Tensorflow."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's try to re-implement the Logistic Regression Model using the `keras.backend` APIs.\n",
+ "\n",
+ "The following code will look like very similar to what we would write in Theano or Tensorflow (with the *only difference* that it may run on both the two backends)."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Using TensorFlow backend.\n"
+ ]
+ }
+ ],
+ "source": [
+ "import keras.backend as K\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from kaggle_data import load_data, preprocess_data, preprocess_labels"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "9 classes\n",
+ "93 features\n"
+ ]
+ }
+ ],
+ "source": [
+ "X_train, labels = load_data('data/kaggle_ottogroup/train.csv', train=True)\n",
+ "X_train, scaler = preprocess_data(X_train)\n",
+ "Y_train, encoder = preprocess_labels(labels)\n",
+ "\n",
+ "X_test, ids = load_data('data/kaggle_ottogroup/test.csv', train=False)\n",
+ "\n",
+ "X_test, _ = preprocess_data(X_test, scaler)\n",
+ "\n",
+ "nb_classes = Y_train.shape[1]\n",
+ "print(nb_classes, 'classes')\n",
+ "\n",
+ "dims = X_train.shape[1]\n",
+ "print(dims, 'features')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "feats = dims\n",
+ "training_steps = 25"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "x = K.placeholder(dtype=\"float\", shape=X_train.shape) \n",
+ "target = K.placeholder(dtype=\"float\", shape=Y_train.shape)\n",
+ "\n",
+ "# Set model weights\n",
+ "W = K.variable(np.random.rand(dims, nb_classes))\n",
+ "b = K.variable(np.random.rand(nb_classes))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Define model and loss\n",
+ "y = K.dot(x, W) + b\n",
+ "loss = K.categorical_crossentropy(y, target)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "activation = K.softmax(y) # Softmax"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "lr = K.constant(0.01)\n",
+ "grads = K.gradients(loss, [W,b])\n",
+ "updates = [(W, W-lr*grads[0]), (b, b-lr*grads[1])]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "train = K.function(inputs=[x, target], outputs=[loss], updates=updates)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Loss: [ -498.89337158 -1137.16247559 -410.74249268 ..., 61.32589722\n",
+ " -1150.31567383 -178.36450195]\n",
+ "Loss: [-26216156. -27188296. -29494026. ..., -25988334. -26679148. -28535620.]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Training\n",
+ "loss_history = []\n",
+ "for epoch in range(training_steps):\n",
+ " current_loss = train([X_train, Y_train])[0]\n",
+ " loss_history.append(current_loss)\n",
+ " if epoch % 20 == 0:\n",
+ " print(\"Loss: {}\".format(current_loss))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "loss_history = [np.mean(lh) for lh in loss_history]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n9++Pnu688MIL+eMf/8i8efO4/vrruffeezn22GMZPHgwzz//fLNqOhLdq6oJknnuXJoumWNXffr0\nYdasWQDMnDmT/v37A3Deeefx+9//HiD6/uE2b97MmWeeyZ133smwYcNYvXo1bdu2bfBKn4EDBzJt\n2rToXyyff/55o7WNGTOGr7/+mgULFtC1a1d27NgRbRz79++noqKC3Nxc2rZtGz1/3lCtEL4K6Zln\nnmHPnj1A+Fz79u3b2bp1K8ceeyzXXXcdY8eOZcWKFezZs4ddu3YxZMgQHn30UVatWnXIuk444QRO\nPPHE6PjF888/Hz36aEm7du2iXbt25OTkUFFRwfLly1t8G3379uWVV14BYP78+Q1+fzU1NdGj0xdf\nfPGIRwS7du2iY8eOmBkzZsyg9qmtn376KaeeeiqjR4/mpptuYuXKlfTp04d3332XzZs3A+Fxp5a4\nKOJwahxNoNxHekjU2NXevXvJz8+P/kydOpXHH3+c3/72t4RCIZ5//vnoeeXHHnuMqVOnEgqF2Lhx\nIyeccMK/re+VV16hoKCA4uJi1q5dy/XXX89JJ51E3759KSgoYOzYsYcsf+utt9K5c2dCoRBFRUW8\n+OKLjdZrZkycOJGf//znHH300cyePZtx48ZRVFREcXFxdFD16aef5gc/+AHFxcV88cUX9dYKcPHF\nFzNq1Ch69+5NYWEhI0eOZPfu3axZsyY6yP/ggw8yceJEdu/ezdChQwmFQvTr1y86HlDXjBkzGDt2\nLKFQiPLycu6///6Yvod4XHrppezdu5du3boxceJEzj23xXPEPPjgg8ybN4+CggLmzp3LKaeccshR\nT60TTjiB9957j+7du7N06dJ6x33qGjNmDE899RRFRUV88skn0aOSxYsXU1RURI8ePXj11Ve54447\n6NChA08//TRXXXUVRUVF9OnTJzp435Iy8pnjJSUlnsgHOXUZP4/6/tQM+GTypQnbrsC6dev49re/\nHXQZMdu7dy85OTmYGbNmzeKll17i9ddfD7qseu3Zsyd6GmTy5Mls27YtIQOrmWrfvn20bt2a1q1b\ns3TpUu6+++5/e6BcTU0NJ5988hFPDSZaff8fmVmZu5c08JFDZEyOI5nS5dy5BK+srIwxY8bg7uTm\n5vLMM88EXVKD5s2bx6RJk6ipqeH000/n2WefDbqktLJlyxauueYaDhw4wDHHHMO0adOCLilhdMTR\n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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# plotting\n",
+ "plt.plot(range(len(loss_history)), loss_history, 'o', label='Logistic Regression Training phase')\n",
+ "plt.ylabel('cost')\n",
+ "plt.xlabel('epoch')\n",
+ "plt.legend()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Your Turn\n",
+ "\n",
+ "Please switch to the **Theano** backend and **restart** the notebook.\n",
+ "\n",
+ "You _should_ see no difference in the execution!\n",
+ "\n",
+ "**Reminder**: please keep in mind that you *can* execute shell commands from a notebook (pre-pending a `!` sign).\n",
+ "Thus:\n",
+ "\n",
+ "```shell\n",
+ " !cat ~/.keras/keras.json\n",
+ "```\n",
+ "should show you the content of your keras configuration file."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "### Moreover\n",
+ "\n",
+ "Try to play a bit with the **learning reate** parameter to see how the loss history floats... "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercise: Linear Regression\n",
+ "To get familiar with automatic differentiation, we start by learning a simple linear regression model using Stochastic Gradient Descent (SGD).\n",
+ "\n",
+ "Recall that given a dataset $\\{(x_i, y_i)\\}_{i=0}^N$, with $x_i, y_i \\in \\mathbb{R}$, the objective of linear regression is to find two scalars $w$ and $b$ such that $y = w\\cdot x + b$ fits the dataset. In this tutorial we will learn $w$ and $b$ using SGD and a Mean Square Error (MSE) loss:\n",
+ "\n",
+ "$$\\mathcal{l} = \\frac{1}{N} \\sum_{i=0}^N (w\\cdot x_i + b - y_i)^2$$\n",
+ "\n",
+ "Starting from random values, parameters $w$ and $b$ will be updated at each iteration via the following rule:\n",
+ "\n",
+ "$$w_t = w_{t-1} - \\eta \\frac{\\partial \\mathcal{l}}{\\partial w}$$\n",
+ "
\n",
+ "$$b_t = b_{t-1} - \\eta \\frac{\\partial \\mathcal{l}}{\\partial b}$$\n",
+ "\n",
+ "where $\\eta$ is the learning rate.\n",
+ "\n",
+ "**NOTE:** Recall that **linear regression** is indeed a **simple neuron** with a linear activation function!!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Definition: Placeholders and Variables"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First of all, we define the necessary variables and placeholders for our computational graph. Variables maintain state across executions of the computational graph, while placeholders are ways to feed the graph with external data.\n",
+ "\n",
+ "For the linear regression example, we need three variables: `w`, `b`, and the learning rate for SGD, `lr`. \n",
+ "\n",
+ "Two placeholders `x` and `target` are created to store $x_i$ and $y_i$ values."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Placeholders and variables\n",
+ "x = K.placeholder()\n",
+ "target = K.placeholder()\n",
+ "w = K.variable(np.random.rand())\n",
+ "b = K.variable(np.random.rand())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Notes:\n",
+ "\n",
+ "In case you're wondering what's the difference between a **placeholder** and a **variable**, in short:\n",
+ "\n",
+ "* Use `K.variable()` for trainable variables such as weights (`W`) and biases (`b`) for your model.\n",
+ "* Use `K.placeholder()` to feed actual data (e.g. training examples)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "## Model definition\n",
+ "Now we can define the $y = w\\cdot x + b$ relation as well as the MSE loss in the computational graph."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Define model and loss"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol11.py"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Then, given the gradient of MSE wrt to `w` and `b`, we can define how we update the parameters via SGD:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol12.py"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The whole model can be encapsulated in a `function`, which takes as input `x` and `target`, returns the current loss value and updates its parameter according to `updates`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "train = K.function(inputs=[x, target], outputs=[loss], updates=updates)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Training\n",
+ "Training is now just a matter of calling the `function` we have just defined. Each time `train` is called, indeed, `w` and `b` will be updated using the SGD rule.\n",
+ "\n",
+ "Having generated some random training data, we will feed the `train` function for several epochs and observe the values of `w`, `b`, and loss."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Generate data\n",
+ "np_x = np.random.rand(1000)\n",
+ "np_target = 0.96*np_x + 0.24"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# Training\n",
+ "loss_history = []\n",
+ "for epoch in range(200):\n",
+ " current_loss = train([np_x, np_target])[0]\n",
+ " loss_history.append(current_loss)\n",
+ " if epoch % 20 == 0:\n",
+ " print(\"Loss: %.03f, w, b: [%.02f, %.02f]\" % (current_loss, K.eval(w), K.eval(b)))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can also plot the loss history:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "### Plot loss history"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol13.py"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Final Note:\n",
+ "\n",
+ "Please switch back your backend to `tensorflow` before moving on. It may be useful for next notebooks !-)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python [default]",
+ "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.5.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/1.1 Introduction - Deep Learning and ANN.ipynb b/1.1 Introduction - Deep Learning and ANN.ipynb
deleted file mode 100644
index 19e169d..0000000
--- a/1.1 Introduction - Deep Learning and ANN.ipynb
+++ /dev/null
@@ -1,1948 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "24ca50a0-b9ad-425d-a28f-6bd3ca3ac378"
- },
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Introduction to Deep Learning"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "3896ecb2-47fa-4dbc-a2ff-9c76e9dfe93e"
- },
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Deep learning allows computational models that are composed of multiple processing **layers** to learn representations of data with multiple levels of abstraction."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "8c3060aa-fee9-438c-bc60-4685c0eb4750"
- },
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "These methods have dramatically improved the state-of-the-art in speech recognition, visual object recognition, object detection and many other domains such as drug discovery and genomics. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "6287766f-972f-4b4d-bee7-5418f0af74de"
- },
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "**Deep learning** is one of the leading tools in data analysis these days and one of the most common frameworks for deep learning is **Keras**. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "2f1c6299-954a-461a-b5c1-a86a1d12ad15"
- },
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "The Tutorial will provide an introduction to deep learning using `keras` with practical code examples."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "## This Section will cover:\n",
- "\n",
- "* Getting a conceptual understanding of multi-layer neural networks\n",
- "* Training neural networks for image classification\n",
- "* Implementing the powerful backpropagation algorithm\n",
- "* Debugging neural network implementations"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "5e13607b-3ec5-4a95-a2d8-f898f20748da"
- },
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Building Blocks: Artificial Neural Networks (ANN)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "4fa2e86a-be32-4e78-96d9-f511a07e3908"
- },
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "In machine learning and cognitive science, an artificial neural network (ANN) is a network inspired by biological neural networks which are used to estimate or approximate functions that can depend on a large number of inputs that are generally unknown"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "df0121bc-10f1-4ace-840e-6fc89c6fdc7f"
- },
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "An ANN is built from nodes (neurons) stacked in layers between the feature vector and the target vector. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "c25d7194-10bd-4196-9d4c-592bf6e188f9"
- },
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "A node in a neural network is built from Weights and Activation function"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "15260f90-13d1-4fcc-afc6-379c507cb950"
- },
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "An early version of ANN built from one node was called the **Perceptron**"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "92d4603e-7e39-4156-818c-785df6189fe8"
- },
- "slideshow": {
- "slide_type": "-"
- }
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "356d5ec7-3392-4daa-9671-4cc7111c5c91"
- },
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "The Perceptron is an algorithm for supervised learning of binary classifiers. functions that can decide whether an input (represented by a vector of numbers) belongs to one class or another.\n",
- "\n",
- "Much like logistic regression, the weights in a neural net are being multiplied by the input vertor summed up and feeded into the activation function's input."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "A Perceptron Network can be designed to have *multiple layers*, leading to the **Multi-Layer Perceptron** (aka `MLP`)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Single Layer Neural Network"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "\n",
- "\n",
- "_(Source: Python Machine Learning, S. Raschka)_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Weights Update Rule"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "- We use a **gradient descent** optimization algorithm to learn the _Weights Coefficients_ of the model.\n",
- "
\n",
- "- In every **epoch** (pass over the training set), we update the weight vector $w$ using the following update rule:\n",
- "\n",
- "$$\n",
- "w = w + \\Delta w, \\text{where } \\Delta w = - \\eta \\nabla J(w)\n",
- "$$\n",
- "\n",
- "
\n",
- "\n",
- "In other words, we computed the gradient based on the whole training set and updated the weights of the model by taking a step into the **opposite direction** of the gradient $ \\nabla J(w)$. \n",
- "\n",
- "In order to fin the **optimal weights of the model**, we optimized an objective function (e.g. the Sum of Squared Errors (SSE)) cost function $J(w)$. \n",
- "\n",
- "Furthermore, we multiply the gradient by a factor, the learning rate $\\eta$ , which we choose carefully to balance the **speed of learning** against the risk of overshooting the global minimum of the cost function."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Gradient Descent"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "In **gradient descent optimization**, we update all the **weights simultaneously** after each epoch, and we define the _partial derivative_ for each weight $w_j$ in the weight vector $w$ as follows:\n",
- "\n",
- "$$\n",
- "\\frac{\\partial}{\\partial w_j} J(w) = \\sum_{i} ( y^{(i)} - a^{(i)} ) x^{(i)}_j\n",
- "$$\n",
- "\n",
- "**Note**: _The superscript $(i)$ refers to the ith sample. The subscript $j$ refers to the jth dimension/feature_\n",
- "\n",
- "\n",
- "Here $y^{(i)}$ is the target class label of a particular sample $x^{(i)}$ , and $a^{(i)}$ is the **activation** of the neuron \n",
- "\n",
- "(which is a linear function in the special case of _Perceptron_)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We define the **activation function** $\\phi(\\cdot)$ as follows:\n",
- "\n",
- "$$\n",
- "\\phi(z) = z = a = \\sum_{j} w_j x_j = \\mathbf{w}^T \\mathbf{x}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Binary Classification"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "While we used the **activation** $\\phi(z)$ to compute the gradient update, we may use a **threshold function** _(Heaviside function)_ to squash the continuous-valued output into binary class labels for prediction:\n",
- "\n",
- "$$\n",
- "\\hat{y} = \n",
- "\\begin{cases}\n",
- " 1 & \\text{if } \\phi(z) \\geq 0 \\\\\n",
- " 0 & \\text{otherwise}\n",
- "\\end{cases}\n",
- "$$"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "## Building Neural Nets from scratch \n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Idea:\n",
- "\n",
- "We will build the neural networks from first principles. \n",
- "We will create a very simple model and understand how it works. We will also be implementing backpropagation algorithm. \n",
- "\n",
- "**Please note that this code is not optimized and not to be used in production**. \n",
- "\n",
- "This is for instructive purpose - for us to understand how ANN works. \n",
- "\n",
- "Libraries like `theano` have highly optimized code."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Perceptron and Adaline Models\n",
- "\n",
- "Take a look at this notebook : Perceptron and Adaline "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If you want a sneak peek of alternate (production ready) implementation of _Perceptron_ for instance try:\n",
- "```python\n",
- "from sklearn.linear_model import Perceptron\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Introducing the multi-layer neural network architecture"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "_(Source: Python Machine Learning, S. Raschka)_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we will see how to connect **multiple single neurons** to a **multi-layer feedforward neural network**; this special type of network is also called a **multi-layer perceptron** (MLP). \n",
- "\n",
- "The figure shows the concept of an **MLP** consisting of three layers: one _input_ layer, one _hidden_ layer, and one _output_ layer. \n",
- "\n",
- "The units in the hidden layer are fully connected to the input layer, and the output layer is fully connected to the hidden layer, respectively. \n",
- "\n",
- "If such a network has **more than one hidden layer**, we also call it a **deep artificial neural network**.\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Notation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "we denote the `ith` activation unit in the `lth` layer as $a_i^{(l)}$ , and the activation units $a_0^{(1)}$ and \n",
- "$a_0^{(2)}$ are the **bias units**, respectively, which we set equal to $1$. \n",
- "
\n",
- "The _activation_ of the units in the **input layer** is just its input plus the bias unit:\n",
- "\n",
- "$$\n",
- "\\mathbf{a}^{(1)} = [a_0^{(1)}, a_1^{(1)}, \\ldots, a_m^{(1)}]^T = [1, x_1^{(i)}, \\ldots, x_m^{(i)}]^T\n",
- "$$\n",
- "
\n",
- "**Note**: $x_j^{(i)}$ refers to the jth feature/dimension of the ith sample"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Notes on Notation (usually) Adopted\n",
- "\n",
- "The terminology around the indices (subscripts and superscripts) may look a little bit confusing at first. \n",
- "
\n",
- "\n",
- "You may wonder why we wrote $w_{j,k}^{(l)}$ and not $w_{k,j}^{(l)}$ to refer to \n",
- "the **weight coefficient** that connects the *kth* unit in layer $l$ to the jth unit in layer $l+1$. \n",
- "
\n",
- "\n",
- "What may seem a little bit quirky at first will make much more sense later when we **vectorize** the neural network representation. \n",
- "
\n",
- "\n",
- "For example, we will summarize the weights that connect the input and hidden layer by a matrix \n",
- "$$ W^{(1)} \\in \\mathbb{R}^{h×[m+1]}$$\n",
- "\n",
- "where $h$ is the number of hidden units and $m + 1$ is the number of hidden units plus bias unit. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "_(Source: Python Machine Learning, S. Raschka)_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Forward Propagation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "* Starting at the input layer, we forward propagate the patterns of the training data through the network to generate an output.\n",
- "\n",
- "* Based on the network's output, we calculate the error that we want to minimize using a cost function that we will describe later.\n",
- "\n",
- "* We backpropagate the error, find its derivative with respect to each weight in the network, and update the model."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Sigmoid Activation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "_(Source: Python Machine Learning, S. Raschka)_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "_(Source: Python Machine Learning, S. Raschka)_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "_(Source: Python Machine Learning, S. Raschka)_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Backward Propagation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "nbpresent": {
- "id": "5678486b-caf4-440b-be62-2f1286982c71"
- },
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "The weights of each neuron are learned by **gradient descent**, where each neuron's error is derived with respect to it's weight."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "\n",
- "_(Source: Python Machine Learning, S. Raschka)_"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Optimization is done for each layer with respect to the previous layer in a technique known as **BackPropagation**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "(*The following code is inspired from [these](https://github.com/dennybritz/nn-from-scratch) terrific notebooks*)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "# Import the required packages\n",
- "import numpy as np\n",
- "import pandas as pd\n",
- "import matplotlib\n",
- "import matplotlib.pyplot as plt\n",
- "import scipy"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "# Display plots in notebook \n",
- "%matplotlib inline\n",
- "# Define plot's default figure size\n",
- "matplotlib.rcParams['figure.figsize'] = (10.0, 8.0)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "#read the datasets\n",
- "train = pd.read_csv(\"data/intro_to_ann.csv\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "X, y = np.array(train.ix[:,0:2]), np.array(train.ix[:,2])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(500, 2)"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(500,)"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "y.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n0tHRoeTkZEm9rKwssra2pnHjJ1BMQiLFPXxEU6ZNJwsLC4qLi6P2Li5kYmJCrm5upKurS/369aM/\n//yTrK2tqVq1aqSurk4TJkygnJycz/jW3q+wsJAuXLhAR44ckYpZXunp6RQTE1NkbGKxmC5evEhT\np04lXV1dmvPLL5SSlk7pOSLatGUL6erqUmJi4id+CsbYl+ifvKXo/EaeSqX14mSLlbb2Li7kM3o0\npaSlk6igkG7dvUfWNja0ffv2z+r3xo0bZGtnJ5UovXsZGhrS48ePi+zj0KFDZGhoSDv9/enRs+cU\ndCKYGjRsSAsXLpQ7joEDB9LSFStlYvhu4EBavny5pN6GDRvIvWtXmXqe/fuTnV0jGjt+PGW+ySVR\nQSGlZmaRQ6tWpKenR8Ghpygnv4DuP3hIPT08qHefPp/0fX1IREQE1alTh2zt7Khjp06krq5Os2fP\nJrFYXGRbkUhEo0ePJnV1dbKsXZu0tLRo9uzZVFhYKFO3oKCAvLy8qHadOjRtxk/kNXAgaWhokKqq\nKlWtWpW+/fZbunbtWol+NsZY+cfJFmNFiIiIIFNTU8rKzZNKMEJOnaaGDRt+Vt8vXrwgDQ0NSn6d\nJtV3/KMk0tDQkJplEYvFFBUVRffu3ZNJIkJCQsjZ2Zm0tbWpadOmtGPHDrkSjXecnZ1lZsdEBYXk\nu/hX+uGHHyT1hgwZQus3bZKpt3LtWqpRsya9zsqWKm/StCkdOBwgVZaWnUP6+vp069Yt+umnn8jQ\n0JAqV65M7V1c6NKlS8X+Dt+8eUMmJia0/Y8/KCe/gEQFhfTgyVNqaGtLf/75Z5Hthw0bRl27d6dH\nz56TqKCQouMTyN7egby8vKhHz57U3sWFFi5cSK9fv6Zt27aRQytHqc95L/Y+aWpqUmRkZLFjZ4x9\nHeRNtnjPFvtq3b9/H02bNUPFihWlylvY2yM2Nvaz+tbT00OXLl0w8ftxyMnJAfD2NPXvR4/CkCFD\noKamBgAICwtDw4YN4erqCrfOnWFjYyP1pGHHjh1x9uxZvHz5EtevX8fgwYOLdf1QkyZN3nuB8+nQ\nk2jatKlUvAnxCTL17kbegbGxsdQxBAAQde8enNu1kypTVVVFK0dHDBs+HJF37yL41Gk8TXmJfl5e\n6N69O65duyZ33MDbAz7r1rNCv/5eks+sr6+PefMXYOPGjR9tm5ycjIMHD2Lztu3Q1dUFAJiZmaGe\n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\nt22T+V4dWjnSH3/8QT///DPZOziQS4cO9Pvvv0sdxhoWFkbWNjb07OUr2n/4MAWdCKb0HBHdvhdF\n1WvUoJkzZ1JSUtJ7Yzp79iyZmprSnegYyZhHj58gHR0dSklJKfZ3FRkZSU2aNCFTU1Nq0LAhGRoa\n0q5duz7aZvz48TL/TWWI3lA9KysKPXOWsvPyqUqVKtSjZ89ix1NW5efnk7+/P3n07k29PDzozz//\npPz8fGWHxVi5B34akZUHQ4YMkTnx/d9Pzj148ODt3YDrN1Badg49e/mKps34ierWrUs5OTnKDl+h\nsrOz6fHjx9SkSRPaumOH1He0cs1aatu2rdx9Xbt2jewaNZK6K/Jm5B2ZZGvc+Am0bNkySTuxWCzz\n9KdYLKb69evT2vXrJe3Sc0TUyc2NuvXoQWO+/550dXXpypUrMnH09fSkNb/9JjOu14ABcj9t+V9i\nsZiioqLo2rVrch098ejRIzIyMqIZs2bRnegYOn8pjNw6d6bOXbpQTn4BBQYdIwNDQ/L19f2keMqa\ngoIC6tmzJ9nbO9CW7dtp644d5NDKkdy7duWEi7HPxMkWKxfu3r1Lurq6tOa33+hF6muKjIqmPp6e\n1L59exKLxXT69GnS1NQkI2NjUlFRIRUVFWrcuPEHZ06+NHFxcWRoaChzlU16jojU1dXlvkj7yZMn\npKWlRamZWSQqKCT3rl1pg5+fTNLTokVLCgoKopcvX9KwYcOoatWqVLFiRXLp0IGuX78u6S86Oprq\n1KlDzZu3oJ4eHqSnr089evWSHBmx/Y8/qMV7Lg3/pnVrCjl1WmbcXxb40pQpUz76GaKioqiXhwdV\nrVqVtLS0aOzYsZSamirX58/JyaHo6Gh6/fo1ERElJCTQ0KFDSVtbmzQ0NWmI91C6/+Ah/b5rF+no\n6JCWltYnzbSVRQEBAdSkaVOpC9ozRG+oRYuWn3VUB2NM/mSL92wxpapfvz6Cg4MRfPw4zIwM4eL8\nLWqZmCAwMBBpaWnw9PTE7n37Ef/wEV6mZyA6PgG5eXm4cuWKskMvFe8u1f7v1TgqKiqoVKmS1FOC\nH2NkZASnNm3w0/RpyM/Px4QfJmHenDm4eOECiAg5OTn4Zc4cvHkjgouLCzp06IBKVaogKi4erzIy\n0at3b7i6uiI2NhYAYGVlhejoaIwZMxpnT59G0Ilg7N63X3JkRJ++nkhISMCTJ0+k4mjRvDlCgoOl\nyogIwSdOoGXLlh+M/9GjR2jbti1a2Dsg7uEj/H3tOt7k5aFDhw7Iz8//YDsiwsKFC2Fqaoou7u4w\nNzfH0KFDoaenh61btyIlJQUzpk9HcPAJNLS2wrjRo1G3bl1cvnwZOjo6cn23ZV1AQAAGew+VeiCj\nUqVKGDJsKALf84ABY0wB5MnISusFntli/7Jx40bq4+lJqZlZtHXHDpoybTpt3LyZ/LZupU6urkqJ\n6eHDh7RhwwbavHmz3LNKn6OwsJDq1q1LR4+fkJoJ2rV3LzVr1qxYlyq/evWKOnTsSEZGRtTJ1ZVq\n1KhB2traZGhkRDVr1iT3rl3pyZMndPjwYXJwaCV1aryooJBm/jybfHx8pPqMj49/78xb5ptc0tLS\noqdPn0rVT0xMJD09PVq2chWlpKVTQtJj8hk9mho3bvzRJcBJkybRhB8myRyk6tDKkQ4ePPjBditX\nrqQmTZvSvdj7JCoopCfJKeTZvz/169dPpm5+fv4Xuaw2fPhwWrJ8hcxs4so1a2nIkCHKDo+xcg08\ns8XKu+TkZGhqaqJZIzvs3b0bVatWxdHAQPw8cyaS/jm3qjTNnz8fTZo0QVh4OE6eOgUrKyts3bpV\noWNWqFABv/32G4YOHoQF8+bhxLFjmD1zJiaOG4fVq1cX6zJoLS0tnAwJQWhoKL4fNw4RERFITk5G\n2KVLSEhIwNEjR2BkZIRr166hfYcOMn27dOyIGzdvSpVZWFhAT08PBw/slyrfvetPWFlZwdDQUKrc\n3NwcZ86cwfmzZ2Ckq4NG9W0gLijAqVOnPnr8w5WrV+HWubNUmSAIcPvIQapEhOXLl2Pj5i2SIyq0\ntLSwfpMfQkNDJWefvaOiogIVlS/vNJy+fftii98mZGZmSsqys7OxedNG9OnTR4mRMfb1+PL+ZGFf\nDEdHR/T38sKEH37A5ClTJeWbNqzHymXLSjWWM2fOYPuOHbgReUdyMGjc/fto18YJrVu3hpWVVYmP\nWVBQgIsXL6KgoADHjx/H77//jk0b1sPG2hp///03ateu/Un91q9fH/Xr15f83tzcXOp9U1NThJ46\nJdMu6t5dmJhIH5kgCAL8/Pzg7u6OC+fPo0XLlvg7LAzHg4IQ/J/lwncaNGiAI4GBICK5k0UDAwPE\nxd3Ht23bSpXfvx+Lpo0bv7eNSCTCy5cvJWe0vVO1alU0aGiLuLg41KpVS67xyzMXFxe0a9sWrVo0\nx+Ah3hAqVMDOHdvRxskJbm5uyg6Psa+C8HYWrGwQBIHKUjxMsV6+fIlNmzbh2vXrMDYywsiRI2Fn\nZyd5PyUlBebm5niSnIIqVapIygsKCmBpaoKrV6/CzMysVGIdNGgQmrZoiVFjxkiVz5w+HVUqV4Kv\nr2+JjvfXX3/hu+++g76BAapXr4HbtyLg6+uL0aNHl+g475Oeno569eph7YYN6Na9BwAgPi4OXTp1\nxJYtW+Di4iLT5tmzZ9iyZQti79+HjbU1hg0bJklKS8Lp06cxbNgwhJw+A7N/ksPzZ8/iu36eiIqK\nkhze+m9EhFq1auFAQCAa/Sshy8nJQT0Lc9y4ceOrSLaAt9/FX3/9hYMHD4KI0KtXLzg7OxdrZpQx\nJksQBBBR0f8jybPWWFov8J6tr0Z8fDyZmJjQYG9vWr5qFbW0tycNDQ2ytbWlnTt3klgspqSkJNLV\n1ZXZOyQqKCQLS0u6d+9eqcXbxd2d9hw4IBPH0hUrafTo0SU6VkpKCuno6NCRY8cl49yJjiFTU1M6\ne/ZsiY71IeHh4WRpaUkNbW3pm9ZOpKmpSb/99lux+rh27Rp5eXmRnZ0dde/Rg86cOfNZMa1atYo0\nNDSoY6dO5NDKkQwMDOj06dMfbfNuz9bdmFgSFRTS4xfJ1LdfP+rfv/9nxcIYY0Ty79lSeoIlFQwn\nW18csVhMoaGhNHToUPL67jvy9/envLw86tO3L82bv4Bu3b1H+vr6NGPmLAq/dp32HTpEdo0a0aRJ\nk0gsFlPDhg3p8JGjUglO6NlzZGFhIXP+kyItWbKE+nh6SsWRnZdPrRy/oX379pXoWCtXriSvAQNk\nErvV69ZRX0/PT+qzoKCAfvvtN2ppb0/16tWjESNGUHx8fJFtLl26RKGhoZSZmVms8UJDQ0lXV5eW\nLF9Bf1+9Rhv8/MjExOSzD6J9/fo1BQQEUEhICOXm5hZZXywW08KFC0lHR4csLC1JXV2dhg0bRtnZ\n2Z8VR0nKycmhS5cu0e3bt4v1wANjTPk42WJlwsSJE6lO3bq0dMVK2uDnR60cv6H2Li6kqqpKz1+l\nUj8vL5lDTZ+9fEXa2tqUmJgo+Ut7/sJFdPr8X/TrsuWkr69PAQEBpfo50tLSyMrKikb4+NDl6zfo\nr7C/yaNPH3J0dJTrIM3i+PHHH+mXBb4yyVbIqdPU2snpk/r09vamVo7fUNCJYLoWcYtmzJxFBgYG\nRSZcn0IsFlPjxo1p/+HDUvGHX7tOBgYGciVJRUlOTqY///yT9u7dS+np6UXWF4lEFBsbS2lpaZ89\ndknatGkTaWtrU7PmzcnM3JwaNWpEd+7cUXZYrAzIzs6m5cuXU9OWzahlK3vauHFjif9Zwz4fJ1tM\n6a5evUq1atWi569SpU6Hd27bjlRVVenxi2QyMDCgmIREmcTCs39/2r59OxERRURE0JAhQ8jewYEG\nDhz43pPJS0NycjJNnjyZ6tWrRw0aNKA5c+YUe8ZHHvv27aPWTm1klk8n/TiFJk6cWOz+IiMjydDQ\nkF5lZEr199Osn2n48OElHn9KSgqpq6vLHAchKiikBg0b0rVr1yQznt9//z1NmjSpWD/Td8uJPXr2\nJLfOnUlTU5P8/f1L/HMoWnBwMJmZmVHEnbuSmdKNmzeTqanpF387Avs4kUhEdk0akZqJBqGxNsFO\ni6oaalBbl3alOqPPisbJFlOa4OBg6tO3L1lYWNDUGTNk/sLdc+AAmZmbv712p149unT5ikyddu3b\nf/T8JEWKjIykgwcP0t27d5Uyfm5uLjVq1IhGjR1LiY+fUEpaOi1ftZr09PQoMTGx2P2tWbOGho8c\nKfMd34y8Q7Vr1y7x+DMzM6l69eqU/DpN5homY2NjunfvHvXv359s6tenBYsW06zZc8jU1JR++umn\nIvu+ePEimZqaSiXoV29GkI6ODsXFxZX4Z1GkLu7utGX7dpmfS8dOnYq835F92TZt2kRVjTUJ7Y0I\nLsZvX+2MqLqeBh09elTZ4bF/kTfZ4nO2WIny9fXFmLFj4dyuHZq3bAkSyz5dSkQwNzfHgX17UblS\nJcyb/bPUKeDnz55F5O3bpf5YelpaGjp26gQ3Nzfs+P13dOjQAV3c3ZGRkVGqcVSuXBmnT59GQW4u\nbK2tYKijjXNnTuP06dMyxzTIQ0NDAy+eP5cpf/H8OTQ0NEogYmnVq1dHJ1dXLFm06N0/ogAAWzf7\nwcjICBEREbh/Pw5hV65i8pQpmDl7Nv6+dh07d+7EtWvXPtr3li1bMP6HSVJPETa0tcV3Awdhx44d\nJf5ZFOnhgwewtWskU25r1wgPHz5UQkSsrNh3cD9yNAH8+2nRCgKy1AmHAg4rLS726TjZYiXm6dOn\nWL58OU6f/wtDh4/AxEmTsdt/F9LS0iR1CgsLsWn9Bnj174+bN29ixIgRiI+LQwOrepj642T079Mb\n3/XzxN69e6GmplZisSUnJyMhIQFisfiDdUaNGgVzCwtExcVj36HDiI5PgK6eHr7//vsSi0Ne2tra\n2DZWq0cAACAASURBVLx5MzIyMpCXl4cjgYFo2LDhJ/XVvXt3hF26hEsXL0rKRCIRfOfPx6BBg0oq\nZCnr1q5F8PFjaOfkhNkzZ6JbZzcsX7IEf/zxB/bu24cx34+TOs5DW1sbg4Z4Y9++fR/tN+XlS9Qy\nkz2uoZaZGVJSUkr8cyjKo0eP3p5ndvKkVDkR4fzZs1JHoLCvT/Vq1YEC2X+oViAB1apWVUJE7HNx\nssVKTGhoKFw6dICBgQEAoGmzZvDo3QeOLZpj5bJl2OK3Ce3btEHlypUwZMgQ1KhRAxMmTMD9+/ex\nZ/dumBgaoqu7O+Lj49H2P4dXfqqkpCR0cnWFlZUVvv32W9StWxcHDx6Uqffy5UsEBwfDd/GvklPE\nK1WqhEVLliIgIADp6eklEk9xCYLw2Wch1axZE/7+/ujbqyc8PXph4vfjYGdjDbNaphjzn3PDSoqB\ngQFu3ryJadOmQr1GdQwZPBgxMTGwsrJCQUEBVP+VaL2jqqr60XsOAeAbR0ccCQiQKiMiHA0MROvW\nrUv0MyjCs2fP0MnVFc2aNcODhw/h+8s8jBoxHIWFhUhNTcWUyZMgFhfC1dVV2aEyJRo+dBiqpYiB\ngn/94zC3EFWSCzB40GDlBcY+nTxrjaX1Au/ZKtd2795Nnbt0kbm/bv0mP9LR0aHBgwfTvn37Su3+\nuby8PLKysqK5v8yn1/9j77yjmky6MP6goHQChF5UUJq9V1AEUVGxF2yo2HtfXfvau666Nuy6Koqg\nYllQwV5RVxG7KGJBQZEOIXm+P9jNZwyuIAEs+Z3zngOTmTt3JuW978yde1NSmSbKZmhYOE1NTXn2\n7FmZulFRUaxgZyfnP5OeLaa1tfV/ntrLzs7mlStXePny5W86t96HDx+4detWLl++nDdu3Cg2Pdau\nXUs3d3cZB/p3ySm0s7f/YiyuhIQElitXjmPHT2DUg4e8cTuSffr1Y/Xq1ZmRkVFEI/g6JBIJa9So\nwclTpvJDWjrTs8W8ffceraysqaamRi0tLfbs2ZNv374tblWVFDMSiYT9Bw6gpkCbJWz0qFpOjxo6\nmpw2fXpxq6bkE6B0kFdS1Hz48IH6+vq8dC1CJhZVl27d8uT8rGgOHDjAho2c5Yyn1WvXsn2HDjJ1\n09PTKRQKeSvqrkzdqzdu0tTU9LNHrkNCQmhtbU2nihVZsVIlWllZ8dixY0UxvO8GiUTCCxcucM+e\nPbx79y7T09PZuHFjNnVz447du7lx82ZWr1GDvXr1ylOcqdjYWA4cOJBmZma0srLimDFj+P79+yIY\nScE4ffo0nSpWlDtlGnjoMGvWrMmQkBAePHgwV2NLIpHQz8+Pjo6OLFmyJJ2cnKSndZX8uFy9epVT\npkzhjBkziu3AjpL/RmlsKSkW9u3bRwMDAw4aMoRz5i9gnTp12aBBg0IJkfAl5s+fz7HjJ8gZW1dv\n3GTFihXl6i9dupROFSsy9FQYE1PTeDz0BO3s7bl69epc5T958oRCoZDHQkJlYmEJhUI+fPiwsIdX\nJKSkpDAwMJD+/v5MSEjId/vnz5+zVq1atHdwYIeOHWlqasqOnToxMTGRfn5+bOPlxY6dOnHfvn0U\ni8WFMILC58WLF3z69OkXDcXNmzezR69ecp/H4ON/UUtbm1WrVaNH8+bU09PjzJkzZeQtW7aMjk5O\nDD0VxqT0DIacPEV7BweuXLmysIenRImS/0BpbCkpNp49e8a5c+dyzJgxDAwMLLattYCAADZydpG7\nua1Zt05uZYv8/+qBk5MTVVVVWblyZW7btu2z8idPnsxRY8bKyR87fgInTJhQmEMrEg4cOEBDQ0M2\ndXOjZ6tWFAgEXLVqVb5kODs7c/rMWdLVnMTUNLbr0IFjxowpJK2LjsjISDZs2JCGhoY0NTVlpUqV\nGB4e/tn6ly9fZjkbG7ntU0NDQ+7YvVtaFh37go5OTtyzZw9JMiMjg0ZGRvz7TpTM5+z6rds0MTFR\nSJBYJUqUfB1KY0vJT09WVhbt7Oz425y5TExNY3q2mCdPn6GZmZmcz9bX0L1Hj1zjJG3ZseOr0+p8\nK0RHR9PQ0FAmBtrdh49oaWnJc+fO5UlGVFQULSwsmJyRKTM/959EU0dHp1hS5ojFYiYmJhZ4Fe3d\nu3c0MzPj6rVrmZyRyTRRNv0PHKCRkREfPHiQaxuJREJXV1f6DhjAl2/jmSbK5pRp09mgYcNcY9E1\nadKEJHnv3j3ali+fqz9hmbJlFbaKKhaLGRsby6SkJIXIU6LkZyCvxpbyNKKSIiUiIgKdu3SBjY0N\nnJ2dsXv37n8NbYWjpqaG0NBQnD1zGuUsLWBvUw6+Pr2xcuVKhZxcq1qlCk6Hh8uVnw4LQ9Xv/Oj+\ntm3b0LV7d9SoWVNaVrZcOYwcMxZ+fn65tomJiUHfvn1haGgIExMT/DplCiwsLKWnO//FysoKGRkZ\nqFixIp48eVKo4/gXiUSChQsXwsLCApaWlrCyssLSpUu/+rO3fft2uDRpAt8BA6GqqgqSqN+gIfr0\n88WaNWtybaOiooIDBw4gOysL9jblYG1minV/rEHVatXk6trbO+Dly5cAAKFQiPi3b+XivSUmJiLx\n/XsIhcKvGsPH7NmzBxUqVECNGjVgYWGBHj164P379wWWq0SJkhyUxpaSIuP8+fNo2bIlGjRyxuFj\nxzF63HjMmTsXs2fPLrQ+ra2tEfLXX4iKisKJEyfw6NEjdO7cWSGyfX19cerECfy+YgXS0tKQnp6O\nNatW4a9jxzBgwACF9FFcvHnzBuXK2ciV29jY4HVcnFx5fHw8nJ2dYWpugSs3buL0+QswNjFFVNQd\nPHv6VKbuydBQ2NnbY+CQoejfv39hDUGG3377DQEBB3DkrxC8TfyAg0eOYvuOHejevTuCgoKQlpaW\nL3n3799H3Xr1AQDbt26Bk10FVHF0wLo/1uDIkaPIyMjItZ1AIMDWrVvx8uVL3Lp1CwEBATh54gTE\nYrFMvWNHj6J27doAcmKQeXp6YvLECdLQGCKRCJMnToCXl1eBA9MeP34cEyZMwIbNW/D0xUs8iH4K\nHT09tG3bttAehJQo+enIy/JXUV1QbiPmiQsXLrCZhwc1NTVpbW3NmTNnfhd+G02aNOHm7dtltkGe\nPI+lQCD4Kufr3Hj79i3PnDnzVWltvob79++zpacn1dXVqa6uzuYtWvDu3btF0veXSExM5I0bN74q\nlMDOnTvp2tRN7uRcX19fzpo1S67+nDlz2LtPH7mwH/Xq16eZmRlPnj7DN+8TuWf/fppbWHDP/v38\nkJZOQ0NDxsbGKmK4nyU1NZUGBgYyKX6WLF9BXV1dNm7ShE3d3GhoaMiDBw/mWeby5cvZrXt3bt62\njbbly/PsxUtMzxbz0bMYtvD0ZM+ePUnmbDcOGzaMRkZG1NXVZbdu3WS2/SQSCd3c3dmlWzdGPXjI\nhKRkrt2QEyrl77//ltZLTExki5YtaWFhwdZt2tDc3JyerVrlKQn3l3B1dZXxGfv3FHEFOzueP3++\nwPKVKPmRgdJn68fk8uXLFAqFXO/nx9cJ73jl+g16NG9Ob29vhcgXi8U8deoUN2/ezGvXrilE5r9y\nS5QoIY0v9PHl2tSNR48eLZD87Oxsjho1inp6eqxfvwGNjIzYqnVrhRlxXyItLe2bSR4sEok4dPhQ\nqmtqUNdYn+qa6uzWwztf+mVkZLBq1arsP3Ag79x/wEfPYvjr1Gm0srLimzdv5Oq3at2aewMC5N7b\n5b+vorNLY5azsaGamhorVa7MwEOHZXyO7t+/r8jhy/FpDLWQk6doZW3Ne4+fSMvOXrxEAwMDxsTE\n5Enmvz5bVtbWDDl5SmbMCUnJNDQ05MOHD1mjRg36DhjAuw8f8dnLV5w1ew7NzMz44sULqayUlBSO\nHTuWQqGQqqqqbObh8dnE3Hfu3GFgYCCjoqIUMjckaWJiwscxz+Xeu959+nDjxo0K60eJkh8RpbH1\ng9K6TRuu+uMPmR/F9ympNDU1ZWRkZIFkx8TEsEqVKqxcpQp79OrFMmXLspmHh0IcZiUSCQUCgczq\nwr+rH45OTrx48WKB5M+aNYvOLo0ZG/dGeupt8LBhbOnpWWDdvzfGTxhPTTMB4WKak8C2sRnVrQTs\n6t0tX3ISEhI4YsQImpiY0MDAgH369OHTp09zrduvXz/OX7RY7oY9YtRo/jp1GtOzxdyxezddGjeR\nvnYi/DTLlSvH7OxsRQz7s7x79456enp8+Tae6dlievfowWUrf5fTddCQIZwzZ06e5d64cYMqKipy\nq3/p2WI28/DgpEmT2LCRs9zrQ4YP5+TJk78oPy0tjcuXL2eTJk3o6urKVatWFUrg1oYNG3J/YJDc\n97JylSoMCwtTeH9KlPxIKI2tHxRjY+Ncn0J79OrFTZs2FUi2i4sLZ82eI705pGRmsZePDwcOHKgQ\n3UeNGsWu3t5MycyS6u23ZQsdHBwKdDpMLBbTxMSENyPvyMzJh7R0mpiY/DAxr/JCRkYGNbW1iIYm\nOYaWqxnhIKC2tZDaOtr09/fPU+DQ/HLx4kWam5vzzv0H0vm/cOUqDQ0NGfXgIdOzxXz64iX19PR4\n/vIVrli1mqampty/f79C+heJRFy8eDGdnJxoamrKTp0789atW9LX+/Xrx85du/Jt4ge6ubsz6HCw\n3HdoweIlHDFiRL76tba2lgnim54tZlJ6Bs3Nzdm7d2/OXbBQrp/DR4+xadOm/yk3IyODzs7O9GzV\nikGHg3ng4CG6N2tG92bNFB5KZf/+/bQtX543bkdKH1R+nTqN1atXL5TPihIlPxJKY+sHpXLlygw9\nFSb3A16vXn0eOXLkq+U+ePCAZmZmcsf0n718RR0dHYU8UaekpNC9WTOWr1CBg4YMYeMmrrSysuLt\n27cLJDc1NZWlS5fOdYXBpXETnjx5ssC6kyz0FZi8cOfOHbbv2IGGxkKWd7DjqlWrKBaLef/+fU6f\nPp2DBg1iKY3ShJs50cSMmkZ6dHZtzK07d3LZypUsZ2PDSZMmFYpua9eupUAgYLPmzVm3Xn0aGBhw\n97590vci6HAwLSwsWK1aNXbu0oUXLlxQWN+9evVi4yauDDt7jg+in3LhkqU0MjKSfrZSU1PZo0cP\nGhgYsEyZsuzZ20duJaeRswt3796dr34XL17MOnXqMjr2hXSVeeiIEWzm4cEFCxbQd8AAuc/kilWr\n6d29+3/K3bJlCxs3cZWJyZWSmcU6depy3759Xz1Pn2P16tU0MjKiU8WKFAqFbObhId3qFIlEDAgI\noK+vL4cPH67Q902Jku8dpbH1g7Jq1SrWrVuPrxPeSX+EN23dyjJlyhToiffChQusVau23I0hTZRN\nHR0dvnv3TiH6SyQSnj9/nitXruTKlSt5/vx5pqenF1hm+fLleerMWRndXye8o0Ag4MuXL79atlgs\n5oIFC2hpaUkVFRVWqlSJf/75Z4H0/Vpu375NbV0dqlQQEA1MiBpCaprosV6D+hQKhRw5egx/mzuP\ntuXLU9NUjyq2evT0aiNjhL5485YmJib/6fOTnp7OGTNm0NbWlsbGxuzRo0ee/arevXtHf39/litX\njhMnTZb66N25/4D2Dg6FMneRkZE0MzPju+QUmfd//qLFcr6MsbGxDAoKorm5OadMm85Hz2IYee8+\n+/r6skaNGl88aCIWixkcHMz+/ftz0KBBDAkJ4eTJkykQCFizVi0KhUK2btOG8fHxfPnyJQ0MDHjy\n9BmpTvcePaa1tfUXt+e6dO2aawy3FatWs2/fvgWdslxJT0/nzZs3ZfzWMjMz2bxFC9auXYfLf1/F\nWbPn0NramtOVOfqUKCGpNLZ+WMRiMUeMGEEDAwO2bdeO1apXp62tbYFXh5KTk6mvry/jNJyeLeaR\n43/RyclJodsJ9+7dY+3atWlpackqVavSyMiIfn5+X2wnEol44cIFnj17Vu6muHnzZpavUIGnz19g\nmiibdx8+YjMPDw4YMKBAuo4dO5YNGjbiles3mCbK5rGQUJYpW5Y7duwokNyvoXXbNlSxE+RsD/57\nNTEjVFV49K8Q6XuWnJHJhs7OVNfV5F8nTsrdsIeOGMEFCxbk2odEImGLli3Z2suLF69e48Onzzh7\n3vwcJ+rHn0/G/SmxsbF0c3ensbExq1StSkNDQy5dulRRUyHDunXr6NO3r9w47z16TEtLy1zbREdH\n08fHhwYGBjQ1NeXIkSO/+ECRnZ3Nrl27snKVKlyyfAXnL1rM8hUqcMiQIXz//j0vXbrEZ8+eybQ5\nevQojYyM6OzSmC1atqSenl6eUuz06dOHS1eslBvTb3PmctiwYXmfnAKyZs0aujZ1k1nxjnn1mqam\npgX+zVGi5EdAaWz94MTExNDf35+nTp1S2PbWggUL6OjkxIPBR/j0xUtu27WL5ubmPHDggELkkzm+\nKGXKlOHK1aulvlvXbv5Na2trhoaGfrbdyZMnaW1tzcpVqrBGzZo0NTVlQECATB0/Pz+WK1eO2tra\nNDAw4KRJk3JNIC0Wi3nu3DkePnz4P8MivH37lgKBgM9fx8nc8ELDwlmhQoUi92fR1dcjGpnIGlvu\nFlQ11+a6jRtldDz6VwgFAn0eOf6X3A174ODBXLx4ca59nD59mnb29nLbyZN+ncIhQ4bkW+fo6Ghe\nvXq1UKPF79+/n03d3OTGGXLyFKtVq6awfvz9/VmzVi1pNoL0bDHfvE+kbfny/7lSlZ6ezuDgYAYE\nBOR5hTgkJITlK1Tgq/gEGSPH2tq6SMMxuLm5cV9goNzcjh47jjNmzCgyPZQo+VZRGltK8o1EIuH2\n7dtZq3ZtGhkZsWnTpgwJCVFoH3v27KGbu7vcj/fGzZvZqnXrXNvExMRQKBTKGA6nz1+gsbGx3NO1\nRCJhYmLiZ7dU//77b1aoUIEVK1ViMw8P6unpcfr06bkaTuHh4WzQQD6VSpoom5qamkWe1sSqrDVR\n20jO2FIz1JILuxB29hzLli3L5i1ayBxIeBzznIaGhnz06FGufcybN4+jx46TG/P5y1dYpUqVIh1v\nXklPT88xvoMOSvWN/5DEBg0b8ffff1dYP126duV6Pz+5uZk9b77CV5skEgnHjRtHCwsLjh0/gaPG\njKWpqWmRb9+5urrKhOr49xo/8RdOmzatSHVRouRbJK/GljKCvBIpKioq6NWrF65euYI3b97g5MmT\naNasmUL7iI6ORtVq1eXKq1arjqfR0bm22bJlCzp17Yqm7u7Ssjp162Lg4CFYv3693Bj09PTkUsQA\nQGZmJlq3bo3JU6fi6o2bOHT0GG7eicKBwED8+eefcvUtLCzw+PEjZGVlyZQ/e/oU6urq0NTUzNOY\nFcXQwUOgGSsCxB9F9Y7PQHZiujSa+b9s3bwJ3t7eEGVlwc3FBWvXrMHc336Dc726mDhxImxtbXPt\nw8jICM9jnsmVx8Q8g5GRkULHoyjU1dURFBSE4UMGo7mbG3z7+MCxvC2cHB0wdOjQfMlKS0vDixcv\nkJ2dLfeaRCJByZIl5cpLliwJiUTy1frnhoqKCpYsWYIjR45AR0sT+nq6OHHiBGbNmqXQfr6El5cX\nNqxbKzO+xMRE7PlzF9q1a1ekuihR8l2TF4usqC4oV7a+WZKTk7lq1Sp27daNw4YNY0RExFfJCQ4O\nZu3adeRODi5ZvoLduuUeB6pfv35cvXat3NP17n376NW2rVz9+/fvc8iQIazfoAG9vb2lSacDAgLY\nxLWpnJyAoINs2LBhrn038/Dg6LHjpNtqbxM/sKWnJydOnPhV4y8IIpGI7Tt1oIauFjVsDKljaUg9\nfQG7dOlCp4oVuWHTJh44eIidu3alo6MjExISKBKJuG/fPvbv359jxoxhREQEb968yYEDB9K9WTOO\nHj1axhfr/fv3NDQ05PHQEzJO9ZWrVCm2gwF5JSMjg0FBQdy0adNnk0F/jtTUVA4ePJi6uro0NDSk\nQCDgwIEDZQ5v7Ny5k/Xq1WdSeoZ0bt4lp9DB0VHhK8DfCmlpaWzUqBGbuDblpq1bufz3VbSzt+fo\n0aOLWzUlSr4JkMeVLZWcut8GKioq/Jb0UZLD27dv4eLiAnsHB3i1a4fnMc+xfu0fmD59OgYPHpwv\nWWKxGLVq1UJj16aYNGUKdHV1cfRIMIYOHIijR4+iVq1acm1Wr16NsPBw7NrrL1M+avgwmBobyzzt\nX716FZ6enhg4eAhc3dwQefs2Fi+Yj3nz5iEpKQmRUVFYuVo2UfDjR4/QukVzROeysvb27Vt069YN\nDx48gIOjI65HRMDLywvr169HqVKl8jV2RXH79m2cO3cOQqEQrVu3hrq6Og4dOoTtO3YgKSkJzdzd\nMWjQIOjp6cm1PXjwIAYOHIjhI0eharVqOHvmDLZt2Yzg4GDUqVMHAHDq1Cl069YNlSpXgdBIiJOh\nofD19cXChQuhoqJS1MMtErp27QqxRAJVNTWcDguDm3szPHjwAI8fPcSRI0dQr149ZGdno32HDnj7\n5i369veFSCTChnXrUKN6dWzZsuWHnZvMzEzs3r0bR44ehZamJry9veHh4fHDjleJkvygoqICkl/+\nMuTFIiuqC8qVrW+SESNGcNDQoTKrQVEPHlJPT++r8u7FxcWxW7du1NLSoo6ODqtVqyZ1jo+IiGCv\nXr1Yo0YNdu7ShefOneOHDx9YpkwZzpj1G9+8T+S75BQuXbGSpqamcmEdmjRpwo2bN8voevXGTRoZ\nGTE8PJy25cvL+DClZ4u5dMVKdurc+T91joyM5NGjR+VOm31PiEQiWlpayoQiSM8Wc/O2bXIre2lp\naTxw4AC3bduW5xQ23yuPHz+mkZER5y9cxEbOLkxISpbOzYGDh2hqaipd4RKJRNyzZw+7eXuzZ8+e\nDAoK+uqAvLdu3eLQoUPp2aoVJ0+ezOfPnytyWEqUKCkCoHSQV6IorKys+PedKLntt3bt2xcoBEJq\naioTEhKkzukhISE0MjLigsVLePbiJa5cvZpmZmbcvXs3o6Oj2b5DB6qrq7NUqVJs0bIl79y5IyMv\nLS2NpUqVyjX/Yq1atXnmzBk2b9GCnbp0YdSDh3yfkkq/LVsoFAq/elv0W0AikfDx48dfNIoiIiLo\n6OQkNzfJGZnU1tZWWCy1743g4GB6NG/OylWqMDQsXG5+XJu6MSAggE+fPuWIESNYs2ZNNm/Rgvv3\n78/XidS4uDiOHz+elSpVom358tTX1+f0mTO5LzCQQ/9Ji3TkyBGOGTOGHs2bc8iQIflOwfXmzRte\nvnw51/yVSpQoUTx5NbaUDvJKvsg/y6Ry5bmV5QdNTU0YGBhI5Y8bNw7r/TZh1JgxqFW7NgYOHgL/\nA4EYP348LC0tcSAgAB8+fEBSUhKOHT0KJycnGXmqqqooWbIkUlNT5fRMSk6CpqYmDgQEwNrSEi4N\n6kOop4s/d+zAwYMHUaNGjQKNpbgICwtDpUqV4OzsjBo1aqB+/fq4fft2rnVLlSqF9PR0ufctKysL\nJHM9VPAzYGtri9u3biEhIQFW1tZyr1taWSIqKgr16tVDKXUNLF35O7r36oVp06dj2rRpeeojISEB\nDRs2RFJKClavW4+kpCQEHg7G5KnT0LqNF5YuX4HuvXqha9euKKlWCkOGDYfQ2ASurq44duzYF+Vn\nZmZiwIABsLOzw9Bhw2BnZwdfX19kZGTkez6UKFFSCOTFIiuqC8qVrW+SUaNGsf/AgTJO7bfv3qOe\nnh7j4+MV0serV69oYGCQa8odO3t7/v3333mS4+3tzXETJsq037V3L+3t7eVWIb73vG/37t2jUChk\nQNBBpomymZyRybUbNuREU89llUoikdDJyYk7du+WC13g2apVMYzg20AikdCjeXM6Ojlx/qJFMnOT\nkJRMExMTtmnThrNmz5F57fnrOOrr6zM2NvaLfcycOVMaeDX83HlWrVZN7nNes1Ytbv/zT5myYyGh\ntLGx+eJW5bBhw9jay0sal+t1wjt6tWvHwYMHK2qalChRkgtQbiMqURTx8fGsWLEiPVu14no/P06Z\nNp0mJibcuHGjwvpITEyktrY24z8kydxsUjKzaGpqmufo5a9evaKjoyMbN3HlzN9ms2379jQ0NOSV\nK1cUpuu3wogRIzh5ylS5m3ZXb2+uWLEi1zZXrlzJScHTqxcXLV1Gr7ZtWaZMGT558qSItS8+YmJi\nuHXrVvr5+bFXr17U1tZmqVKlaGVtTXV1dc5bsJD3Hj1maFg4nV0as0+fPjQ2NuaD6Kdyc92pc2du\n3779i326uLhI48SdvXhJbjv32ctX1BMI5PwJ00TZtC1fnrdu3fpsKqGkpCQKBAI+e/lKzhjU09Nj\nYmKioqfwh+Hx48fs19+X5crbsE6Duty7d2+eHsIyMjKYkpJSBBoq+dbJq7Gl3Eb8yYiKisLvv/+O\nzZs34/3793lqY2hoiMuXL8OrTRucCQ9HanISQkJC0L9/f4XppaenB9emTbFi6VKZcr8NG1C2bFnY\n2NjkSY6pqSmOHj2KZ0+j8cea1Xj9+jUE+voYO3Ys3r17pzB9vwXuP3iAuvXqyZXXqVsPDx48yLVN\n7dq1ERUVhZrVqyMm+glaeXoiMjIS5cqVK2x1ix2SmDx5MqpVq4ajx49j85YtCAoKwh8bNiDm1WsM\nHjoMOjo6CP3rOFydG2HsyBHo0L4d/Pz8oKWlhcRcvi/v3r2Dtrb2F/vW1dND3Js4AED1GjWQkZGB\nvz7aHlRVVYUoK0suvhdJJCcnw9XVFVpaWnBycpKLCRcXFwd9AwMYGxvLlAuFQhgZG+P169d5nqOf\nifv376N6zRrYFhaAaINkXEl+iH7DBmDiLxM/2+bly5do7dUGOro6EOgLUL1WDVy5cqUItVby3ZIX\ni6yoLihXtgoNsVjMQYMG0dTUlAMGDWKHjh2pr6/PwMDA4lZNyvPnz2lvb09nl8acPGUqm7doQWtr\na967dy9fcpp5eHDylKnSLcnULBEHDR3K7t27F5Lmsrx//56LFi2iV9u27NevX6GlVxkxYgQntSrD\nmQAAIABJREFU/TpFbrWlS7dun13Z+pnx9/dnxUqVGBv3RjpXJ8JP08DAQFo2aOhQTpkyRa7t1KlT\n2a5DB5mVp9CwcAqFQqalpcnUvX37Nnv27MkKFSqwUaNG3LFjB/39/Vm5ShVpAvnQU2E0MDBgz969\nuWLVarZr354GBoZcvHSZzHu5ZccOCoVC3rgdyTRRNo+HnmCZsmW5a9cuaX9paWk0NDSUy2v6IPop\n9fX1CzVV0veMV7u2OUndP87I4GJKdU2NXLeGMzIyaFXWmiVtBTk5SZuaE0761NLRzndct/zw7Nkz\nhoaG/lSrz98TUG4jKvmYrVu3slat2nyb+EH6Y3zu0mXq6+t/UyeXMjMz6e/vz5kzZ3LHjh1yN7Iv\n8fx5Tjqaj/PXpWeL+So+gTo6Ovzw4UO+dXr//j2XLFnCLl27cuTIkbx169Zn67569Yq2trbs6u3N\nXXv3cv6ixbS0tCwU4+f+/fsUCoXcFxgo9dlavXbtZ322fnY8mjeX81eTbruuWi0N9eDRvLlc27S0\nNLq5u7NipUqcOGkyu3p708DAQC6YaUREBIVCIecuWMgbtyO5PzCIVapW5aRJkzhy5EiamJhw0JAh\n7N6zJ3V1ddm5c2cOHDiQq1evZkREBC0tLdmhY0cuXbGS3Xv2pIaGBo9/kkw85OQpOjg4yGx3zZgx\ng/Xq1eetqLtSn8r6DRpy6tSphT6v3yvaujqEs6lc+ivtssJcT1nv2rWL2hYGcvVLlhfQd0B/heuX\nlpbGdh3aU11Lg3pWRlTX1mRzzxZFniZMyX+TV2Pr5zx+9BOydetW/DLlV5ktj5q1aqF5y5bYt29f\nvtOaKILs7GycOXMGycnJaNiwIYRCIUqVKoXOnTt/tcyEhAQYm5igdOnSMuV6enrQ1NREcnIydHV1\n8ywvNjYWLi4uqF23Llq0aoXHDx/B3d0dy5YtQ48ePeTqz5o1C56t22DRR9uh7Tt2RN0a1dG9e3eF\npryxs7PDvn37MGLECIwYMgQikQgODg4ICQmBvr6+wvr5UUiIj4eVlfxpQ2vrMkiIjwcAPHjwAOZm\nZnJ1NDQ0EBoSgpMnT+L8+fNwadQIa1atgqGhoUy96TNmYNrMmRg4eAgAwMHREXXr10dlB3tERUVh\n0KBBOH78ODQ0NLBsyRKYmJjItL9z5w527NiBO3fuQFdbG9WqV0fjJk1k6jRyccGTJ0+QmZkJdXX1\nnH6nT4eamhrcGruAJFRUVDB8+HBMnTr1q+frR0dDSxMpWRKgtGwKphLZhI6Ojlz9iOsRSFGXT+Mk\n1lPFlWuK30ocMmwojl8NQ0YdATJKlgDEagi/cxl9+vVBwL4AhfenpJDJi0VWVBeUK1uFRrVq1Xjm\nwkW5p/rRY8dx7ty5Ra7PpUuXaG1tzZq1arF5ixYUCAQK0SMjI4OGhob0HTCQtevUpXuzZty8fTtP\nhJ/O06muT+nduzd/mfyrXJBUAwODXB1kLSwsGHnvvtw8t+/QoUAxyf4LiUTC6OjoPJ2K+5kZOXIk\nx46fIHcAw6liRR4LCeXNyDs0NzfnxYsXv7oPLS0tvnwbL/f+t/Hyor+/f75k3bt3j2ZmZjLpgdKz\nxbwVdZdGRka5OnJnZWUxLi6OWVlZXz2Gn4VJkydR3VKQsx3470pVDSF1BXoyaZr+Zc2aNdQsYyi3\nsqViL2D7jh0UqltycjLVNTUIl09W3pqYUV1T/auCSSspHKBc2VLyMa6urtjv74/a/6RkAXJi8xw6\nGISdO3YUqS7Jycnw8vLCmvXr0bqNF4Acx9OWzdzh6OiI9u3bf7Xsd+/eoaSqKkQiEeYtXIg3b+Kw\nYO5cvIiNxZo1a1CiRP7OhAQGBuL2vfsyZZUqV0aVqtUQFhaG1q1by7ym+k/fnyISiXJNYpxXIiMj\ncfnyZZiZmcHDw0MmJpaKigrKli371bIVBUlcvHgRhw4dgqqqKrp06YIqVaoUt1pSxo0bh3r16kFH\nRwfePXvi/bt3mDFtKhLi4zF/7lzcvvU3Fi9ejHq5HDrIKwKBAHGvX8utLMa9jsv3aqO9vT2cKlbE\njKlT8dvcuVBVVcWHDx8wZuQIDB48ONd0OWpqanKO8kpyZ/q06Th7/hz+vnUbaTqAhlgVeJ+JoIOH\npCuGH9O9e3dMnvorEJcGGGsAKipAchY0XokwcesEheoWHx+PEmolgVKf/GaoloCaljpev34NoVCo\n0D6VFDJ5sciK6oJyZavQiI2NpaWlJceOn8CrN27yrxMn6drUjZ06dSqUeFPZ2dlcsmQJ7e3tqaen\nx2YeHtKE0Fu2bGEbLy+5p//tf/6Zq79Mfhg9ejSHjhghI/fN+0QaGRnlOxo3Serq6jI69oWcro2b\nuDI4OFim7vXr1+ns7MxePj4y8cKu37pNgUDA9+/f57v/zMxMdu3alebm5uzZuzfr1W/AsmXL8vbt\n2/mWVZiIxWL6+vqynI0Np0ybznETJtLU1JSzZs0qbtVkePjwIX18fGhqasry5ctz6rRpDA4O5pEj\nR5icnFxg+ZMnT2bb9u2licvTs8XcGxBAKysrikSifMt78+YN3dzcaG5uziauTSkQCDho0KCvkqVE\nHolEwrCwMM6ZM4cbNmz44nf06tWrtCprTW1DPeqaGlBHoJun0B/5JTMzkzoCXaK+sezKVkMTampr\nKsNOfENA6SCv5FNiYmI4bNgw2tnZsWbNmly2bFmhbTcMHjyYDRs58/T5C4yNe0O/LVtoZGTEM2fO\ncN68eXLbOenZYl68eo2VK1cuUL9OTk68cOWqnOxBQ4Zw2bJl+ZbXp08fuSCpl65F0MDAQHrKSyKR\ncMiQIbS0tOTgocNobm7O2nXqsFPnLrSzd6CBgQH79ev3VXM9ffp0tvT0lHH499uyheXLl//qnHyF\nQUBAAKtUrSoTJ+3Zy1e0sLDgtWvXilu9IiMtLY0tPT1pY2vLwcOG0aN5c5qamhY4ztvdu3cZEhLC\nFy9eKEhTJV+LRCLh9evXef78eWZkZBRaPwsXLaSmUJeoY5RjaNU1pqaxHqcoDz18UyiNLSXFxtOn\nT2lgYMC4d+9ljJRNW7eyadOmDA0NZcVKlZiaJZI5pt7UzZ2VK1fm9u3bc/WZyAu1atfmsZDQXE+c\nrVu3Tq5+SkoK/fz8OGbMGK5Zs0YuAOSLFy9oa2vLDh07csOmTZzwyyQaGRlxz5490joBAQGsVLky\n37xPZHq2mHHv3tPOwYENGjWi/4ED/NPfn84ujenZqhWzs7Pl5E+bPo1e7dty+ozpcom1LS0tGfH3\nLblAl1WrVWN4ePhXzVFh0KlzZ67385Ob91+nTuP48eOLW70iRSKR8MKFC1y+fDl3796d5xO1IpGI\nhw4d4qpVq3j27Nk8rTjHxcVx9OjRtLW1pYODA6dOnaqQFTolxY9EIuHq1atpbGbCEiVL0tBYyMVL\nFn/3mS9+NPJqbCmDmipROFeuXIGzi4vcqb/WXm1x8eJFNG3aFEJDQ/Tv2wfRT57gwP79qF2tKsqU\nKYNeffpiy9ZtqFOnDuL/OSGWH3p0747FCxcgKytLWhZ5+zb+OnYMHTt2lKn7+PFjVKxYEUEHD0Jo\nYopTYWFwdHREZGSktI65uTmuX7+OJo0b43RYGCjOOUHZtWtXaZ0dO3di1Jgx0hNMhw8GwdTEFKGn\nwtDGqy3ad+iIoyEhiIuLQ3BwsMw82Ts5YNHONTj04AwWbl8Ne0cHRERESOvEx8fL5etTUVGBtbU1\n3r59m+/5KSwyMjKglUtwTy1t7Z8uP5+Kigrq16+P0aNHo1u3btDQ0Phim4cPH8LBwQHzFyzE7Tt3\n4Nu/P1xdXZGUlPTZNomJiWjUqBEyRCLsDTiATdu24/7Dh/Dw8MjVb1DJ94WKigqGDRuG1y9eITUl\nBW9fv8H4ceNz9dVT8h2QF4usqC4oV7Z+CMLDw1m5ShW5PIeXrkWwbNmyJHNO24wePZqGhoZUV1dn\n2NlzMis3g4YO/aq8bllZWWzXvj0r2Nlx4qTJ7NOvH/X19bl79265uu7NmnH+osUyOq7buJG1a9fO\nV5/NPDy4PzBIKqNj587027JFbpVn6YqV7N8/Jx6PRCJhefsKRCV9WZ+Mivp0rOQkle3m7s6NmzfL\nyHn5Np4CgYDPnz/P9/wUFmvXrmUzDw+Z9/xDWjorVa7M48ePF7d63zQSiSRnW3/l79K5S80S0adv\nXw4YMOCz7RYuXMiu3t5yq571GzTk3r17i3AESpT8vEC5sqWkuHB2dkZWZia2bt4kLUtLS8OUSb9I\nU/xoa2tj+fLl2L59O2rXqYt69etL66qoqGDs+AnYt29fvvtWU1PDgYAA+G3ciNJqqqhSqRIiIyPR\nrVs3mXoJCQm4cvkyhgwbJlPes7cPYmNj8eTJkzz32dzDA7t27vj3gQHq6upITU2Vq5eakiI95fT0\n6VO8ePkSMPlk1cNUA9HR0YiNjQUA/DZrFn795Rf4bViPFy9e4Ex4ONq1agUfHx9YWlrmWcfCxsfH\nB6kpKejY1gvBhw8hYP8+tHB3h12FCmjWrFlxq/dNc+fOHcTHx2PQkCHSshIlSmDWnLnYvXu3XAqf\nfzl95gw6dOokU6aiooIOnTohPDy8MFVWokRJPlGGflCSJ8RiMcRiMUqVKvXFuiVKlEBQUBC8vLyw\ncf16lC9fHuFhYfD09MTEiRNx6dIlhIeHQyAQQEtLC+rqpeVkaGhoyGwF5gcVFRW4uLjAxcXls3Uy\nMzOhpqYGNTU1Od3VNTSQnp6e5/4GDhyI7du3o2/vXujn2x/lytlg2ZIl6Na9h3QrNSEhAZs2bpDN\na5eH3YAGDRogODgYc+bOxZxZs2BqaoqBAwdi8ODBMvVSU1Oxc+dOnDl3BmXLlMWA/gOKNByEhoYG\nQkNDsWnTJqz/4w+oqalh4ID+6NmzZ77DbfxsvHv3DmZm5nLzJBQKkZ2djczMTJlQH/9iaGCAly9e\nypW/iI2FgYFBoemrRImS/KPy79P4t4CKigq/JX2UAO/fv8eECROwZ88eZGZmon79+liwYAEaNGjw\nxbZisRinT5/Gq1evUKdOHZQtWxbdu3fH9Rs30MarLV6/foW/jh2DWCLBxStXYVu+vLTtwnnz8ODe\nXezatatQxkUS1atXx+Rp09C23f/jep0JD8fgAf3x8OHDfMXF+vDhA1atWoXgI0dQulQpqKqq4tHj\nx+jRsxeys7Oxa8d29O7dG/Pnz5f2X8HBDo9Lv5Nd3XqdBnuJCe7duZvnvl+9eoU69evivSQVqVoS\nlMpSQck3mdj75x60adMmz3KUFA/JyckoU6YMLl69hjIfGciHDx3EgrlzEXHtWq7tTp06Bd/+/RF2\n9hxMTU0BAA/u34dbYxecP38ednZ2RaG+EiU/NSoqKiD55UfnvOw1FtUFpc/WN4VYLGbdunU5YNAg\nPnv5iknpGdy8fTuFQuF/5gf8HEuXLmVTNzd+SEuX+picuXCR2traNDe34KKly3jg4CEOGDSIFhYW\nfPz4cSGM6v+Eh4fTyMiI02bM5LGQUM6eN5/GxsY8fPiwQuRfunSJkyZN4q+//srr16/LvX7hwgVq\n6+qwlI0BUUmfpW30qa2nk+8wAV27d6OqzScJdWsbUVegWyhH0+Pj478qZpiSz7N48WLa2dtzb0AA\nox485Jp166itrc3SpUuzb9++jI+Pz7Xd3Llzqa+vT+8ePdixUycKBAJu2bKlaJX/Cbhw4QIHDRnE\nXj69GRQUJHeq+FshMzOT165d4927d5WnFosIKEM/KCkox48fZ/UaNeQc3ecuWMjevXvnW1716tUZ\ncvKUnON423btOGXKFPr4+NCjeXNOmzaNr169KoQRyRMVFcXBgwezcePG7NevH2/cuFEk/f5LTEwM\nJ02exFZerfnrlF+/KuVOafXSuSbU1TU35F9//aUwXa9cucIGDRpQV1eX2trabObhwfv37ytM/r/8\nG8foxIkTcqE4fmT8/f1Zu3ZtauvosFatWgw5dYoxr16z/8BBtLKyYnR0dK7tnj9/zg0bNnDLli3K\nNC6FwIRfJlJTT5sq5fUIOz1qGwvY1N3tm0uJtGPHDurpC6hjJKCmnjbtHO2/KpCzkvyRV2NLuY2o\n5LPMnz8f8e/eY+6CBTLlf9+8iQF9++DWrVv5klehQgX4HwiEo5OTTPmwwYNQvWpVDB8+vMA6/4yU\nKl0KovpCQE3W50f3XiZ2r98GT0/PAvfx9OlT1KlTBwsWL0aXbt7Izs7GxvXr8fvyZYiMjISenl6B\n+wCA+/fvo3XbNnj9Ng4lNNSQlZiGKZN/xdQpX59QOSIiAnfv3kWFChVQp06db/rofP/+/WFdthwm\nTp4sLSOJerVq4ml0NEJDQ1Hno5RbHxMXF4dTp05BQ0MDHh4e0NTULCq1f1hu3ryJBo0bIb2azv9T\n50gIzag0/D5nCXx9fYtXwX84d+4cmrdqgTQHTUC3FEBC5VU6DN6WxLPop9DS0ipuFX9Y8rqNqPRc\nVfJZrKyscDfqjlx5VNQdWFpZ5Vuem5sbdn/ig5WcnIwjhw/D3d39q/X82WnesgVKvPjEoT9FhOzE\ndDRu3Fghffzxxx/o0as3uvfsBVVVVairq2PEqFGoW78+tm/frpA+RCIRGjdtgscl4pFSXRtJjurI\nqK6LBcsXY+/evfmWl5iYCHd3d3Tq3BnBR4+iZ69eaNSo0TcVn+xTbty4gaaffBdUVFTQ0rMVmrq7\nY9gnp2f/Zd68eXBwcID/vn1YtXo1ypQpg2PHjhWFyj8cWVlZePLkCZKSkuDv749MoapsjsISKkgz\nKoHN27YUn5KfMG/hfKSZq+UYWgCgogKaayJTndi/f3/xKqcEgNLYUvIfdOjQAX/fvIndf+6ShjV4\n8vgxZs+cieGf+dH/LyZPnow/d+7A5IkTEXHtGoIPH4Jns2Zo3749HBwcCqTrvXv30KdPH1SoUAEN\nGjTApk2b8LOskq5ctgL6H1Sh/igdiEtHiWep0IxKxR+r1yjsiTbyzh00cnaWK3d2aYw7d+QN8q/h\n2LFjSGMWaKGZk+QXANRVkWqpinmLFvx341wYMWIEytnaIvLefWzdsRN/34lCnXr14ftP+JFvEcv/\neMDxaN4iJ2TIixcyrx07dgybt2zB9duR2L1vP478FYJ9gUHo2bMn4uLiikr17x6SWLZsGYxMjFGl\nZjUYm5og8GAQcv0VKQGkf0PBeh89fgToqMmVp6hl4fHjx8WgkZJPURpbSj6LpqYmjh49ikXz5qFa\npYpwb9wYjerVxaiRI79qa6pMmTK4dOkSJNkiDBs0EKtXrMDw4cOwZs2aAukZGRkJFxcX2NrZY19g\nEH75dQrWrluH0aNHF0ju94KNjQ3u3onC5L6j0MSkGno7t8e58LPw8fFRWB+2Nja4cf26XPmN6xGw\nsbFRSB8xMTEQqefygpaanIHxJZKSknDo0CHMnjdfeqq0RIkSmD5rFs6fO4fXr18rQGPFM3zYMMye\nNQuPHj4EkGMA7N/nj6uXL6N9x46QSCRy26AbNm7ExEmTYGZmJi2rV78+Wnt5Fdpp3h+RjRs3Ytq8\nWUhyKI3UWrrIrC3A44RY4EUKkC35f0USiElFfNyb4lP2E6pXrY4SH+SzBmhnqKFKlSrFoJESOfLi\n2PWlC0ALAPcAPADwSy6v+wB4A+D6P1e/z8gpFAc2JQVDIpHwypUrPHnyJJOSkopbHTk6de7MhUuW\nyjjdv4pPoIGBwWedipXkj4MHD1Kgr8/joSekkcp37d1LIyMjxsXFKaSPc+fOUctAl3Azl3X2dxTQ\nvXmzfMl69uwZzc3N5Q5jpGeLae/gwNu3bytE58Jg9erV1NDUZK3ateng6MgKdnY8f/kKN2zaxPr1\n68vVb9CwIf86cVJunNNnzuIvv/xSDCP4PjGzNCdqCWU/e65mREkVQlOVcBAQFfUJ/dKEoBQ1dLXk\nTmVLJBKuWbOG5lYWLFGyBG3tyueavULR/P3339TU0SKqGOR8f5qYUbW8gGVsyn5zjvw/Giiq04jI\nWR17BKAMADUANwE4fFLHB8DveZBVqJOi5NsgOzub+/fvZ/cePdi9Rw/u37+/QEephUIhH8c8Z3q2\nmMHHjrN9x45s2MiZThUrctmyZQrU/OcjLS2NzT1bUENXi+rGutTS1qK5uTmtrK1ZsWJFXrp0SWF9\nSSQS1m1Qj6WtBTmnK93MicoG1NTR4sWLF/MlKzs7m1ZWVjx36bKMAXIz8g6NjIwKJSSGIgkPD6ee\nnh692rXj2g0b2NfXlyYmJrmelp0wYQKHjxwlM87ULBFr1qrFQ4cOFYP23x9isZgA5A19dwtCV5Uo\np02YahDG6oSTgGhqTj1rIx45ckRGzrTp06kp1M0x2pqaE9UNqSnQ4Ua/jYU+hrCwMNo52bOUemmq\nlS7F5p4t+OLFi0Lv92cnr8ZWgU8jqqio1AMwg2TLf/6f9E/nCz+q4wOgFskRX5DFguqj5NtGIpHA\n29sbjx4/hu+AAQCATRs3wqZcOezdu/c/o43HxsZi2bJlOH36NPQNDNCvb194e3vD3t4e23b9iTOn\nT2PdH2sw4ZdfYGtbHgcPBsF/924EBgYiPj4eRkZGaNCggTKieT4YMXIE/AJ3IsNOEyihAkgkUHmc\nApvSJnhw977C5zI5ORljxo3Fzp07IcoSwbGiI1at+B2urq75lrV161bMnDULS5evQP2GDRFx9SrG\njx2DYUOHYuTIkQrVuzB49eoVNm3aJE1S7evrC2NjY7l6L168QJ06dTBg0GD09PFBclISFi2Yj+fP\nnuH06dP5Cs77M2NqYYY4CzGg91GWDAmhcvY1WF4XsPjI/zFbAvWriXhw9z6s/jkslJKSAmNTE6RX\n1wHUP4r4/yELwhgVxL18Vei/PSTx7t07lC5dGtq5JIZXonjyehpREcZWRwDNSQ785/+eAOqQHPlR\nHR8A8wC8Rc5W41iSsbnIUhpbPzgHDx7EjJkzcfr8BZQunZOmJysrC00aNcT0adPQrl27XNs9e/YM\nDRs2RMfOXdChUye8evUSC+fNg4uzM4yMjBAWHo6Ia9dw5cZNWFtbA8gx7Fq4u+HG9etwadwYz549\ng0QsxoEDBwrskP8zIJFIoK2rk3PsXeOjmwcJrevJuHj6PCpXrlxofYtEIuln5GsJDAzEokWLpKEf\nxo4dC29vbwVpmTckEgnCwsIQGRkJGxsbtGzZMtf0OwXh8ePH+O2333D06FFoaGigW7dumD59uvKG\nmw9WrV6FSbOmIs1OA9BUBbIlKB2djgoCKzx5Go00W3VAvxSQLobG00y0b+qJXTv+7xMXERGBpq08\nkFRZQ062+sV3iH70RBrpX8mPQ16NLUV843Pr5FOL6RCAP0mKVFRUBgHYBsBNAX0r+c4ICgpCX9/+\nMjfRUqVKoa+vL4KCgj5rbM2dOxc9evXGrDlzpGWuTd1Q2cEeYWFhOBwcjMpVq0oNLQDYsG4dMjIy\n8fDpMwgEApDElk1+aNOmDe7du6d84v8CIpEImRkZgLpA9gUVFahqlUZcXFyhGVslSpQosKEFAO3b\nt0f79u2/XLGQiI+Ph6enJzKzstCgUSPs2euP8ePH4/jx4yhXrpzC+rG1tcW2bdsUJu9nZPiw4UhM\n/ICFixaiRGlViNIy0KJFS2zbshVHjhzBpCmT8eJWLDQ0NTF0yBDMmT1Hpr2JiQmyUtIBsTpQ8qPb\nYqYYIBQWi07J94kijK1YANYf/W8JQCY7Ksn3H/27EcBCfIaZM2dK/27SpAmaNGmiABWVfCuoqKhA\nIpHIlYvF8qesPubEiRMIPBwsU6anpwfP1q1x5swZzJg+HXPmzpN5feP6dfh9zR8QCATSvvv1H4DN\nfn44deoUmjVrJtfPvXv3sHv3bqSlpcHT0xNNmjQpUBBMsViMhw8fQltbG5aWll8tpzgoXbo0bMrb\n4lF8AmD00dN6phiZ71JRo0aN4lPuO2HkyJGoW78BFi1dKv0cLV+6FD4+Pjhz5kwxa6fkY1RUVDBt\n6lSMHzcO0dHRMDExgaGhIQDA29sb3bp1Q2ZmJkqVKpXrdqClpSXq1KmLC09vINtGKyd8iYRQf5qB\nrl27QkNDfsVLyfdHeHg4wsPD898wL45d/3UBKIn/O8iXQo6DvOMndUw/+rs9gAufkaU4rzUlhY5E\nIqFYLP5ivcuXL7NV69Y0NDSklZUV7ezsmJCULHXmfZecwkqVKzM4OPizMipXrsxTZ87Knbhq4+XF\nHTt2MD09ncbGxgw9FSZ9zcDAgM9evpJr06FjJ/r5+cn1sXz5choZGXH02HGcMes3Ojg6snPnzhSJ\nRF81P3v37qXQ2IjaBrpU19Jgrbq1Cz3fo6IJDg6mho4WUUmfcDElagqpaaTH8RPGF7dq3zzJycnU\n1tbm64R3Mp+/5IxMmpiYfHefBSWf58CBAyxX3oYlSpZgCdWSVFUvRR1rITV0NNncswVTUlKKW0Ul\nhQSKMjcickI/3AfwEMCkf8pmAWj9z9/zAEQCuAHgJAC7z8gp7Hn5aUlKSmJycrJCZMXFxbFPnz7U\n0NCgqqoqW7Vu/dkcXJcvX6ZQKOTqtWv59MVLhp09Rytra9rY2HLhkqVctHQZHZ2c6OPj85+JUxcs\nWECP5s2ZlJ4hk8RaX1+fHz58IEmGhITQ0NCQvXx8OPO32TQzM+OGTZtkbnTvU1Kpr6/PBg0byhiK\nDx48oFAo5IPop9K6ialpbNCwETdt2pTvOTp79iw1dbX+f5S8qTlL2OvTzNKcmZmZ+ZZXnISGhrJm\nnVrU0NJkWdtyXLt2bZEmuX348CFXrVrFjRs3fle5/+Li4qivry+XWzQ9W8yKlSoxIiIi3zITExMZ\nEBDAoKAgmRv4kydPOGPGDA4bNoy7d+/+7j5j3zPBwcHU0NUiqhvmnGZsaMLSZrqsU69uoeQOVfJt\nUaTGlqIupbH1ZUQiETdt2sQWLVvSvVkz/v7770xLS/ts/du3b9PNzY2amprU1NRk8xa2K7qhAAAg\nAElEQVQteO/eva/uPz09nU5OThw5egxjXr1m/IckLl2xksbGxnz27Jlcfc9WrfjH+vUyN5o37xOp\nq6vL7t27c8CAATx+/PgXb96ZmZls4+VFO3t7jpswkd49etDAwICHDx+WqRcXF8elS5dy4sSJnDdv\nHgUCAbfs2MGEpGRG/H2LLVq2ZOcuXVm1WjUePXpU2m7OnDkcOmKE3E1xz/79dG+WvxhPJNncswXh\nKJA7Rq5jbkB/f/98y/sZkUgknDBhAoVCIfv6+rJzly4UCATcuXNncauWJyQSCR0dHXnk+F8yn6nr\nt27T2Ng43+EnNm7cSIFAQI/mzdnUzY0GBjmfpb1799LQ0JDDR47ioqXL2MjZhbVq1frhk3iLxWKe\nOXOGBw4cKNYQBxWrVMqJbyUTn8uc6tqafPjwYbHppaRoUBpbPyBisZht27Vjg4aNuGvvXu4LDGTz\nFi3YqFEjpqeny9V/+fIlTUxM+PuaNUxMTeO75BQuWrqM5ubmvH79Oi9dupTvIKU7duyga1M3OaNk\n5OgxHD9efmtJIBAw5tVrufqdu3TJ901TIpHwzJkznD17NlevXp2nVY6atWqxarVqVFNTo7mFBX+d\nOo0f0tL529x5HDNmjLTetGnTOHHSZDk9g48dp7Ozc770JMmytuWIukZyxlYJGz3OmTMn3/K+ljNn\nztDZtTEFhvp0qlKRu3btKtJVqYIQGBhIRycnvnjzVvp+RPx9iwYGBnz69GlxqydDVlYWAwIC+Msv\nv3DFihXSz+ahQ4doYmLCtRs28Pbde9z+558sU7Ys169fny/5V69epZmZGW/fvSedi4tXr9HAwIAC\ngYCXI65Ly9NE2ezl48Nx48YVxlC/Ce7cuUOrMtbUMRJQ11rI0prqHD5ieLF8tlXVVHOCn37yXdct\nY8R9+/YVuT5KihalsfUDcvjwYVapWpUf0tJlghc2dXPjxo3yQfNmzJjBAYMGyRkQHTt1oo6ODmvU\nrEmBQMDZs2fn+Udq1KhRnLdwUa5GSdOmTeXqV6hQgWcvXpLW27ZrF6tVr041NTWWr1CB27ZtK/C8\n/BftO3SQ20pMzxZzxKjRnDFjhrTepUuXWLZcORlfsjRRNjt16cIFCxbku99WbVrnRJzOZWUrICBA\ngSP8PMePH6e6tmZOEMZGJkQ1Q2oa6nLWb78VSf8FpW27dvTbskXuvfPp14+tWrXiqFGjuGnTJqam\npharngkJCaxRowbr1W/Amb/NZveePSkUChkWFkYyx+Bt4+VFGxsburm7/6dv4ucYOHAgZ8+bLzcX\nnq1as6mb/MPP9Vu3aW1treCRfhuIRCKamJtSpaL+/4OQNjajprEe16xZU+T6mFmaE7U/ebByM6e2\noZ5Cg/4q+TbJq7GljO74HXHkyBH06NUbpUr9P+heiRIl0LtvXwQfOSJX/3ZkJFxyOc3p0aIF2rRt\ni/OXr+DKjZvYt38/Nm7cmCcdLC0tce9ulFz53bt3YWFhIVfu6+uLab/+irS0NGzauAGzpk/H7Lnz\n8PJtPH5fvQbz5s/HihUr8tT31+DTuzeWL12KxMREadnjR4+we9dO9OjRQ1pWp04duDZpgmauTbBn\n9584duQIenTriof372PIkCH57nfqr1Og+UIEvMvIyaUmJko+S4NATRtt2rRRyNj+i7dv36Jdpw7I\nsFUHzLVygiwK1ZHmqIH5C+bj9OnTCAwM/KaT1H5ITISJiWxcomtXryIoIAAamlowtbBEwIEDqFy5\nMmJiYopJS2DKlCmoWbs2Tp05g19+/RWbtm7Dtp270KNHD4hEIjg7O+PQwYN4/PgxToSGolWrVnIy\ngoOD4dW2Leo3aIBx48YhNlY2DGHcmzewLW8r185QaIhSuYTI0NDQQFZWluIG+Q0RGhqak7Dc7KOE\n5WolkGaphqUrlhW5PuPHjIPmsywgS5xTQKJkTDqszCxQp06dItdHyTdKXiyyorqgXNn6T0aPHs3p\nM2fJPcWuWbeO3by95eqPGzeO4yf+Ild/yLDhnDJtuvT/0FNhrFixYp50eP36NQ0NDRl87LhMChRz\nc3OeP39err5IJGKfPn1oZGREXT09me2Oj9On5LYNqggkEgnHjh1LExMTDho6lL18fKivr5/rSqBY\nLObu3bvZxsuLbu7uXLJkSYFyQR46dIjmVhbU1NViaQ11urg2ZkxMTEGGk2dq1a1NqOSSfsTZlCXU\nVan+P/bOO6zJ64vj35BAQiAkIQlbpogbFVQE96xbwfGzalVU3Bsnto5aW+u2bsVtFWsdiAPcW+tG\nRUREREBBVGYCWef3RyoagxVkqvk8Tx597nvHuS/vOO+9Z5iZkJmDhDimXOrm273Uzn9xmD17Ng30\n99daaXSrWpV27N6tkwOwa7du5SanQCDQcqx4+2vQoCGdOHHik+3nzp1LlV1dacOmTXT89BkaO34C\nWVtbU0xMDD19+pSeP39Ov/76K/X74QedMVq0bEk8Ho8exT/VKg+cMpWGDh1aKvOVSqWUkJBQbkb4\nwcHBZOIk1k2r08SKeAKzMpdHpVLR2PHjiG3MIb6dmLh8U3KvV5eePXtW5rLoKXug30b8+rh69SrZ\n2dlp2UC9TM+gGjVr0sGDB3Xqv/Wwez958IFDYcTj8WjmT7PyXdJT36QTl8sttBynT58mOzs7qufh\nQY2bNCWRSFRgKIX3OXHiBFlZW+u8LGRKFblWqUL3798v8vkoLCkpKXT27FlauHAhrVy5kpKTk0tt\nrA9RqVQUHx9fpl50UVFRmnANTIYmx+D7LyShEcHB9J0S1sKGjO0ENGbcmDKTr7C8fPmSnJ2daeSY\nMfTPzVu0ftNmsrGx0fHue5meQVwut8jbiWq1mtauXUvu7u4kEomoTdu2dPbs2f9sk5CQQKNGjSI3\nNzfy8PCgJUuWEJvNppTXb3Su61atW+s4cHzI8+fPSSAQ0JPEJB0F0tLKiiwtLUkoFJKPjw/Z2NjQ\n1Okz6HHCM4p+HEcjx4yh6tWr06+//koODg60ZPkK2rv/AA0YNIgcHBxK/GWfl5dH48ePJ4FAQDY2\nNmRhYUELFiwoczupyMhIjfdfS92E5c1btShTWd7n5cuXdOLEiY96Zhe37z179lBoaOh/OkTpKXv0\nytZXyk8//UTW1tYUOGUqzZj5Izk6OVFAQMBHH3jHjh0jBwcHcnV1JRtbWxKJxTR+4kTy69mTKtnb\n04NHsbR3/wFq2LBhkeRQKBR09uxZCg8PL1QMmfR0jQfi87RXOi9KgUBAKSkpRRr/9u3bNHbsWOrz\n/fe0cuXKAsNaREVFUdOmTUkgEJBIJKK6devShQsXijTOl8ixY8eIX0lMsDMhWBu/U6waWRAMDXRf\nUj6WxDU1yU8GnpiYSBcvXqTU1NRynolGGRk/fjxVqVKFXF1dybVKFR2lJlOWS1wut8jed9OmTaN6\nHh507PgJik9KpuAtW8jCwoIiIiIKrJ+YmEh2dnY0MXAyXbt1m44dP0EtWrYiJ2dnWrhkqZZMDx7F\nklAo/KRMO3fupO6+vjpzin2aQAKBgKQKJWXKcmnJ8hVkY2NDffv2JaFQSGKxmIYPH57/Nzpz5gz1\n79+f2n33Hc2dO7dUlPuAgABq36FDftL3O/ejqG69erRo0aISH+tTdOzciTg2AoKXhcY4vYbwsxKW\nfwksWLCAOFwO8ezFZGYrIh7fjI4ePVreYun5F72y9RVz+/ZtCgoKoqlTp9Lly5cLFTbBysqK/li1\nmnLkivwH+px586hps+Zkb29PBw4cKHW5+/XrR/5DhlBWbh7JlCrKzpPTiNGjydfPr0j9bNy4kSwt\nLenHWbNp4+bN1LVbN6pataqWwvbmzRuysbGhZX+spExZLuXIFbRj924Si8UUGxtb0lOrUCQmJhLH\nxFhjFG/OJhgzCTZczb+mLN3tl1Y2xDI0pOTkZOrYpRNxTIyJbyMiDteY/IcMJrlcXt5TIiKNx5+1\ntTWdvXhJSzEJ3rKFGjduXKS+UlNTic/n63jK7vrrL/Ly8iqwzYQJE2jMuPFa9dNzpGRXqRKJRCKa\nGDiZIk6eopVr1pCDgwOtWLHik3Ls37+/QAP3G3ciqZK9vVZZd19fWrNmTZHmWVKkpqaSQCDQ+Vi6\ncSeSrK2t8xX1siI3N5emTZ9GApGQmCwW1fdqQOfPny9TGcqC48ePE1fA09zLb+9XTzFxTU3o+fPn\n5S2eHiq8slXsRNQliT4Rdelw5coVDA0IwLVbt7XKs7OzYS0WITg4GD/88EOpy5GRkYFevXvjQVQU\n6jdogBs3bsDZyQl79+6Fubl5ofp48+YNnJ2dce7SZbhWqZJf3vd/vRETHQ2JRIK6deuCx+PhwcOH\n2Lpjp1b7H2fMgEohx5IlZW9IW5b0+6E/9p0Mg8zBCFCogdRcGKUpQCqCoqE5YPReXsjXeaj0mgt3\nd3ccv30Bec4cgGkAKNQwjpFh+Pf+WLJocflN5j327t2L0aNHY+yEiXB3d8e5s2exOXgjwsLCimSM\nfOzYMfy+cBGORERolSuVSvC5GuPyD3Nn1qtXD8tXrUb9D8aZPmUKWAYMKJVK/HPtGmxsbDBi+HC0\nbNnyk3JIpVI4ODgg5O998PbxAaBJXD2gb184Ojnh5/nvUlAtW7IEL5ISS9Wh5GNcvnwZ48aNx7nL\nl3WOWYtFiI2NzU9to6fk6NilE47EXgRsTYAsOZCYA8hUYCqBySMn4Ndffy1vEb95CpuIWu+N+A2g\nVqvBYummwWQymWAymejdu3eZyMHn8xF+7BjCwsLQq2dP7N+3D6dOnSq0ogUAERER8GncWEvR2rFt\nKy5euID+AwZi0pSpUIOBpUuXwsFRN9FvI29vPIiOLpH5VGQ2B2/C6H5DYXJfCtaddNiQABvXbsDo\n0aPAjZYBGXJATUBaLriPczFt8lQcP37inaIFAIYGkDmzsW7dugrj2dajRw8cOXIEj2MeYsnC35En\nk+Ly5ctF9vqSSCRISHiKDz/uEp89g0AgKDD3HZ/PR0rKC53ylJQXcHJywtKlS3HxwgX8tWcPvLy8\nsHz5crRt1w6dOnfGjh07oFKp8ttkZmbi0qVLePHiBXbs2IGe3bthqP8g/DJ3LjzruOPWrZuYOmOG\n1jg3rv2DKv9e92/evMHChQvh6+eH4cOH4/r160Waf1FxdHREbOwjZGdna5XHPnoEQ0NDfZLlUiL5\neTJgzARSZcCtV4AxC7A3hUpgiMVLl+DGjRvlLaKewlKY5a+y+kG/jVgqvN1+OXPhotYWwKKly6h9\nhw6f1eerV6/o2rVrRba1Ki67d++mjp065c/hVWYWiUQiunEnUmtuS1f8QU7OzjrbM9ODZtKYMRXP\nGLy0UCqVlJ2dnb/VrFKpaPHixWRpa00GTANyq16V9u/fT1euXCG+tUh3i7G1LXFMjCuE/VZJolar\nqU6dOrRk+Qot26+u3bvT5MmTC2yzZcsW8vSsTy/TM/LbXLz6DwmFQi0bqZycHGrYsCF17NSJ/tq/\nn7bu3En16zeg77//nlQqFc2aNYsEAgHVr9+ALC0tqXWbNnT37l1atmwZTZ8+nVavXk1isZhWrFpN\no8aMpV69/0c9e/cmKysrysjIoMTERHJ2dqbeffrQ9l27aO68X8jKyorWr19fquesb9++1LtPn3zH\nmrhnidS4SVOaM2dOqY5bVsTFxVFkZORn50ItDSZOmkiGTgKCkYFuLK/qAqpX36O8Rfzmgd5mS8/7\nHDhwgCQSCU0Pmkl/7tlDQwICyMrKiqKioorUj1wup9GjR5NAIKC69eqRUCikAQMGlFlgydevX5NA\nIKDIqAckU6roaMRx8mrkraNUvc7KJgMDA9qwaRPlyBUkVSjpYNhhkkgkxUpX9LWRmZlJCxcupHoN\nPMiAxdQkm37/gd7QggQiYana5Dx58oSmz5hOvfr0pj/++CM/12Vp8+jRI3Jzc6N6Hh7Up29fsrW1\npW7dPx4GQ6VS0bBhw8jKyoqGDhtGfj16kFAopP3792vVW758OXXs1EnLa/JNdg5VcXOjCRMmUN16\n9Sj2aQLJlCrKkMpoyrTp1KhRIy3by0mTJpEZn0/Tg4Jo4+bN1K59e3J2dqYXL16Qv78/TZo8Ret6\nv/sgmgQCAb1586bUzld2djYNGDCABAIB1axViwQCAU2ZMqXM7bVKmujoaKpVpzYZ87hkKuKTuURE\nISEh5S0WEWnsL03NeARuAbaWLW3I0MiwWOFp9BSfwipbeputb4ioqCisW7cOCc+ewb12bQwfPhxW\nVlbIyMjAnj178OzZM3h6eqJjx4469ipvmTJlCm7dvo0tO3ZCJBIhMzMTo0cMh4mxMTZv3gwASEhI\nQEhICLKzs9G2bVt4e3uDwfjklnahCQ4ORlBQEIYOGw6FQo59e/ci8oH21uCrV6/gYl8J1atXx4sX\nL2BkZAQ2m41Vq1ahdevWJSbLl0xmZiY8G9ZHYs5LyMwZGnsQJQE1hACXBWQpwH2ci59nzMLECRNL\nRYajR4+iR6+eUFoYQc4mcHMMwFMa4dqVf1CpUqVSGfN9VCoVTp8+jaSkJNSrVw+1atX6ZJuoqCgc\nP34cPB4P3bt3h1Ao1Dre7rvvMGTYMHTu0lWr/LdffsG6NauxM2RPvn0WoNnmr1WtKkJ274anpyfS\n09Ph5OSEsxcvoYqbW369SePH4+D+fXj95g3u3I/SOT++XTrDf9Ag9OjR43NOxSdRq9U4fPgwdu7c\nieycHPTs0QP9+vX76LPiS0Amk8HByRFpQgXIxhgwYAAZcnAfynD8aDi8vb3LW0SEhobCt09PqBqJ\n3wVxBQClGoaX0pD+Jh1cLrf8BPzGKazNll7Z+sa5evUqunTpgsZNmsCtajWciIgAkRoRERE6L5Hc\n3FzY2Njg6s1bWg/6jIwMVHVxxqNHj3Do0CEEBgbCr2dPCIXm+HvvX6jv6YkdO3aU6EM5MjISmzZt\nwouUFJw6eRIbN29B2+++yz8+Y+pUvHqZii1btuDJkydQKBRwdXUt0BbnW2X+r/Px85qFyK3ybyRu\nNQFxmUBCDgwNDcEz4+HHoJkYN3ZckZRluVyOixcvQq1Ww8fHBxwO56P1LK2tkO7MBATvoqAz43PQ\nsVYzHNx3oNhzLAtiYmKwatUqPIyJQRVXVzx48AB9BwzA//p8r1XvxxkzsGLZUiS/TIOJiYnWsT49\ne6Dv99+jR48e2LNnD7Zu24a/D4Zq1XkSF4em3o1AAC5cvgJHJ22bxC4d2mP4sGHw9fUt8TkSEQYN\nGoSbt25hSEAAWCwWNm8Mho2tDf7eu7dAm9AvgR07dmDE9PHIrqp9jTISc9CxShMc+uBvUFooFArs\n2bMHO3f/CSNDIwzo/wO6du0KAwMDqNVq2Ds5IEkgBSyM89swn0rR3MkDJ8KPl4mMegqmsMpWuW8d\nvv+DfhuxTFEqleTk5ER79u3TitI9dNiwAqNPJyYmkpWVVYGBSWu7u9PRo0dJKBTSnftRWtsn3j6N\nae3ataU2j7Nnz5JYLKb+AwbQ/AW/U6vWralatWoVxjU6Pj6eJk2aRK1at6ZBgwbRtWvXylskIiJy\n96hDqFuAnZYTjyZOnEgqlarIfR4+fJj45gIyszInMxsR8fi8j27JnD59msyszHXHb2ZNLEPWZ41f\nWqhUKjp16hTt3LmTYmJi8svPnDlDYrGYps0Iov2hh2h60Ezi8XhUt149ep2VnX8fPElMIisrK6pd\nuzbtOxiqde9kSGVkaWlJDx48ICKikJAQ6tCxo849FhXziKysrGjYiBE0YvRorWP/3LxFQqGw1LaU\nwsPDqVr16lpzypTlUoMGDWnXrl2lMmZZMGvWLIITT/carC+hylWrlIkMcrmcmrVsTiZWAk0e02oC\nMpXwqWfvnvlby5cvXyZTPo+MHc0JVfhkUsmcLG2sKlxC9m8R6HMj6vkUly9fBs/MTGu7g8FgYMaP\nP2HXrl1vFeB8LCwsoFarEfPwoVZ5amoqEp4+xc2bN9HN11dr64PD4WDS5MnYtWtXqc2jadOmuH//\nPtxr1ULq82QMHDAAN2/ehJWV1acblzJ37txBgwYNoFQTxk2YCNeq1dC5c+dSPR+FhcPmACrdlWRD\nMCEUCou8CvjkyRP06N0TGc4sZNY0RmZ1DrLcOBg0xB93797Vqa9Wq4GCvgcZAKkrzgp3TEwMqlev\njomTJuHAwYPw8fHBgAEDIJfLMXr0aKzdsBGz5s7Fdx064Kc5c7Bp6zYkJSWhQb26+HXePMycPh2N\nPD0wZswYzJkzB+PHjMaF8+dBREhOTsbggQPg7eODqlWrAgDatm2LSxcv6txnq1euRJdu3RD00yyc\nOXUK3Tp1wqaNGzBz+nR0aNsGq1evBo/HK5VzsH//fgwY5A9j43crK4aGhhgcMBT7D3wZK5AFUb16\ndZjmGeqUMzIUcC/ElnJJEBISgutRt5FTnavJY2prguyaJjhyIgInT54EAHh5eSHu0WPMHTUdAS16\nY8nMX/E4JhYODg5lIqOe4vNlrv3qKRFycnIgEAh1ygUCAWQymcao773tI0NDQ0yYMAGDfuiPTVu3\nwa1qVTyNj8fwoUMxaNAgEBH4fIFOf3yBADlSaanOxcLCApMmTSrVMT6HwMmT8ePs2RgSMAwA0KZd\nO7Ro2RJdO3aAr68v2AUkEQY0CmxISAhev36N5s2bo2nTpiVq9wYAQ/2H4N7MQOSISWOrAgC5SjBf\nyj8rHMi69eugtGBrbQnCzAh5lkqsXLUS69au06rv7e0NkiqATCZg9l5y9WQZWrdrUyG2fNVqNbp3\n745RY8diSMAwMBgMyGQy9PLtjqlTpyItLQ0dOnXSatOxc2eMHTUSP8+dixs3boDDZiMiIiLfHkwm\nk2FkwFCkpKSAwWCgf//+WLBgQX57gUCAJUuWoG3LFhg6bDgcnRyxd88exMXFIeLUaUgkEly4chXz\n5s7BvLlz8UP//rhw4QLc3vvIKWkYDIZGOS7g/FSEv9Pn0q1bN0yaEghZfDZUlTia++BVHoyfKxC0\nO6hMZNixaydyRIx39yAAMBnIMQdC9oTk25hKJBIEBgaWiUx6SoHCLH+V1Q/6bcQyJSMjg4RCIT14\nFKu1JbFq7Vpyq1qVxowZQ0ePHtXazlGr1bRgwQKytLQkiURCIpGIgoKCSKFQ0LVr18jBwYFeZWZp\n9Tdo8GAKCgoqx5mWD7m5uWRkZETpOVKdLSEPT086d+5cge1mzpxJZnw+CSTmxBJxiSvkUas2rUs8\n8a9CoaCOXTqRiYhPcDEjlrOAjE25tHDhwiL1c+XKFWrdrg0ZGrMJ1QS6WzK1zKl1uzYFtt29ezdx\neSbErCwk1DInjqM5CUXm9OjRo5KYYrE5f/481ahZUycf47Vbt8na2ppEIlF+RoS3v6zcPBKLxf+Z\nm1CtVtPr16//8296584dGjduHPXq1YtMTU21th/fZOdQs+YtaMmSJaUxbR1OnjxJVdzctMJepOdI\nqZ6HB/31119lIkNpkZCQQM1btSAjDps4Jsbk6OJE4eHhZTZ++04dNNuHH9w3DFc+BQwfVmZyFAWF\nQkGnT5+mY8eOFSpd29cM9KEf9BSGFStWkIOjI63buJHOXLhIM2b+SFwulwb6+9Mvvy2gWrVrU9du\n3XRiz8jlcnr+/Dnl5eWRWq2m58+fU1ZWFg0cOJDq129Au/76iyJOnqIBgwaRq6urVhwilUpFa9as\nIQ8PD7KzsyO/Hj3o1q1bZT31UkculxOHw8mPS/S+XVz1GjXo6tWrOm2mT59ONjY2tHbDBjp8LJz6\nDxpIxnwTYlua0W+//VbiMqrVajp16hSNnzCBgmYG5dsNFZazZ88Sl2eiUbKceQQJRzdOl6M5zZ07\n96N9REZGUsCwAGrVtjXNmTOnzGO3/Rd///03dercWUdZfpWZRUZGRuTt7U2r1q7VOrZm/Xpq1KjR\nf/YbHR1NK1asoI0bN1JaWton5Th16hSJxWLq2KkTBQwfTnZ2dtS3b19SKBT08OFDOnfuXKmGfVCr\n1TR06FByq1qVfl+8hJYsX0G13d2pV69eX3zoh7e8fv2akpKSyjyxdkhICJlYCAgt3stZ2tyaTIS8\nTyZGL4icnBzavn07zZ8/nyIiIkrc9vHUqVNkLhERz9KczGxFxDU1oXXr15XoGF8SemXrK0WpVNK1\na9fo6tWrJRZ8Lzw8nLp260a13d2JLxDQibPntIx3GzdpShs3biyw7d69e6lKlSokEomIx+NR3759\nadWqVdS6TRvyatSIfvrpJ52Xybhx46h+/QZ0JDyComMf06Kly0gsFlcYw/GSpGevXjQ9aKbWy/jv\nAwfJ2dlZ5yH47NkzMjMzo6fJz7Xqj580idi2fHJydflsOTIyMmj58uXUvYcvTZg0kR4+fFjcqRER\nUV3PeoSawvwXBIyZBCdTQjNrQnNrMnAVkLlY9MUGRU1ISCChUKijMG/ZsYOaNWtGd+/eJWtra+r1\nv//R4mXLqXefPmRtbU2RkZEF9qdWq2ncuHFkYWFBg4cOpZ69epFAIKDdu3d/UpasrCzavn07LV++\nnG7fvk1JSUnUvHlzsrGxoUaNvEkgENDMmTNLTVlQq9UUERFBQ4cOJX9/fwoNDa1QTgxfKkqlkrp0\n70omYj7BlU8MVz6ZmJvR0GEBRf5b3rx5kwQiIZlWEhHTmU+mEgHVrute5CTtH+PFixdkwjPVdqxp\nZEFcMxO6ePFiiYzxpaFXtr5CTp8+TU5OTlS1WjWqWasW2dnZ0aFDh0qs/9mzZ9O4CRN1vuJ3791L\nbdq21al//PhxsrGxoYiTp0iqUNLztFc0bMQI8vHx+ehDIiEhgczNzXUS2q5cs4Y6dupUYnOpKDx7\n9owqV65M37VvTwsWLaYfBg4kiURSYNLc4OBg8u3RQ+f834t+SFwzU7K0sdKqn5SURMNGDCPrSrbk\n5OpCv8z/hXJzc3X6TUxMJCtba+LamxOqC4jlotku3Lt3b7HmplKpiMFgEFq+9ysBv2IAACAASURB\nVEXe2JJgaUxggAyYBvRdx/YVZkvwcxk1ahR5+zSmMxcuUlLqSwresoUsLCzo9OnTRKRZEVm2bBmN\nHDmSli1bRq9fv/5oXyEhIVSrdm0t5e2tJ2FiYmKhZVKr1VS/fn0K+vGn/G3MuGeJVM/Dg1atWlXc\nKespY1QqFR05coR+GDiABg8dQqdPny6yoqVSqcjW3u7dx8+/SeaNHAQ0aPCgEpFz4cKFxHHU9SBm\nuAnIr6dfiYzxpaFXtr4ynj17RmKxmA6GHc5/SB8/fYYkEkmRt34+RlBQEE2ZNl3nZX/gUBg1b95c\np37rNm1o07ZtOltkblWrftQeadeuXdTd11dnjKTUl8Tj8Yosc2pqqtYWZUUkJyeHgoODacyYMbRw\n4cKPbpPt3LmT2nfooHNuLl+7TqZ8HvkPGZxfNyUlhSysLYnlJCB4WRA8xcS24JFNJVtq3rolBQYG\n0tOnT4mIqEevnsR0+cAmpIGETM14JJVKP3tearWauKYmBB9L7b5b2ZCJyIwuXbr02X1XJN6mOHJz\ncyMzMzNq1br1R6/vT9G+QwfaunOnzt/Yf8gQWrRoUaH7uXLlCrlWqaJjS3bizFmqVq3aZ8mmR8OV\nK1fIt6cf1axTmwYN9v9iMk5cvnyZeBIBoZWN9v3YxIrYHHaJrHiOHDWK4Gqma5dZV0T1GnqWwCy+\nPAqrbH25biTfGMHBwejRu7dW4M7GTZpg8NAArF27tkTG6NKlC0J2/amVbJaIELxxAzp37qxTP+r+\nfTRu0lSrjMFgwKdxY0RFRRU4hkgkQlJikk55UmIiRCJRoWW9ceMGvL294erqChcXFzRv3hz37t0r\ndPuyhMvlwt/fHytWrEBgYCAsLCwKrNexY0dcuXwZt2/dyi9Tq9X4ee4cMAiY/dOs/PIlS5cgnS2H\n0sUEMDUEVIS8NzlINsjAmdTbWLEvGDVq1cS1a9cQGhoKle0HgUXNjJBNebC2tcGESRORnp5e5HlJ\npVJ4eTUEMzIdSM7JDyPBeC6DmG8OLy+vIvdZETEwMMDEiRMRHR2NjIwMnDh+HE2aNPmsvtLT02Fl\nqRuSxMrKGq9fvy50P/Hx8ahVq5aOh2ptd3c8ffr0s2TTA+zevRst27bC/siTuMdMxraz++FR3xOX\nLl0qb9E+SWZmJhhslnaUeQAwNIBcrijQm7SoeDdqBFMpCyDt0CxGGWo08W5c7P6/ZvTK1hdCfHw8\nateurVNeu447niYklMgY9evXR7t27dCyaRNs27IZ+/f9Db+uXZDy/DmGDRumU9/FxQU3b1zXKiMi\n3Lh+HQkJCQgODsaTJ0+0jrdo0QIpKS/w996/8svy8vLwU9AMDBo0qFByJiYmon379hgcEIDElFQk\npqSiR+/eaNOmDdLS0j5j5hUDPp+PDRs2oGO7thg1fBh+//VXeLjXRtS9e7h546ZW1P7Dx45Abv5v\nRH4iIDodqCkEXPmAhTHkzlxkV2Jh0NDBOg/GfJhAhgVh9d7N8PJphLy8vELLGh0dDUdnJ1x9eBsq\niRGQLAUuvIDJnWxI3rBxNOxIiYeq+Bpo0bw59v61R6tMoVBg/76/0apVq0L34+7ujksXL+r8zU6f\nOlngc0LPp5HL5Rg+agSkVbmgSiaAkA2VIxc5DoYYNnJ4eYuXDxFBoVDolDds2BDyNzmATKl94IUM\nng08SySDR48ePSDhCMCKkwJyFaBSg/EsB5w3akwcP6HY/X/N6JWtLwR3d3ecOX1ap/zMqVOoXcTg\ne8+fP8fOnTtx4MAByGSy/HIGg4G1a9dizuzZOB4ejp3btqFTx444ffq0TnoRABg/fjxmTJ2Kh9HR\nICJEhIejRZPGiHv8GEeOHsWJU6fg6emJwMDAt9vEYLFY2LdvH6ZOmoR2rVph5LAA1KjiClMTE0yb\nNu2jMsfHx2Py5Mlo36ED/Pz84NezF/r2/wEsFguGhoYYEjAMbdq1w6ZNm4p0Lioafn5+uHPnDlxd\nXJCVkY7fFyxA7KNHqFy5slY9c3OR5mEHADn/PlzNP4jZZWmM2JhHaNWqNQySc7WPZSk07Wy4kLty\nkZSegj17tJWA/6Ln/3rhlUiJHDdjwNkM8JSA4cCDg5UdEp8moFq1akWd+jfBuHHjcDw8HJMnTsTd\nyEhcOHcOft26wsnJCS1atCh0P1WrVoW3jw8G/dAfiYmJICKcOXUKk8aNQ1BQ2cSH+tq4c+cO1CyG\nVsw3AICFMR5GP/ys1d+SJC8vD4GTA8ETmIHNZqNKNTeEhYXlH+fz+Zg7aw64UVLghRTIUsAgIQfc\nZ3KsWLq8RGRgs9m4cukyenq3h9HV1zA4l4IW9h64fOES7O3tS2SMr5bC7DWW1Q96m62P8ubNG6pU\nqRL98tsCepWZRW+yc2jZHyvJ0tKSkpOTC93P7NmzSSgUkq+fH7Vs1YokEkmxYsqsXLmSxGIxWVlb\nk62tLf36+++0ZPkKqlO3LnXz9aVnL1KoVu3aOik9cnNzad++fbRmzZpPhn34559/SCKR0IRJgfT3\ngYNU292dduzerWP3snbDBhowYMBnz+VLYu/evRrvpWbWhEYWBA5T11ajpQ0Zcdh069YtklhakLGD\nucZ41smUYGSgbUjrxqe+P/Qr1NhxcXFkzOPqjtdCM96H3qcqlYoiIiJo2bJlFBYW9tWECvhckpKS\nqF+/fiQSicjMzIyMjIyobbt2WmmACoNUKqVx48aRQCAgLpdL1atXL7WYV1evXqXAwECaMGECnT17\ntszDI5QFd+/eJRMBT/e6bm5NhkaG5R5PqptvdzK2FRC8LTUy1hGRsZkJHT16VKteaGgoeTdtTPZO\nDtSjV8+PesYWF7Va/VVeB0UFegP5r4/Y2Fjq1LkzGRsbk7GxMbVu04bu3r1b6PYHDx6kKm5uWqEF\nTpw5SyKRqFhG5sePHydHJydKfZOuFTKifoOGtGXHDvpzzx5q3abgoJaFwdvbmzZt3Zrf98TAyTRh\n0iQdZStg+PD/jOf0NaFWq2n0mNHEMeUS21FIDDaTUEvbS4hRVUCeXvWJiOjVq1e0YMECsq5kSxCy\nNUb179VluQgocHJgoca+f/8+mZoXYCTbyoY4plwtr7qUlBRyq16VeBYCYjubE8/anBycHPON979F\nkpKSyNLSkv5YvZrSc6T0OiubFixaTLa2tv/pyfgxFAoFZWZmlsqLT61WU2BgINnb29PMn2bR7Lk/\nk0vlyuTv7//VvWjVajU5VXYm1NS+j5iVBdTmO11v7LIkJiaGjE252rG4/g0Y7F6vTrnK9q2jV7a+\nYqRS6Wd9ZXXs1ElLaXn7+75fP1qxYsUn27969YoiIyN1kt2OHTuW5s77RaffjZs3U3c/Pzp36TLV\nrVu3yPISEaWlpRGPx9OK0n3/YQyJxWLaH3qIpAolSRVK+nPPHpJIJJSUlPRZ43ypxMTE0B9//EFB\nQUFkasYjjpM5oaqAjB3MSSASUlRUlFb9CxcuEJdvqgnR8F6cHGNTbqG9WpVKJYktJQRPsfaD392c\nHF2ctF7C7Tt1IENnodZqAbOKkBo0alii5+FL4scff6RhI0bo3C+9+/ShxYsXl7d4Wpw/f54cnZwo\n+WVavpxpGZlUs1YtCg0NLW/xSpybN28S31xAXAdzgosZmdqZk6293X9mAygLQkJCiOco0f3A+XfV\nTU/5UVhlS58b8Qvk/WSwReHly5ewd3DUKXd0dEJqaupH20mlUowePRr79u2Dja0tnicnY/jw4Zg3\nbx6YTCbUajUYBeRHMzAwgFqtxoF9+z7be4vFYoGIoFQqwWJpLldnFxds37ULvf38IBBocjGamZkh\nNDQUNjY2nzXOl4qrqytcXV0BAGPGjMHG4I24HxWFenXqwt/fH+bm5lr1fXx8MGfmLPw46yewJFyA\nGFC+ysHqlavzEyF/CiaTifVr1qHfgP6Q2ShBPBYMMlXgPJdjw771+YbxGRkZOHniJBRe5loeUio7\nY0T+cxcJCQnfpJ3H3Xv30PN//9Mpb96iBa5WMK+3kJAQ+A8ZCqHwXQ5VExMTDB85Epu3bMHhw4dx\n8OBBMBgM+Pr6Yvbs2RCLxeUocfGoW7cunsbFY9euXXgU+wj16taDn58fOBzOpxuXAiqVCtnZ2bCx\nsQFlywEy1PY2zFFCYlmwd7OeioXeQP4bwrtRI4SFhmqVqdVqHA47hMaNP+62O2LECGTl5CD6cRxu\nRt7Fjci7OH/hIn755RcAQPfu3bFty2bk5OTkt1EqlVi/di2ICLt27vjsJNF8Ph/ePj5Y/0F4i1ev\nXqFSpUo4cuQIIiIisG3bNmzduhWdu3TB7NmzkZKS8lnjfclYWloiaEYQ/tyxE4GBgTqK1lsCAwMR\nH/cEK+csxppfliIpIREDBw4s0lguLi5wd3cHMz4HrPuZqGlij/NnzuUnzQWArKwszYr1rVfAxRfA\n3ddAphwwYMCQY4SMjIziTPeLxdHBAXdu3dYpv337NhwdHcteoP9ALpcXqGgQEc6eOQO2MRenz1/A\niTNnoQLQrFkzredAWZGWloY3b96USF98Ph/Dhw/H4kWL0bdv3xJXtG7duoW27dvB1IwHW3s7zJ8/\nH0qltgehUqnE9BnTITAXQmJpgW5+vuAacsB8JnvnXSxXgZsgR+DEz3u26iljCrP8VVY/6LcRS5WE\nhASytram2XN/pkfxT+n67TvUo1cvatas2UfTbjx//pyEQqGWPZZMqaK7D6JJIpGQQqEgtVpN/v7+\nVKNmTVq+ciWtWb+eatWqTUKhkH744QeKjY0tltwxMTFUqVIl8uvRg5au+IN+GDiQLCws8nML/vnn\nn2RpaUmz5/5Mu/fupSEBAWRjY1NiKWn0aHP37l0yNeMRw01AaGxFqC8hrrWAuvfw1ao3bfo0YnBZ\nBHdzjVFvFT7B0IBQXUh8oaDEE2t/KURHR5NYLKaIk6fyAwHvDz30yeTV5cGhQ4fIvU4dypDK8u/9\n7Dw5Obu4ULfuusGJO3TsSOvWlV2evKtXr1IN91pkZMwmQ7YRefk0yr/vFQoFpaSkkFwuLzN5PsXt\n27c16W6qCghNNPeOsbWAfD+Ivj4kYChxrQUa55fa5gRzI2KwmcTjmxGXb0p8OzFxuMY0euxofcqk\ncgaF3EZkEH0kBk85wGAwqCLJ8zUSGxuLOXPmIDw8HFwuF3369MHMmTMLDO0AAFeuXMHYseNw7vJl\nnWM2EjFiYmIgFotBRDh8+DD++usvKJRKdOvaFb6+vvlbf8UlIyMD27dvx/379+Hs7IyBAwdCIpFA\nJpPB3t4eh8MjUNvdPb/+0sWL8c+Vy9i/b1+JjK/nHV26d0VY1DmQ/XvXjIpgfD0D/1y6gpo1ayIt\nLQ2VHOyR68EH2O/F90mWwiA2E+tXr8PgwYPLXvgKwtGjRzF8+HCYmJpCpVJBpVQiODgYzZo1K2/R\ntFCr1ejZsyeSk59j2KiRYLFYCF6/AU+exGH2zz/jf32+16q/ZVMwrly8iC1btpS6bPHx8ajlXhvZ\nlViApca0gpEkhfAVE2NGj8Gy5cuQJ88Di8nCqJEj8cu8X0ok1hSgOS83btyATCaDsbExDA0NUatW\nrU/237FLJxyNuaiJ4/WWf++da5evokaNGu/unfoCIC4TeJ0HOJgChgZAshQ2HBFWLF2OJk2afDRA\nsp6yg8FggIg+GVRQb7P1jVG5cmVs37690PVdXFzw6FEM0tPT8+2jACD6wQOw2ez8MgaDgU6dOqFT\np04lLjOgWdofPXq0TvmlS5fg6lpFS9ECgKHDhmHWzCCo1WoYFGBPpufzuXDhAsjtg5heTAYg5uDi\nxYuoWbMmrly5AiORCXLZH7x8LI1BD9Lh7+9fdgJXQNq3b4+4uDjcunULTCYT7u7uFfI6NTAwQEhI\nCHbv3o29f/8NlUqFvt/3wfXr15EQrxupPv5JfJnZbC1bvgx5EhZgzc0vo0omyEx9jV+X/Q55VVPA\n1ASQKvHHlnXIzsnByhV/FHvcy5cvw7dnD2RkZyJXKgUZMMDhsGHG5WHH1u1o06bNR9teunQJVE33\n3mGIObh06RJq1KiB6OhosAVc5OapgBQZ4G0JsP69NiTGeBWTg1u3b8HPz6/Yc9FTdlS8u1tPhUIi\nkaBnz54YMnAAnj9/DgB4HBuLIYMGYuLEiSW2cvW5sFisAqMpKxQKGBgY6KOYlwJCc3NAptIpZ8mR\n/6IVCASgPKVu9Po8Fbg8E/3fBRpHA09PT9StW7dCKlpvYbFY6NevHw7s349DoaEYMmQIAgICsHb1\nKjyOjc2vF/3gATZt3FBmivT1WzegMP3gOlITlFm5kFcz1aSxAgAuC1JXDoKDg4ttJ5iWloa27dvh\nhVkOZFIpqIYQaGyJ3PpCpFop0c2vOx4/fvzR9uYfuXeYcoJEIgEA2NvbIy9DCqTKNCt2LO1rI8+C\nhT3vZeDQ82VQce9wPRWGlStXorKLC+rVqglXRwe0aNIYfr6+CAwMLG/R4O3tjaSkRFw4d06rfMXS\npfDz89O/1D8TpVKJhIQEZGVl6RwbN2oMuEkKQPlerrWXMjBlanTs2BGA5u9ixjYFUt6LXE8EzrM8\n+A/6tle1vgbq1auH2bNno7FXQ/Ts3g2+XTqjRZPGWLRoEapXr14mMlRzqwZmzgf5/uRqjbeeiaF2\nOZsJI54x4uLiijXm9u3boRIYArlqwMoYEHPeeQeKOFBYGGHlqpUfbT9u9FhwEz+4d1JlMMxjoH37\n9gA0ylaTJk3AfKPMzzeqhYpgxGbrluup0OhttvQUGqlUipcvX8LKygrsz7jZHzx4gOXLlyM6Ohou\nLi4YM2YM6tSpU2y5wsPD0bdvX/Tq0wfVqlXD8fBwRN2/jzNnzsDOzq7Y/X8LZGZmYsOGDTgScRSZ\nGZl4GB0NFamhUqjQtWtXbFi3HmZmZgA09iqDBvtjz96/wJRwwZQTmHmEo2FH0LBhw/w+IyMj0bJ1\nK8iNCHIjAitdgbq16yD8yDFwudyPiQJA47hz4cIF3LypyQnZqVMnGBkZ/WcbPWXPmzdvEBERAQaD\ngXbt2oHP55fZ2A8ePIBHA0/IXI3fpap6LgWiMwBvC4Dz3qq7Ug32P2/wLD4hfwXpcxg9ZjRWhW/X\npLsyZwM2H9i6vpCinYMXjoUdKbC9Wq2G/5DBCNkTApbEBIw8NYyUBjh25Cg8PT3z66Wnp6Nz1y64\ncOEC0MgCMP53LmoC94EU86fOxrhx4z57HnpKjsLabOmVLT1lwpkzZ9CrVy8MHzkK3j4+uH79OlYs\nXYLNmzfnr4YUh4SEBGzevBmJiYnw8PBAv379YGpqWgKSf/28fPkSHg088UqdDSkfQK4SSMgG7E0B\nGxOw42XwcqmDMye1c3PGxsbi/PnzEIlE+O677wpUhvLy8hAWFobk5GTUr18fDRs2/ORqY1ZWFlq1\nbY279+9BDiUYKsCYxca5M2dRt27dEpz5l0VWVhY2bNiA8IgImJqaon+/fujatSsYDAbu37+P0NBQ\nMJlM+Pr66uTS/Np4/PgxRo0djePhEVCr1WCyDWFkZARLiSUaNqiP0LPhGiXM0ABQqsGJy0Unr9b4\nK6Tw+T8LYtu2bRgVNAHZHKUmt2gNodZx9mMZpvQfhblz5n5S/osXL0IsFqNNmzYwNDQssN7cn3/G\n/N/mQ2XJgZKphmmGATxr1UX40WP6j48Kgl7Z0lNhICLUqVMHQbNmoUvXbvnlZ0+fxshhAXj06FGF\ntln52hk9ZjTWh+2EovJ7X+m5KuBKCtDIEjA0APd6Bq5e1HgaljZDAoZi8+5tUKvUgL0JwDQAknJg\nlMfAm7TXn1wV+xrJyMhA06ZN4Vy5Mvr27483r19j+dKlaN6sGUxMTLBt2zb06NUbSpUSe0NCMGnS\npP9M7P4lk5aWBrdqVZEuVEFtawwQYJAohTDTELExj/4NujoCf/75J9h8LvIypOjQoT22b91e7GtH\nJpOhSjU3JDMyoE7OBhx5gN2/981zKcxeEKLvP4C1tXUJzFRDTEwMtm/fjvTMDHRs3wFt27bVPy8r\nEHplS0+FISkpCXXq1MHT5OdaDwkiQvUqrjgcFlZmdh56dLG0sUKqA70zKH7LvdeAkA3YmoAXK0fw\n76vQs2fPUpWFiMA25kABpUbRe2sc/G9w1IkDR2Hx4sWlKkNFZN68ebgXFYXN27bnrwxmZmbCvXo1\nGBoZ4cr1G2AwGLh98yZUajWGDfZHaGgoPDw8ylnykueX+b9g3oYlyK2snUmDGyPDr5NmYejQoSAi\nyGQyPH78GPb29rCysiqx8ZOTkxEwYhiOHj4CNQgggMViok69eghetwG1a9cusbH0VHwKq2zp1WM9\npQ6bzYZCodDxGlSr1cj9N06NnvKDyWTqeg0CgBoAAwARVOm5+WmBShOlUgmFXA5YcbW9sBgMwN4U\nh44eLnUZKiJhhw/Df/AQrS1YMzMz9OjdGzVq1sT6NWtQ3bUy5s+bh7GjRoLJYuGPP4of5qAicvbC\neeSa6l6vUkMF5v02H2Z8M/AFfHTs0gnGxsYlqmgBmtWtmzdvwsRSAEMHPkxFfDg4OuLwwUN6RUvP\nR9ErW3pKHbFYDM/69bF29Wqt8u1bt8De3h5OTk7lJJkeAOjb53uwnyu0FS6pEnidCwjZMHwiQ41q\n1UvEmeFTGBoawsLS4iPKH4HH45W6DBURtpERZDKZTnlOdjZev3qFvX/twfU7kTh++jTuRT/EhEmT\ncPjwYZ00MF8DLk5OYOZ+cH0o1UBCDtJMZFA2lkDZxAJXX0ejcdMmSEpKKtHx/Xr1QIqJDFnVjaFw\nNkF2bS4SlGnwH/rtBunV82n0ypaeMmHd2rVYs/IP9OzeDUsWLULf3r3w8+zZCA4OLm/Rvnl+nPkj\nXPi2MH0gA55lw+BxFnA1FWwOB+xbmWjh1gBHD5XditJv838DkqWA/L14RGqCYXIehg769l5oN27c\ngLW1NZYsWqi1OpyQkIB9f/+N+Ph4zP9tAWxtbQFoApGOGDUaleztcfz48fISu9QYPXI0jFIUmjyb\nb4nLBPhGIEeexsbPgAHYmSDXnIk/VpbcCt/jx48R8+iRxlbsLQwGFPbGOB5xHNnZ2SU2lp6vC72y\n9Q0TFhaGhg0bwtDQEM7Ozli0aBHUavWnG/4HCoUCK1asgFejRnB3d8fkyZORkpICFxcX3L9/H926\ndkVaygu0btUKDx48KBODaz3/jZmZGW5eu4E1C1agb8POGO87BDf+uY5rl67iadwThB85BpFIVGby\nDBo0CAP7D4DBP680L9GEbHBuZ8K7luc3FXleJpOhc5cu8PPzA4fLxaOYGNSpWQOLfv8dQdOmoYlX\nQ/z044+QSqWoVqOGTnt39zp49uxZOUheutSoUQPbNm0B72EezKJyYXZfBsNUhSbm1QfITYEr1/4p\nsbEzMjJgaGykUebeh8kAw4BRLkm49XwZ6A3kv1EOHjyIUaNGYdnKlWjdpi2i7t9H4IQJaNigPpYu\nXfpZfRIRfP38kJ6egclTp8KMz8eObVtxPDwcV65cKVZ8Gz2Fg4hw5swZPHz4EFWqVEHz5s2/WM+l\nK1euYMu2LcjJkcKvuy86d+5cYrntvgSmTp2KmNhYbP9zF1gsFtRqNWZMnYI/d+zA0KEB6Nv3e1Sv\nXh3ftW+P7n5+GPBesFiVSoWaVd2wJyQE9evXL8dZlB55eXm4ePEiGAwGzpw5gwXbVyLPRdv+kxkv\nhX+rnli/dl2JjSmxskCWGwfgvedQkpYLh0wensTG6QMpf2MU1kD+k5mqy/KnEUdPWeDu7k4Hww6T\nTKnK/yWlviQ+n08vXrz4rD7PnDlDVdzcKEMq0+p30ODBNHPmzBKewddFSkoKTQoMJBc3V3KvV4fW\nrl1LSqWyyH1Uq1mdTCUCMnYWkalEQG7Vq9Lz589LSWo9pYlEIqF70Q+17iWpQkk1atakixcv5te7\ncOECWVhY0O69eyk7T06P4p9S7z59qN1335Wj9GVLUlISmZiZEuqICK1sCK1tCZ5i4vJM6N69eyU6\n1voN64nLNyXUEBK8LAhVBcTlmdDhw4eJiEitVtPr168pOTmZpkydQnYOlcjOoRJNmTqF0tPTP9qv\nWq2mhw8f0r1790ilUpWozHpKj3/1lk/rN4WpVFY/vbJVNsjlcmIymZQjV2g9yGVKFTVv0ZLCw8M/\nq9+ZM2fStBlBOn2GnzhJjby9S3gWXw+pqalkbWdDRo5CgqeYUEdEXCsBdfXtRmq1utD9tGnXllgu\ngncvm1Y2xHIRUIvWrUpRej2lgVqtJiaTSW+yc3Tup7bt2lFoaKhW/ePHj1PDhg2JxWIRn8+nMWPG\nUHZ2djlJXz6cOXOGLG2siCcWEM9CSEKROR04cOCT7dRqNV27do327NlD0dHRhRorPDycmjRvSjaV\nbKldh+/o0qVLRER06tQpcq3mRoZsI4IBgwxMDAl1RYQGEmLbC6hKNTeSSqU6/V2/fp1cqlQmLt+U\nTIRmZGVrTceOHSvaCdBTLhRW2SrfLMJ6ygUWiwWhUIgncXFweS/StEqlQtzj2CIH5FOr1UhNTQWH\nw0F8QoLO8dSXqfmpXvTosmjxIrxiSSF/L6ioVEg4cfokrl69Ci8vr0/2kZaWhnPnzkHpJXyXq43B\ngNKei0sXLyI1NRUWFhalNQU9JQyDwUCTJk2w/++96NO3X375y5cv8c/Vq2i4bZtW/datW6N169bI\ny8uDoaHhF7t1XByaNWuG5GdJuHnzJpRKJTw8PD4amf0tL168QLsO3+Hx0ydgmrGheCVFs6ZNse+v\nv/8zJE3btm3Rtm1brbJbt26hU9fOkDqxgcZiQEVQx2UCjzKABhbIczVEUnQqdu7ciSFDhuS3S0tL\nQ4vWLZFlxwQ8Nc/JnNd58O3ph+tXr6FatWrFOCt6Kgrf3h2pBwwGA0OHDkXghPGQSqUANArT77/+\nCjs7O9SqVavQfe3atQtVqlRBzZo18dtvC/BXSAj+uXo1/3hWVhaWLFyITe943gAAIABJREFUH/r3\nL/F5fC0cDAuFXPzBdw+TAZmAgYiIiEL1kZGRARbbUOOJ9UE/LI4R0tPTS0haPUUlPj4e27ZtQ2ho\nKPLy8grdbt68eZgaGIj1a9fgaXw8joeHo3P77zBy5MiPKs5sNvubVLTeYmBgAE9PT3h5eX1S0QKA\n7j18EZX5FDl1TZFZ2Qiy+nycibyMcRPGF3nsn+fPg8zaELAw1nzwsAwAV77mnnyVCzAYyOETwj6I\nFbd582YoBSxNbDkGQ/MTcZBnaYily5cVWQ49FZNv9678xpk9ezYsJBK4OTuhZ/duqF29Go4eDkNI\nSEih+zh8+DCmTJmCdcGb8OxFCqIfP0aXbt3Quf13GDxwACaOHwf36tXQsEED9OnTpxRn82XDM+UB\ncl0vUENiFjqulKOjIzhGbCBDrn0gUw4jJgvOzs4lIaqeIkBEmDBhAjw8PBB25AgWL1kKR0dHTXLh\nQuDj44PDhw/j9MmTaN28GX6eMxvjxo7FvHnzSlnyb4O4uDjcibwDpQP33WqwAQO5jhxs374dcrn8\nvzv4gFu3b4MEHyh4DAYgNNIkrgZgoADEIrFWlajoB5CxVfgQlYkB7j+4XyQZ9FRc9NuIXwkqlQqr\nV6/Gpk2bkJaWhiZNmiAoKAg1CnAJBwAjIyNs3bpV88C5cwd2dnbw9PQskifNggULsHDpUvg0bgyF\nQgEOh4M16zfg3NmzqGRrC7FYjIiICH14h08wctgIjJk2ATki9buVqWwFGC9z0atXr0L1wWQysWTh\nYowYOwrSSkpAYARkyMFNUGDx0hVgsYp3q9+4cQPnz59HTk4OWrRoAS8vr296BaUwbN26FefOn8f9\nmEcQCAQAgOPh4fD19cWTJ09gYmLyiR6A+vXrY/++faUt6jfJixcvYGhqDNmHYRyMDKBWq5CTk/PR\nZM8ymQwHDx7MT7DeuHFjVHZxQXzCNcDsgzZZCs2qVa4SnBQFhg0N0Dpcr05d7Dl5ENIPxjDMJtRr\nVq+Ys9RTYSiMYVdZ/aA3kP9shgwZQt4+jSni5Cl68CiW5i/4nSQSCd29e7fUxjQ3N6fIB9E0YNAg\nMjExIQ6HQ571G1DLVq1oy5YtpTbu14ZKpaLeff5HXIEpMZ34xHE0J46JMW3btq3IfR05coQaNGpI\nQrE5eTasT2FhYcWSLTs7m5q1bE6GJmyCpTHB1JAYLAOysrWmyMjIYvX9tePj40P7DobqGLh36NiR\ntm/fXt7ifdOo1Wo6fvw4sQxZBCceobGVxqmktS3BQ0w2lWw/6pxy48YNEorNiVdJREZOQjIRmVGj\nxt4UFham8VL0ssh3UEFVPsHQgIztzYnDNaaFCxfq9Jeenk7mYhExqgoJLW007WoKydSMR48fPy7t\nU6GnmEBvIP/tEBMTg9DQUEQ9is3/Wp4waRIMDAwwb9487N69u1TGdXJywv96+MGncWM8iH0Mc3Nz\nhB48gIDBg9Hnf/8r0bHUavVXuZKSk5ODlStXIio6CnY2dqjiXBktWrRAnz59iuyoAADt27dH+/bt\nP3r8xYsXWLJ0CcJPHoeVhSXGjR6LDh06fLR+4JTJuBR9A4qGovxAjpSQjRfPUtGiVUskPUsEm80u\nspzfAi9fvoSDo6NOuYOTE16+fFn2AukBoNkFaN6yBS5dvQw11JpsBU+zADcBYGQA43g5Fq5eXuAq\nv0qlQscunfDGmgBLjQG9nAg3Y6JwLCIcfyxZjvGTJoDBVkCZq4CVhSX6zxgPa2trdO7cGTY2Njp9\n8vl8XLpwEQP8B+LWpVtgMBhwruyCTeEb9dv/XxOF0cjK6gf9ytZnsXHjRurbv7/OF/TDuCdkZWVV\nauNOmzaNnF1cSKpQao27cMlS6tmzZ7H7VyqVNH/+fLK1tSUGg0G1a9emkJCQEpC8YiCVSqlG7Zpk\nbCfQuIfXERHXRkCNmzUpcoytwhAfH08iiZiMnISEemJCdQGZmJvRT7N+KrC+SqUiY64xobHlu6/+\nt1/sxkziWvBpz549JS7n18LAgQNp9tyfte6NTFkuOTo50dWrV8tbvG+WUaNGEVgGhOoCgo8lobY5\nwZhJYIAqV6lM+/fv/2jbs2fPEs9CqH0/tLYleFuSqRmPiIhyc3Pp6tWrFBUVVaTQLUREr169opSU\nlGLNT0/ZgkKubH19SwXfIObm5khK1E22mpSYWKppVkQiEdq376DzBdiqdWtERkYWu//AwEAcPnIU\nB8IOIztPjvkLfseUKVNKbaWurNm6dSuevEqCzI0LiDiAmANpNS5uR9/FoUOHSny86UEz8MZMCbkL\nFzBnAzYmyKnBxYKFvyM5OVmnvkqlQm5uHsD+IGo7gwFwmJAbqD4rye+jR4/QoXNHGLGNwDXlYsCg\ngUhLS/vcaVVYpk2bhlV/rMCyJUuQnJyMWzdvorefL9zd3dGgQYPyFu+LQaFQYO/evRg0eBAmTpqE\ne/fufXZfRIQNmzYCNYWAjQlgzNJ4D9YVAwYMBAwJQLdu3T7aPj09HQxOARtCbANI/03Vw2az0aBB\nA1SrVq3I0eTNzc31IVq+UvTK1ldA+/bt8TD6AY4efudSLJPJMHfWLAwcOLDUxnVwcEBUVJRO+d27\nkahkb1+svl++fIktW7Zgz759qFmrFgwMDNCqTRusD96EuXPnvl0J/aLZe2AfpEK884SC5v/ZfML+\ngwdKfLwjR49AbfXBlh+bCUOJCU6cOKFT39DQENVqVANe5mofyFMBWQowpWp4eHgUSYbk5GQ08GqI\nYw8vQdFIDFldPnadPYiG3o2KFBbhS8DNzQ2nT5/GzevX0LBeXfzwfR808vLCniJ4/H7rSKVSNGrs\njUFjArDlwn6sOLgJDby9sOKPFZ/VX0ZGBuR5ckD0wX3AZQEcJh4/fvyf7b29vZGXlqW5B97nhQxe\n3o0+SyY93wZ6ZesrgMPhYN++fRgRMBQd27XFiIChqFHFFZXsbDF+fNHjxRSWLl26IO5xLDZt3JCf\nwPpxbCzm/PQTxo4ZU6y+7969i5q1asPc3FyrvEmzZoiLi0Nubu5HWn458ExNAaWu0migZsCskCEf\nioIRmw2odMdjqPHRAI6//7oAuP8GSM4BclWaeEG30gBjJkipho+PT5FkWLZ8GaQCBsjBBDA0ADhM\nKJy5SM15jb///vuz5lWRqfF/9s4zKqqrC8PvdKbB0Jt0BRRsqIi9K3bUWGKJfjGxxd6jMdZYYixJ\nNImJGnuJLcYaK8HeERALKCgC0tv0tr8fY5BhUFGamnnWmrXgzjnn7jPt7rtrQAD+2L0bGRkZiIuL\nw5w5c16a4VYadDod7t+/X6Il8kNk5aqVuJMSD2kAH3AXQeclhKKOCDNmznwrqyqfzweLyQQ0xUqt\nEAFqPTp06PDK+XZ2dpg6eSqEsXIgXQHINGA8kUHwVINV3618Y3nM/HcwK1tVRGpqKi5dulRugbIh\nISFISEjA6FGjEBIcjBMnTmDLli1lTvl/FTweD8eOHcOvP/+MAD9ftGraFC2ahGDC+PHo3r17mdZ2\ndXXFw/g4aDQao+MJjx5BJBJ9EEHZI4Z/DmGG3viHX6UDL12D/v364/z584iOji43K96wIZ+Al6w2\nXFj+JV8NXa7ypUH19vb2EFiKgGQ5cCkNiMoGZFrAkgvS6ZGTk1M4VqPRYN78ebBztAeHy0WjkGBE\nREQYrXc24h+oLYu5VhgMSIVaRJw/Vy77/FDZs2cPfHx80Ck0FLVr10b79u2RmJhY1WJVKJu3boHS\nkW1s/eWzwXDg488/39z6y+Px0KNnTyAu3/h78FgKK7El+vTp89o1Fi5YgA1rf0V9niecnrAQVrst\nLp2/aHYNm3k1pQnsqqwH/gMB8lKplAYPHkzW1tYUHNyYJBIJjRgxglQqVVWL9tbo9Xq6ffs2/fPP\nP1RQUFBu67Zt25amTp9BUpWaFFodZeTmUafQUJo1a9YbrZObm0tRUVGUk5NTbrKVB3q9nr4Y+wXx\nLYXE8rIitqeE+CIBdeocSgKRkKycbUloLSbfmn6l7tn2KgoKCqh+wyASOUoIPpbE87QmvkhABw8e\nJCKi7Oxsmv3VbKpR048C6tam1atXU3R0NAkshUb9FtHOhdDKmbgWPKM+b3379yO+s4TQ2IHQ2pkQ\nYE18sZAiIiIKx/Tu24cYfhKTAGOelzUtXry4zHv8UImIiCBnZ2c6E3GOFFod5ckVtGjJUqpevfp7\n/dvxOjyrexEa2Zf4eVm9evVbrZmbm0t1g+oRR2RBDBchMcU8srGzpfj4+HKW/t1Ar9fTunXrqLq/\nL4klltSqbWujRuZmygZKGSDPoHco9oXBYNC7JE9FMGzYMChUKqz9ZR1EIhFyc3MxfOgn8K1RA6tW\nrapq8d4p0tLS0K9fPyQkJMC/Zk3cuH4dPXv2xLp160rVikOj0WDatGnYvHkznF1ckJKcjIEDB2LV\nqlXvlGXs9u3bOHjwIDgcDiQSCabOngF5TYEhjoQIjBQF7HN5SEp8XCYXFGBwQx09ehQRERFwcHDA\noEGD4OLigvz8fNQLqo8UbTZU9mxARxA806FRzXrIzMzEXXUy9NUEhkWIwHkkR/cGbbFvj8H1FxcX\nhzpB9aBsZGXcMihFjhDrmrh0/gIA4MKFC+jYJRTyQKFhfwCQo4LggQJx9x6UmBpvBujdpw/adeiA\n4cUKYnZs2xYTxo8rlUWmOAqFArdu3YJYLEZgYOAbB3NXBjO/nInVO9ZB5VukAKxaB4sbeYi5HQ0f\nH5+3WpeIcPHiRURFRcHT0xMdO3YEi8V6/cT3kCnTpuKXzeshd2MDQg6QqQT/qQZH/zqM1q1bV7V4\n7z0MBgNE9PovT2k0ssp64AO3bGVkZJCVlRU9y8o2Sgd/+CSJJBJJid3gzRCdOnWKevToQe4eHuTv\n709z584lmUz22nlTpkyh9h060OOUVFJodZT0LI26dutGY8aMqQSp347gpiGE2qap5WIXG9q3b1+F\nnXfZsmXEdyt23rYuJLKX0IYNG8i5mguJnW2I621DInsJBdQJpMzMzML527dvJ5GnnWlKfCtnshDw\njc619qe1xBfySexqQ2JHa7K0tqLjx49X2N7Kg3379lGDBg2IzWZT9erVafXq1W+c1v8yHj9+TJMm\nTaJmzZtTn48+ohMnTpiMCQwMpCs3bpqUd5kybbqRRVCj0dChQ4do7dq1dOHChZfK+Ouvv5KdnR0F\nNWhAnl5eVLduXYqJiSmX/ZQn2dnZ5F3dhwRu1oTaNgR/CQmtxTTzy5lVLdp7QVpaGlkI+ISWTsbf\ny0BrqtegflWL90EAc+mHd4/k5GRUc3ODlZWV0XEXFxcIhcIPMv29rGRmZuLzzz+Hp7cPDh4+gvWb\nNiMqJgZdunSBTmfaT+xf5HI5NmzYgHUbNhamUtvZ2eHn39Zj+/btyMvLq6wtvBGPHz8GRKZWO5UF\nGZ6rIPb/dQAKm2I3Z0wGpFZ63Iy8hcePErH1541YNm4ODuzYg6hbt43Kijg5OYGhKOH9kGthY2uc\n5NCtazeENGkCeVoe5Fn58Pb2rtASJWVl586dmDRpEubMm4/MvHxs3LIV27Ztx1dffVXmte/du4fg\n4GAQg4mv581Huw4dMGLkSKxcaRxs7efvj8uXLprMv3zpEvz9/QEYrIs1a9bEN4uX4Nbt2/hk6FC0\nb98eBQUFRnNOnTqFRYsW4cSZs7hw5SpiH8RhzLhxCA0NhUKhKPOeyhNra2tE3ryFxVPmorVDXfSu\n3Q5//rEfSxYvqWrRXkpqaipOnjyJe/fuVbUouHbtGri2QoBbzGrnwMftm5EfRFb3e0NpNLLKeuAD\nt2zl5eWRRCKhR0lPje5Ob9+JJQcHhw869uJtmTdvHg379FOj10um1lDDho0KY41K4uHDh+Th4WFi\nCVBodeTn7/9O3sUTEXXqEkrwl5gUERXZWdGpU6cq7LwdO3cyFHksZpnieEto9uzZr52v1Wqpmocb\nMWpZv4jvau1MAicr+nb5t4XjZDIZObk6E6uGxBDX1daFUEvyzrYm0ev15OvrSyfPnDX6DCU8TSYr\nKyvKzs4u0/p9PvqIFi/71qQYsUQioWfPnpFUKiUiogsXLpCjoyP9feo0yTVaypHKaO78BeTn50dq\ntZr0ej0FBQXRqh9+NPqeDP7kExo1apTRObv36EHr1q83+V50Cg19b9sIyWQy2rFjB61atYouXbr0\nxlbHjIwMun79OmVlZb21DBqNhob+bxhZCPhkVc2O+JZCatw0pEqLlF66dIlEdlYvvpMlFGE1UzZg\ntmy9e1haWmLEiBEY8vHHiI+LAwDE3rmDYUMGY/LkyWWOx/kQOXfuHHr1No5HYTKZ6Nm7N8LDw186\nz9nZGQUFBSbWoNTUVKQ9ewb3MtYBqygWzJ0PQbLGkFZOBKh14D5UwNvNE23btq2w8476fCSE6XpA\nWyQzUqEFO12NwYMHv3Y+i8XCqb9Pwk1uCXGUHJZxalhcy0X/bn0wedLkwnG7du1CAVMFnYcQYDMN\nLYBchFDZs7Fi1buXOp+fn4+UlBQ0a9HC6LiTkxP8/Wvizp07ZVr/+LFj+KRYLTx3d3fUqVsX7u7u\nsLOzQ7NmzaDX6/HLL7/gi1EjUd3DHV7VXHH1ymWcPHkSHA4H0dHRyM7JwYhRowrXYTKZWPDNYmzf\nvt3ICvw4MRF16tYzkaVO3XoVaj2tKK5duwYXN1eMmD4OM35YgPZdOqJth3alKg+jVCoxZOgncPNw\nR9uuHeHqVg2ffjYcarX6jeX4eu5c/HH8TyiDJcjz50HR0Ao30+6jZ++XF0ktD2JjY3H06FE8efLE\n5LnGjRvDzsoGjNQiFks9weKJCp9/9lmFymXGGLOyVcksXrwYHTu0R9uWLeBsZ4tuoZ0waOBATJ8+\nvapFeyeRWFsjOfmpyfHk5KcmNbiKwufzMWbMGHz6ySeFF5CkpCQMHzoUw4cPh7gC6liVB8HBwfjr\nwEH46xzBjsgA92oO+jQLRfjpsxUawBwWFobBfQeCfyMf7Icy8OLlsIjMx7dLlhW6qV7GuXPnMHDw\nQIydOA6TJkzEnq27sOG7n3A/9h42/rbBKPD42o3rkFloTdbQWDJx5drVct9XWREIBGCz2SY1ndRq\nNRITE96qf2VR+Hw+pMXcfABQUFCAjVu2ICM3D6PGjkWvXr3g4+OD+/fv4/z583jw4AGOHjkCNzc3\nAEB2djZcnF1M+oc6ODhApVIZKQ916tRB+NmzRuOICOFnzqBOnTpl2k9lo9Vq0aVbV+RVY0LqbwG1\njwCy+mJcvn8L8+bPe+380V+Mwb4zh6BsJEF+bT6UDa2w48getG7bBnv37i210kVEWLN2DRSeXMNN\nBAAwGdB48HE7Kgr3798vwy5LJiMjAyHNmqBRk2AMHD0MfrX80bd/P6PiwAwGA8ePHINTPh/iGDkE\nD1UQ3MhHi8BgLP5mcbnLZOYVlMb8VVkPfOBuxKJoNBrKzMyskB54HxJHjx6l6jVqFAa5K7Q6unYr\nkmxsbCgxMfGVc7VaLc2ZM4dsbW2pWrVqZGNjQzNnziSNRlNJ0peNgoKCSnctR0dH09KlS2nVqlX0\n5MmT145fsHABCSRiQzmHQGsSuFmTV3Wfl7pjVq5cSXxPGxN3JdNXQgMHDyzv7ZQLEydOpJ69elGO\nVFbonps2Yya1a9++zGuPHTuWhn36qVF/0b9PnSYHR0fKlckLjy1aspSGDh360nXy8vLI2tqa7j9K\nMHIN/rF/PzVs2NBo7K1bt8je3p62795NUpWaUjIyadyEiVSvXr337vfo77//JrGz6ecJIQ5kY2f7\nyrk5OTklB4+3cCKwGCRysiYHZye6e/cubd26lRqFBFN1f18aN34cJScnG62lUCiIyWKZuuvau5JV\nNbsKCQFo0bolcbytDa749q6ENs7Ed5XQ+InjTcZqNBo6duwYrV+/nm7dulXusvyXgbn0g5kPhXnz\n5uGHH35A565dIZfJEH72LH7++WcMGDCgVPOVSiXS0tLg4ODw0krp/xUyMjLAYrFeaRUsLUlJSfCt\n6QdlkNWL/olE4MbLMa7vcHy3/DuTOVlZWfCq7o0CNzbgYGEoVpmnhuCeHOfCIxAUFFRmucqbtLQ0\nDPnkE9y6eRNNmjZFdHQ0XF1csG/fPjg6OpZp7dzcXHTs2BFMJgudu3bF3buxOHr4MHbv3Yc27doV\njrt54wa+GDkCt27deulaS5cuxeYtW7Bo8RIE1q6NM6dPYd6cOdi2bZtJZfR//vkHM2bMQHR0NBgM\nBnr16oWVK1fC3t6+TPupbPbs2YPh08agoEaxUi4aPXhXsqFUvNyVGBsbi5BWzVBQT2j65PlnQAM7\nMLLVsEwjaFkEmTML4DLBydLCUsrGrRs3Cy2LRAQPb08k2cgNfUeLynEtB4kPE+Dk5FQeWwYAJCQk\nIKBOIBTBEoMr/l+UWggipcjLya3QgtZmXlDa0g9mN6KZd5558+YhMjISrVu2RK+wMDx69KjUihZg\naGfk4eHxn1a0rl27hsB6dVDNww3Ori5o3DQEd+/eLdOahw8fBsOeb9yomsGA2pGD3Xv+KHGOra0t\nTh4/gWr5QogiZbCMlkPyUItNG35/5xQtvV6P2bNnw9/fH9nZ2dDpdEhJTsbGDRtw/vz5MitaACCR\nSHDx4kXMnDkDCpkUbCYTwY0bGylaABATHQV3D49XrjVz5kzM/fprrPpuOTq0aY0jhw5h//79Jbag\nadWqFS5fvoxnz54hKysLW7dufe8ULQBo3rw5NBkyQF0sEzZNjqbNX91Kyt3dHVqFyrTPoUJraGvF\nZYGs2MjLz4MsQGBoWC3hQeMjRJ5Yi3kL5hdOYTAYWLJoMQSPlEC2yhBvKdNA8ECBQQMHlauiBRgy\n27mWfGNFCwB4LGg0GsieN8U28w5RGvPX6x4AQgHcA/AAwIwSnucC2AUgDsAlAO4vWafCTH0fCnq9\nnuRyebnV+DHz4ZOYmEgiSzEh4LnLoa0LMfwlZG1rU6ZsunXr1pHA09bUhRNoTRYiAQnEQrJztKfp\nM6ab1JDT6/V069Ytunz5MqnV6rJusUJYsWIFBQc3LswezpHKaOz4CeXiPnwZMpmMXFxcaP3vvxe6\nFiNj7pC7uzudPHnyjddLT0+nu3fvftCZzpOnTiGhnSWhrg2hiQMxfSUkFIvo5s2br507acokEjhJ\nCM0cC7P0YMUleIsN//tZEZwFJbopnVydTdbbtm0buXm6E5PFJEtrK5rz9ZwKCVvIysoq2QXa0I6c\nXF2q7PqQnZ1Ny5Yto9BuXWj0F6Pf2azv8gSldCOWh6LFBBAPwAMAB0AkAP9iY0YD+On53/0B7HrJ\nWhX8sry/aDQamjNnDtnb2xOXyyV/f3/avn17VYtFRIbYqL/++ou+/vpr+vXXXyk3N7eqRTJThClT\npxDX27RQKt/DhlasWPHW66amppKFkP/iQtXeldDEgcBiEGpYGWJfQhzIopqEmrVs/t7dIHh4eNDF\nq9eMYqAKlCpydXWt0IvI7du3KTAwkLx9fKhhw0Zka2tL69ate6M1MjIyqFOXUOIJLEhka0WWEita\ns2ZNBUlctej1etqyZQvVCapLjq7O1KffRxQdHV2quVqtlmZ+OZOEYhExOEwCm2FQtP6NvfIRE2x5\npspWAzvii4V0/vz5EtdVqVQV/nkfP3ECCRytDO2x2rkQguxIIBHTpk2bKvS8L+Px48dk7+RAfA8b\nQqA1sapLSCAW0s6dO6tEnsqiMpWtEADHivw/s7h1C8BxAI2f/80CkPGStSr0RXmfGTlyJLVt146i\nYu+SXKOlE6fPkIenZ5UrXNnZ2dSoUSNq2LARfTn7K+rdpw85ODjQ5cuXq1QuMy9o2bY1oU4JQcT+\nEho0ZHCZ1v7xxx+JLxYSy0dC8LcitpBL8BKb1AkT2lpReHh4Oe2o4tHpdASAZGpNifWoDh8+XKHn\n1+v1FBkZSefOnXvjzhJ6vZ7qNahvCJ5u41xoiRFYi2n37t0VJPH7jUqlop07dxJfJCCGv8Rw0xBo\nTXxLEXF4XEJwkf6MbV0INjyCgwUJxMIK/yy8DJ1OR0uWLCFbBzsCg0Ee3p60bdu2KpGFiKhXn97E\nrF6sVl9jBxKKRaXq+PG+Ulplq8wB8gwGow+ATkQ04vn/gwEEE9H4ImOin49Jef5/3HPlK7vYWlRW\neT5EUlNTERAQgLvxD42qz0eEh2PiuLGIjY2tMtlGjRoFHRF+WPtTYWmCQ38dxPTJkxEfH//B9ht7\nn/hi3Fj8enwHtJ4Co+MWDxX46rPJmD1rdpnWj4qKwobfNyIjIwMnT59EpjsAS+OacayHUiz8fAa+\n/PLLMp2rMgkMDMSU6TMQFR2FhIRHaBrSFP0GDEDDenVx7do1eHl5VbWIJXLlyhW07dwBcjcOmAU6\n6NkAnPhAgQb+Ggfcjam634t3natXr2L+ogWIjIyEp6cnZs34EhqNBgMHD4JCSACfBWQoDD0Ga9sA\nOSq454qQ+DChSntL6vV6k7IflQ3Pggd1YxuTavWWd5XY9dtWdO7cuYokq1hKGyBfHukKJZ2kuMZU\nfAyjhDEADMHQ/9K6dWtzo0wAMTExqFuvvkmbnxatWiEuLg4qlapKGisTEXbs2IHIO7FGPzTde/TE\nNwsW4NKlS2jevHmly2XGmAnjxmPT5k3QipkvMqXSleBka/HZ8LIXNqxTpw6+X7UaANC4WQgyC+IA\nS+MxFjpWYduk94XQ0FAM/3QYWO5iaPkM/H31LOZ8PRuhHTq9E4pWamoqNm7ciISEBAQGBmLYsGGQ\nSCSIiooCCwz4ah0x8H8D8SD+Afbv2wulpwUeJ75/RUsrk+DgYBz567DJ8b/+PIjuvXpAKWIAtawB\nK64hk9aGh7T7aUhPTy9zwkRGRgYWL12CfQf2g8vlYPjQTzFp0iRYWFi8dm5VK1oADK/HS59695qc\nvy3h4eGvLKj9MspD2XoKoGg57moAUoqNSQLgBiCFwWCwAFgSUU5Kp0t/AAAgAElEQVRJixVVtswY\ncHNzw4P796DVao3SeR/cvw9bW9sqqzxPRJDL5bC2tjZ5TiKxhlQqrQKpzBTH19cXf+47gKGfDkN+\nohQggoOdPXad2FkuGXVFmTJhMj794nPIrHUv7nCzlGDkatC3b18AhrtwBoNRaT/ASqUS27dvx/6D\nB2AtscaIzz5Hy5YtXzlHrVZjw+8bQfVtoJUYFFQlAAZXB7VWUwlSv5qLFy8iLCwMPXv1Qv2GDXEu\nIgIrVqzA6dOncenSJbRu2Qa79uwtvAiPHv0F2rdtDQ8vz6oU+73F29sbDAYT8BQbZwDqCKQnCIUl\nlI94A3JychDUqAHSGQVQO3AAHWHh2m9x6OhhnAuPeC88BN17dMefN05B51XktchXQ1+gRqtWrapO\nsHKmuBFo/vz5Lx9clNL4Gl/1gCEG698AeS4MAfI1i40ZgxcB8gNgDpB/Y9q1b0+TpkylfIWSFFod\npWZmUes2bWn+/PlVKlfHTp1ozc8/G8W03I2LJ2tra8rLy6tS2cwYo9PpKCYmhu7du1dhwbt6vZ6m\nTp9GFgI+iT3tyNLVlqysJRQeHk6RkZHUonVLYrKYxLPg0ZChn5SpF11pKCgooIA6gSR0tSbUsiaG\nn4QEEjHNmj3rlfPCw8PJ0qmEOLfWzsRis6u0+Kderyc/Pz/6Y/9+o+/dtytWUsdOncjLy4uu3Yo0\niTVr2qwZTZ48ucrkft+pG1SPmH7WRrGIHG9r6taze5nXXvTNIrLweL52SydDkL41l1h8Ds2ePfu9\nSC5JSkoiJ1dnErjbEGpJiO1jCJDfs2dPVYtWoaAyi5oyGIxQAN/DkJm4gYiWMhiM+QCuEdFhBoPB\nA7AVQH0AWQAGEFFiCetQecjzIZKRkYGPBw5E7J07qOHrh6jbkRg4cCC+//77Ki1ed+vWLXTq1Akj\nRo1Gx9BQ3Lsbi8WLFmHSxImYMGFClcllpmpJSUlBeHg4LC0t0aFDBzx9+hT1gupD6sICnPmAlsBJ\nUsJb4ISY29EV9hleuHAhFv+2EkpfwQs3h1oH/s183L4ZiRo1apQ4Lzw8HD0H9kF+QLHabFo9WOfS\noVKpqszaEB0djbBevRBz776RdVCpVKKaowPEYjHCz1+Ah6en0bz+H/VBn1698Mknn1SyxB8Gjx49\nQovWLVGgU0BlQeDJABdbR5wLj3ijGmVpaWnYu3cvpFIpOnTogKCgIDRuFoKr8nhAzAGuZwDWPMCR\nD6h0YD9RYuyI0Vi14t3rHVqc/Px8bNq0CWcjwuHp4YnRI0fB19e3qsWqUEobs2WuIP+e8eDBAyQl\nJSEwMLDcXUBvy4MHD7BixQrcvHkTLq6uGDN6NDp16lTVYpmpQmQyGa5fvw6RSISgoCB8PnIENp/d\nZxykTwTxHQW2/LwRYWEV06zXL6AmHvAzDRevInAfyrFo9JeYNm1aifNUKhUcnB2RX51riM95DvOJ\nDO19GuPvo8crRN7SEBkZif4DBuD2HeNAd41GAxd7O4SFhcHNwxNfF3FvpKWloV5ALdy5cwcuLi6V\nLXK5UVBQgD179uDp06do0KABQkNDK1Xp1Wg0OHLkCB49eoSAgAB06NDhjeKlduzYgc9GfA7YW0DD\n0IGbo0OPLt2Qk5uLvxMuAzKNIZrZT1LkpHpYXM9FzO1o+Pj4lP+mzJSJygyQN1OJ+Pr6vnN3Cr6+\nvli3bl1Vi2HmHeGnn37CtBnTwRZbQK/WwsZSAiaLBa2k2EWRwUCBQIurV69WmLLFYDBKTMVh4NVB\nxTweD7+v34ghwz6B2lELrQXAlzLAl7Kw9siaCpG1tNSuXRsqpRL/nD2LVm3aFB7fsW0rgoKCsGjR\nIjRv3hzZOdkIC+uFx48TsXzZMkyePPm9VrRu3LiBdh3aQytmQc7SQPgTE+4Orjj/z7kS40YrAg6H\n89af1dTUVHw24jMoaosBEQcAoNXpceDvw+jftTeEV/SQyZVAHdtiJ2UCDnwcO3YMY8eOLesWzFQR\nZmXLjBkzb0VycjIUCgW8vb0LFZdTp05h2uyZkNcWGtLjiSBNKwA7vgDgCAGJsYVJoOPAzc0NSqUS\nMTExsLGxgbe3d7nJOHTwECxc+y0U1twXbkSVDox05Wsvmr1790bNmjWx5qe1eJjwCC2aNsPIESNh\nZ2dXbvIR0RsnCrBYLPz8888YMvBjDP98BOoF1ce5iAjs2bULx48fh4eHB65evYoff/wRixcthJ2d\nHX74/nt06dKl3OSubPR6PXqE9UReNSbgaAHAAlIixD9MxoRJE7Bl05Yqk0ur1ZYqSWnPnj0ge36h\nogUAYDGhqsbF1p3b4eHuDlm+FNDpTeay9IxSZSWaeXd5B/JFzVQlUqkUx48fx5kzZ6DRVH2WlZl3\nnwcPHiCoUQNU96uBug3rw83THUePHgUALF2+DHIXlkHRAgwKjhMfbLEFuElKQK59sVCGAqxcLaRS\nKeydHNCua0cE1quNoEYNkJiYWC6yThg/Af5O3hDGKoCnMjAfyyCIkmLWzC9L5ZKpWbMm1v64BscP\nH8XsWbPLRdFSKpWYOXMmHBwcwGaz0bx5c5w9e/aN1ujcuTMiIiKgkEmxfcsWWIlEuHHjBurXrw8A\ncHZ2xuLFixHxzz/Yv2/faxWtnJwczJg5A57VveDjVx0LFy6EXC5/6z2WN1euXEGBSmZoXv4vDAbU\nbhbYvfsPVHb4SUFBAT4fOQJCsQh8AR+169V57XtYUFAANUNn+gSHCbJg4pk6F7X8a4KTpDT0VvwX\nqQa6DHmFWX/NVA7mmK3/MOvXr8f06dNRu05dKORyJCc/xZYtW9CuWBNcM2b+RSaTwdPbC1k2WpAL\n3+CPy1ZBEK/EhYjz6NO/Lx5J8kyKmuJhATr7N0N4xD/gWAtAGh14YGPqpClYsOwbyP35BgVNT2Am\nK+CqFONR/MNyCZxXq9XYu3cv/jx0ENZWEgz/dDiCg4PLvO7b0uejj6DRarFk2bdw9/DAwT8PYMqE\nCdi3b1+V1KUrKChAvQb18VSVBbWjwRpp8UyLmk7euHLxMjgczusXqWBOnjyJj/43EPk1i9UT1BMY\n4c+gVqkqLVGIiNC0RTPcSroLlYeFwc2XoYQgUYXTJ04hJCSkxHmFxWbriQFWEWvmvVyAzQDcROBd\nz0X9oPqIibsLqVgPrp4FVoYK6376BUOGDKmU/Zl5M8wB8mZeycWLF9GvXz8cPXESvn5+AIB/zp7F\noAH9ERMTU+5d6s18GGzcuBHj502DzM84S4/5RIa+DUPBAPDH9ePQuxeptfM8EH77r5vRqlUrXLx4\nEQKBAM2aNUPjZk1wQ/7QkHlVBHGMHDvXb0XXrl0rYVeVR3R0NDp37ozYuHgj19PWzZuwf+9eHHtu\nIaxMvv/+e8xaMR9yX/4LVysRRLEKbFj9C/r161fpMhUnPz8fTi5OUNS1BARFlKoUGYIl/rhy4VKl\nyXLx4kV07N4Zsvoi40KeyTK0d2+Ek8dPlDiPiNCuY3ucv3YJGmeeIfMwVQ5kKYGG9gCPBYtL2bgT\nFYPTp0/jVuQtuDi7YMiQIfDw8Kik3Zl5U0qrbJndiP9R1q1bh4lTphYqWgDQqk0b9AgLw5YtVRP/\nYObdJ/ZuLGRcrclxvZiNfyIicO7Ceegf5gHXMoB8NaDWgfNIDmdrB3Tp0gWWlpYIDQ1Fy5YtwWKx\n8Dgx0XDRKYZGwEBCQkIl7KhyuX79Olq1aWMS49OhUyhuXL9eJTIdPPwX5BKGseLAYEAq1uPw0SNV\nIlNxLC0t8c2ibyCIlQMpMiBfDdZjOYRJWqxZ/UOlynLz5k3oJGzTiunWPNyKjCxxTm5uLlq1aY3L\nV6+AxecA8XlAZJbBMvxc0UK+GkwmC3Xq1cXkL6dh4++/43Z0FGxsbCp+U2YqHLOy9R8lOTkZfkUU\nrX/x9fNHSkrxBgBmzBgIqBUAkdpUOWLkaZCRnYlkOyUQ4gA48IHrmWBfykRYcEdciDhfYop+QEAA\nkKsyPkgEdr7O8NwHhqurKx7cu29y/MG9exWWKUhE2LhxIxo2bAhHR0eEPo/3+hdbGxtAXUJQto4B\nO1tbk+PlxbNnzzBu/Di4e3vCP7AmVq5cCbVa/dLxkyZOwr6df6C1S31451qhf+MuuHblKho1alRh\nMpaEm5sbWHLT1wsyDVxdS34PBw8dgiuPo6FoaAVloBho6WwoR6LUGdyQ2SpwYwugIS1ktYWQ1hdB\n1dgah66cQp9+H1XwjsxUBmY34n+UmTNnQqZQYvnKF4XyiAjdQjvh0//9D4MGDapC6cy8q8jlckPM\nlkQDvevzmK0sFRCdDQTZAlYvYmoYSTJ09GmC40deuMZycnKwe/duZGRkoEmTJmCz2Qjt1hkqX6Gh\nb6OWwH4sR02JB27fjPygeqoBgE6nQ82aNTFu4kR8NmIkGAwGMjMzEdatKz4bPhyjRo0q93POmzcP\n+w8cwJJl36JmQADOnDqJ2TNnYtu2bejQoQNOnz6N7n3CoKgretFiSaEFrmRg3dqfERUVhfMXz8Pe\nwQGTxk9E586dy/y+pKeno079usjmKaGx5wBagiBVi2Z1gvH3sePv7Puel5eHXn1642z4WaCGJeAq\nNFi4lDoI7sqxYc06DBgwwGhOeno63L08oAq2BthF7BtqHXA+DdATPKt7ITsrB/nVOUZ13aAn8K/m\nIurWbVSvXr2SdmnmTSitG7HM7XrK8wFzu55KIykpiZycnGjZdysoPSeXEpNTaOz4CRQQEEBKpbKq\nxTPzDhMXF0eNQoKJJ7AggaWQrO1siOdoadraprkTWUqsCuedPn2aRJYiEnjYEsPLkkT2EvKuUZ04\nfB7BgkVgMwhMBjG5bPr999+rboNlJCYmhg4fPkwJCQklPn///n0KDAwkP39/6tCxI0kkEpo+fXqF\ntGTJzs4miURCj5KeGrXu2b1vHwUHBxeO86lRndg8Dll42hgeAj61atOawGIY3pvqYkINS2IKONQj\nrAfpdLoyyTVj5gziekqMPy9tXUhoa0lnz541Ga/X6+m3336jWnUCyMHFiT7q15diY2PLJMPb0Llb\nF4Pcje0JIjaBzyKIOcTisGn+gvklvodRUVEktpeYfj/au5LASkQJCQmk1WoJDAahnYvJGCt3ezp6\n9Gil79VM6UBltuspL8yWrcrl7t27mDV7No4cPgwul4v+/ftj6dKlb9R6wsx/l2fPnkGhUCAqKgpD\nvhiOgprF6gDlqiCMU2Lvrj1o2bIlnF1dkO/NMViwAEN6e1S2wY1SUwJo9IYsrXwNnNO4ePo46Y2q\nc1c1mZmZ6NazO6LvxIBjxYcqS4quXbpg+9bt4PGMs+iICFevXkVmZmahe68iOHXqFBYsXIQTZ84Y\nHdfpdJAIBZDJZFAqlXBxcUHExUs4e+YM2Gw22nfsiIb160JJaqCxwwuLjI7AuZmDXRu3oXfv3m8t\nV0Dd2ojlPDOp7I9HBZg1YCy++eYbo8OjxozCtn27IHNlAxYsMDPVEKTpcPH8BdSuXfut5XgTUlJS\n4ONbHcpgCcBiGj6/BRpAroXFIyVys3NM3mcAUCgUsHd0gKy20Di4X6qB5IEG6c/SwOFw4FzNBc9c\ntC+1bFWrVg2pqalwcHAoc+NrM+WHOUDezGupWbMmDuzfD5VKhYKCAmzYsMGsaJkpNU5OTvDy8kLn\nzp3BVhGQoXjxpI6A+HzIOBr0HTIALVu3AgnZLxQtwOB+8bEEslWGv7ksw0VMwkVuXi6Sk5MrRG6F\nQoHIyMhyX79Pv49w89l9yBtYIs+XC2WwBEcvnsbUaVNNxjIYDDRu3Bhdu3at0LZbdnZ2ePo0CXq9\ncYxRSkoKhEIh2Gw2NBoNmEwm/Pz98cW4cRg5ejRioqOgY+oNbrKiri8WAxoXHjZvK1sSjUQiMbjR\nisHTs0wCwhMTE7F58xbIagoAWwtAyIHeQwiZMwvTv5xRJjnehOTkZHDFfMNnFDB8Zi25gJMAYBiC\n4EuCz+dj5owZEDxQGOITiYAcFQQPFJg/b15haY05s7+CIEFlaNkDABo9eA8VaN68OTZt3gQ7B3vU\nDqoLe0d7jBk75pXxbWbePczKlhkwGIx3NkbCzLsPl8vF8SPHYJ0MCGNkhvitC88APguoYwtpHSFi\n7sdCA9MsRnCYgLZYsHG+GkqlEjV8a0BiY43xEyegoKCgXGT9dvm3sHd0QKtObeHjWwOt2rZGenp6\nmddNTEzE1WvXoPHkA8zn3yUWEwovHjZs3FhlBYPr1q0La4kEv/z0U+ExrVaL2TNnYNiwYWAymbC1\ntUWtWrWwf9/ewjFyuRx6kGnGHQAwDGuUhbGjxkD4TG/83ks1YGQoTWKezp07B7aD0PBZKQI5WOBc\nxLkyyfEm+Pr6Qp2vAFTFlMQCNQQCwSsL3s6eNRvfLVgK52c8MM6kwi1LgDXffY/x48YXjhk9ajS+\nnjYL4lgFRDcKwLuag7CmndAgqAFW/bYGsjpCyBpaQhFkhU0HdmL0F2MqaqtmKgCzG9FMpaDRaLB+\n/Xrs3bsXWq0W3bp1w+jRoyESiapatP8kCQkJSElJQUBAgMHKUA6oVCoM+HgADp7/G+QjNm5LkiQF\n42EBqKnDiyBsAEgsANKVQPBzi6pcA1zNALzEgLPAcHefrEaAow+uXb5aJrfi1q1bMWrSWMj9+AZ3\njo7AeaJATUt3RN64VaYbjgsXLqBr357ICyjmSiUC90IWnqWkVlr/vuLEx8eja9euEFtaolZAAP45\nexaBtWtjzx9/QCAwNAa/ePEievbsic9HjkLLVq0QHh6OZUu/AfhsINjhRRFOPYF1Mxtb1m7AwIED\n31omIsKIUSOxfecO6O24YOmZ0GfIseG39SbrHjp0CING/Q8FtYq9tvlqOCWzkfq0fLKnr127htU/\nrMajxAS0aNocEydMNMkQnTx1MtZt2wi5Fw8QsoF8DQQPVVg2/5tS9y2k17RoUqlUSEpKgp2dHQQC\nAWwd7CANEBi7INU68K7lIuVpsrk0RBVjLmpq5p1Bp9OhZ1gYpFIZxk2YAB6Ph/W//YqUp08RHh5e\n+IP/oZOYmIiUlBTUqlWr3BScNyUjIwO9+/bB9Rs3wBPzocqTYcyYMVi+bHm5xEdNnDQJPxzaCPIS\nGz+RroBrrgC5snzInFmGi3i6oYUOh8sFm8+BXsKF/pkUGnsuUMPqxVwiiKLl2LN5J0JDQ99athr+\nvogXZBtcUUXXjpTi1JETaNy48VuvnZubC2dXFygbWBlqJv1LnhqOySykJCVXafyZTqfD6dOnkZSU\nhPr16yMoKMhkzP379/HDDz8gNjYWnp6eYLFZ2LRtC3RsAtxEhszTJzKE1G2Ic+ERZa7YfvPmTSxf\nsRz37t9HUN36WLBgAVxdXU3GqVQqOLk6I9eNCdg9f+/0BP49OaaPmIB5c+eVSQ4A2Lx5M8aM+wJK\nZw70Aha4eXrw8wiXL1yCv79/4Ti9Xo/FSxdjxYqVKMgvgJ2DHebPnYcRn4+oEO9AamoqfPxqQNHY\n9PfCMlqBM0dOoEGDBuV+XjOlx5yNaOad4dChQ1S3Xj3KVygLs6HkGi117tKF1qxZU9XiVTjp6enU\nonVLshAJyMrZliwEfJo6bWqZM7rehkYhwcTxtia0fZ711MKJBA5WtHz58tfOvXHjBo0aM4p69/2I\nNm7cSAqFwmRMREQECW0sCW2cX2RUBUiIwWMRi80iZ1cXsnd2JAaXRbDlERrYEWpJiCe0oM8++4xc\nPaoRGtmbZm55W9LcuXPLtHcLAZ/QytlkbZGnHW3btq1MaxMRTZoyiQSOVoRge0NWWZAdCSTi9zqz\n8uDBgxRYJ5BEEkvy8PGkH3/8kTQaTZnXXfbtMuJbColZXULwl5DI2ZrqNahPUqm0xPEXL14kK2sr\nErvZEs/bhgQSMYV26UwqlarMsshkMhKKRYQQB6PPBcNPQu07dShxjl6vJ7lcXiEZpEVRqVQG2Zo5\nGn9uWzmThcCCMjIyKvT8Zl4PzNmIZt4Vxo4di2oenpg4ebLR8f379mLntm049NdfVSRZ5dAoJBi3\nM+Oh8Xgez6PSQXBfgQXT52DKlCmVJkd0dDRCWjSFvKGlcSxOvhr2TxhIT0176dzV36/G7K+/gtKB\nAz0HEOYz4CZxwpWLl2FpaVk4jogwaMhg/HXiCGR2DENAcI7akG1oxQVyVEB0DtDY/kWzagDIUsIj\nTwwPDw9EpEcZXIhFEMQpsGLmN2WqQxVYtzbuMFIA+yKtgYgguJ6PC+HnUK9ePQAGK5VcLoezs/Mb\nWSv0ej2Wf7cc361YgcyMTHh4e2LxgkVlcrd9iDx58gR+tfyhrG8FWDy3AhLB4r4cs0ZMxpw5c0qc\nJ5fLcfDgQWRkZKBZs2blZtEx9F38GPnFs2m1erDOpUOtVlepVfLLWV/ih99/gbyGhcFqqtaB/0iF\nXm26YPuWbVUmlxkD5mxEM+8MAoEA+Xl5JsfzcnM/eBdiVFQUYu/dNQ6c5rEg9+Ti2xXLK1WWxMRE\ncKz4pkHPYg4y0zLwshudlJQUfDnrS8hri6D3FAKuQsj8+UgoSMXiJYuNxjIYDGzbshVb1/2OUO8m\nYGVpgHq2Btcdm2mI1xKwjBUtALDhITUlFSOGfw5hqs44CDlLCWaOBv379y/T/hfNXwjBYzWQ9zyL\nS6MH634BNGo1WrRuifadOiCkWRM4OjvBx7c6PH28cOzYsVKvz2QyMWP6DGSkpUOn1SIx/pFZ0SqB\nP//809BhwKKIu5XBgNKRjS3bt750nkAgwMcff4xx48bhypUrcPfyANeCh9r16uDw4cNvLQ+HwzFk\nzxZHT2CymFWePLRo4SKMHPQ/8G/mQRwpA+96Lvq274ENv66vUrnMvBlmZctMhTNw4EBs2rgBqamp\nhcfy8/Ox5ocfMOgDvxglJiaCIylBwRFxkPEs/aUKTkUQGBgIVZbU9MKSrYKHj9dLLyqHDh0C00Fo\niLP6FwYDKicOduzaaTKeyWSiV69eWL1iFfgigXGgPIdpaA2jLyaD1vB/7969MW3iFFjcyINlnAqW\nsUpIHutw+K9DZQ4wDwsLw0+r18A+iQH+5RwwLqQBOSpoaokhDRDg9D9ncCUlBuomNlCGWOOJRIqP\n+vfFtWvX3vhc71N9sMpGr9eDUMLnngHoqYQ2OMWY9dVsTJs3C0l2cmia2CKGktF/8MfYu3fva+eW\nRLNmzcDSwFCCpAjsp0r0DAsrF2VLo9Fg7969mDJ1ClatWoWMjIxSz2WxWFj53UqkpabhUvh5PEtO\nxebfN8HCwuL1k828M5h/EcxUOPXq1cP48ePROKg+pk2ejK++/BIN69ZB61at0L1796oWr0IJDAyE\nKrMEBSdHBc/q3pV61+zl5YXOoZ3Bj5MDSq2h3k+uCoIEFZYs/Oal816lEBav3wQYMh337t2L+Ph4\nqOUq4/R+gaEoJZ5Ii54AiM8Di81Cbm4u5s75Gk8SH2P98p+wa/1WpKWmoVWrVq/cW2ZmJm7evImc\nnJxXjhs6dCieJadi945d4IsE0DW2A6wtAKnGoExWtzLUUWIwAFsLKFw5WLh40SvXLM65c+fQMywM\n/v7+6Na9O86ePftG8z90unfvDkaGyrjOFhF46Vp83G/AyyfC4OJdvXo15P58QMIzWEsd+JD7WGDK\n9KlvdfPC4XDwx67dEMQpwHsoB55IIbqngLPOEj+s/v6N1ytOdnY2AuvWxv/Gj8DKP9dj1g+L4OXj\njfDw8DdaRywWl2v2sJnKxaxsmakUZs6ciXPnzsHR3g5CvgX+/PNPrF27tspN9BWNt7c3OnXsBIs4\nuaHpbBEFZ/GCN7uIlwc7t+/Ap2GDwL9VAO6FLDilcvDT6jUmtY2K0q1bN+jTn8v/L0TgPtNgQJGL\no0ajwceDB6JW7QAMnzoGA4YNAovDBjteatj383kcsQWQUABcSQfu5QKX0wGpFmo7NsaON6TP29vb\no2/fvujcuTO4XC5ehkKhwMDBg+Dm4YY2XTrApZorRo4e+cq6VkwmE3FxcdBac164dqUaQGJ6HrLk\nIDom2uS4TqfDzp07Edq1Mzp1CcX27duh1Wqxf/9+9OvXD6FdumDnnr3oERaGIUOGYMeOHS+V522I\ni4vDvn37cOPGjXK1jiqVSqxYsQIhTZqgUXAwFi5ciPz8/HJbHwB8fHwwddIUCKJkYCTJgFQ5BPcU\n8BA6YtrUaa+cGxMTA55EYJzxCQDWXKQkp7x1Pbb27dsj7t4DzBk+BcNb9cUPC77Dvdi7cHZ2fuW8\nrKwsHDhwACdOnHhpkdHJU6cgQZEGaS0+4CWGsjofsuo89P6oT5XVXzNT+ZgD5M2YqWCUSiUmT52C\nTZs2QafTwcbWFku/WYyhQ4dWyPk0Gg3u3bsHsVgMT0/Pl46RSqWQSCSlUniXfbsMCxYvgsKBDeIy\nIMgFXER2uHrpSqF7b978eVi+7nuD1eF5OxNmsgKcJwqwuGywrPnQ5yjh4eaOx6lJkFXjGBoeizgG\nRUdLYF/MhEqpLLUbbtAng7E//AiUPnyDlUOtgyBeieF9P3mlVWLLli34Ys5kSH2fu2KeyYEUORBU\nrDBlsgwdPRvj76PHCw/pdDp069kd565fgsyWATAAYRahcWADJCYkYt1v69G8ZcvC8deuXsWg/v3w\n6NGjMpdLUCqVGDp0KMLDwxHSpAmio6Ph7OSEffv2wcnJqUxra7VadOrUCTwLC4wdPwFcLhe//boO\ncffvIyIiAlwuFxwOp9xukCIiIrDut3XIzslBj67dMXTo0NfGcMbFxaFuw/pQNLR6oSgDgFIHi5t5\nKMjLL/NrXFoWL1mMhYsWgmsnMsT/qYE/9x9AyyLvPQAIhAIogqyMY9QAWN5RYP/WP9CuXbtKkddM\nxWCus2XGzDuGWq2GVCqFtbV1hVn0tm/fjrETxkHH0EOr0sC3hi/27PoDNWrUKPPaly9fxi+/rkNG\nZga6de6KTz75xKhHm62DHbJ9WMYxWkQQ3Zbhx+WrwePx4I1k0qEAACAASURBVOfnh9zcXPQa0g/5\nxYtU6vRgRqRBpVSV6oKZlZUFV7dqUAVbG1cXV+rAj8xHVnom+Hx+iXOlUilcqrmiwJtjCN7XE3Ax\nDXATGmpKMRlAnhqC+3IcO3TU6AJ68OBBDB4xDNJAwYsLvp7AjyqAmCVA4tNkk/e3lm8NHD1yxKhm\n09swceJEPE5Kwqat28Dj8aDX6zH/669x49pVnDp1qkxr79+/H8uWfYsz586BxTIoBkSEsG5dcf78\nOSiVSji5OGPR/IX43//+V6ZzlYVGIcGIzI6H1v15LKSeYBEnx9Bu/fHLT79UigxHjx5F38EDIA8Q\nvlCispQQPVTjSeJjo/hCNocDXXN747ZHACzvq7D9p9/RrVu3SpHZTMVQWmWrcm4BzJgxAy6XW6HV\nnv/55x+MGDMScn+BoWebnhCd8hgtWrfE40eJJTbJfRNCQkIQEhLy0udzs3OAwGLWFQYDTCEXEokE\nYWFhAAwp/LoCFSAtppilKNC8ZYtCRevx48dISEiAn59fie6cp0+fGgqzFmvjAgsWGCwmMjMz4ebm\nVqKsIpEIRw4dRvewHqB0JfQcBtRgw7KAB+nVXLB5HHAYLKz5+VcTS8WuP3ZDak3GlhUmAwprBhjJ\nBVAqlUZKnkqlQl5urlGJjLdBo9Fg06ZNuH47qvC9ZDKZ+GruXPh6eSI+Ph7Vq1d/6/VPnDiBfh9/\nXKhoAYYLyZBhw3DpznXo/SRIyVNh7JQJUGvUGDliZJn287Yc3P8nOoR2xJPIp2CIudBmydGyRQus\nWrGq0mT4btUKyJ3ZxtYqWwvoswm7d+82KlHSpl0bnE68BnIr0jxaroUmW4YWLVpUmsxmqhZzzJYZ\nMx8I3yxdDLkrx6BoAQCTAX01AWQMtSHdvoIJqB0IZCqND2r1UKUXGNVEEggEWPvjGghi5WA8kQGZ\nSnAfySFO02PtD2tQUFCAzt26wD+gJsKG9IV3dR98PHggVCrjbDFPT0+opUrTXnVyLZjEgIODwyvl\nbdGiBdJSnmHL2g1YO38FHty7j4zUdNyNvoNL4eeRnppWYukGNpuNkpLpwGTAwdERy5cuNTr8w6pV\nqB8UZNL6JTExEVOnTUXbju0NcT0JCa+UVy6XQ6fTmVRZ53A48PDwxLNnz145/3WIRCJkZWaaHM/M\nyICODYMVScKDvIYFZs76ssTkiMrAxcUFMbejcfLwcfy29Edcv3wVx48ce6kVsyJITkk2lDAphpyp\nQUqKcfug71euhjiNwEmQGzIen8ogiJVh2ZJlsLKyMlnDzAdKaSqfVtYD5gryZsy8NZ4+XoTGptXX\nmd5WtGjRogo//4kTJ4jL5xFqWxNaOxsqqVtxicvnUVxcnMn4K1euUP+PB1Cjpo1p0pTJ9OTJEyIi\n6hHWk3geEkKb51XuWzsT31VCY8Z+YbLGF+PGksBZ8qLCdlNHEjhY0dx5cyt0n0IbS8Me/32d2ziT\n0M6KtmzZQgEBARQc3JjGT5xETZo2Iz8/P3r8+LHRGhcuXCChpYg4PtaEOjbE8bEmoVhE586de+l5\n9Xo9+fr60onTZwo7MSi0OnqU9JQkEgnl5OSUaV+3bt0iJycnikt8XLh2cnoGOVdzJdS3Nf5csRh0\n7969Mp3vfeazEZ8Tu7rE+DVp50IiRwkdOXLEZHxiYiKNHTeWatevS117dKMzZ85UgdRmKgKYK8ib\nMfPfokevnjh8LwJUTWh0XHxHgc1r16NXr14Ven6ZTAZbOzuouDpDdh+PBbgKwQADof7NcPTQkdeu\nkZaWBk9vLyiDJcYxLkod+LfykZ2ZZVRfSKvV4svZs/Dzzz9DDwKbxcKUyVMwZ/ZXFVbriogw/PPh\n2L1vD+RsLaDVg6tholePMOzcvgM6nQ7Hjh3DvXv34Ovri65duxrFoBERfGv5I56TCTgWscakK+Al\nl+Dhg/iXxvTt2rUL06dPx/dr1qJNu3a4HRmJKRMnILRTJyxaVPbs1pUrV2Lx4sXo1acPOFwutm/Z\nAqU9C2rPIrXilFqwrmRh8aJvMH369DKf833k0aNHqBdUH1InJsiJb2iY/lQFP1sP3Lx2w8gV+7bk\n5eUhMTERbm5u5mbT7zDmAHkzZv5jXLt2Da3btYHcxwKw5QF6AitJgWp6CeLvx1V4ltbff/+NfsMH\nldz25HwGNGr1axMDbty4gbZdOyK/tqlLiH85Bw8fxJcYv6VSqZCVlQU7O7tXloooL86fP4+OoR2h\ntmJBJ2SBLwWs2SJcvXSlxGbKRXny5An8A2tCESwxLnZLBP61PNyJjIaXl9dL5x84cACLlyxB1O3b\n8PT0xNixYzF27NhyS7pISEjAgQMHoNVq8c2SxZBbAVofoSFGTasHP06Bul4BaNygIVavXl0u53wf\nuXPnDiZNnYzwM2fBs7DA4MGDsWzJ0jLH5mm1WoyfOB6//74JXJEF1FIlPvroI/y27ldzIdN3EHOA\nvBkz/zEaNWqEvbv3YPTYMUiLS4Nep0fLVi2xeeOmSkmHZ7PZppXhAYPSx3q9lYmIkJOTA3lOAaDi\nGtdSkmrA4/Jgb29f4lwej2cSE1VR6PV69O3fD4rq/MI+iwoA6kQZRn0xGof+fHWvTyaTCSrpdQIM\nLWJeY5Hr1atXhVopvby8MPl5H9PExET8dfQwsq9lgyvhQ5ktQ5fu3ZGfnYv69etXmAzvAwEBAThx\n7O9yX3fajGnYfGAnlA2toOSyAI0F9p05BMaoEdiyaUu5n89M5WC2bJkx84FBRHj27Bn4fH6lVptW\nqVRwcHZEvg/HUN37OewEGcIadMCe3X+8cm63Ht1w6doVyEkD0uuAWtaGbMV8NQQPVVg4a26hElDe\n6HQ6XLlyBXK5HCEhIRCJRC8de/XqVbTv2gkFdQXGlimtHuwLmZBJpa+1rgXWrY07umTjhtupcvjD\nCXdjYsu6nXIjMTERjRs3xpixY1G3Xn14eHrij127sG/PH7h9+3alBqX/F1AoFLBzsIO8nqVxpqNG\nD4truUhOemp2Kb5jmBtRmzHzH4XBYMDZ2bnS23rweDzs2r4TgnsKcB/KgadSCO8r4KgRvbbtyeIl\ni3HhznXI6otBDWwMFqMbmcDpZNgmEpbOXYRJkyZViNxXrlyBq3s1hIZ1RZ9hA+Dg5Ig1a9YUPn/u\n3Dk0bNwILBYLVtZWWLlqFRhshmm/SyYDRPpSZelt27wVlil6WMQrgGQZLOIVECfrsH3LtvLeXiGx\nsbEIDw9Hbm5uqed4enri+PHjOBcRgf4f9UHT4EZIeBiPs2fPmhWtCiAzM9NQELhYAVRwmOCKLJCU\nlFQ1gpkpM2bLlhkzZsqVJ0+e4Lf1vyHxyWO0aNocgwYNMip+WhLO1VzwzFX7omwFYCiIGqvElgoM\n7s/Ly4O7pzvy3dmAw3PlQa6FIFaOv/YegEgkQtsO7SD34BoUQJUOvMdKaDNk0NWzNpY3WYYQm1q4\ndP5Cqc6dkZGB9RvW43Z0FGoHBOLzzz5/bbmKt+Hx48f4+OOP8fTpU7i5uSM29g4mTJiAuXPnvlGc\nl1KpBIvFAofDef3g95S7d+9i5epViImNQf269TF54qQy1S57U1QqFewc7A0FcwVFXP9qHSyu5+FZ\nSqq5XMQ7hjlmy4wZM2UiMTERR44cAYvFQs+ePV/bJ+5f3N3dsXDBwjc6l0wqBbjFFDIGA+Ax37g3\nHxHhwoULuHPnDnx8fNC2bduXxkHt2rULWqsiihYACNiQO7Pw7Yrl0Gg0htplToLC51R+QnCyleDE\nSqF24UEvZIGTr4dFph4/71hbajnt7e3x5cwv32hvb4per0f37t3R7+OBmDRlClgsFlJSUtC7R3dU\nq1YNn332WanX+tCDs0+ePImwPr2gcuRAJ2Lh+t/3sGXLFhw/egzNmzevFBl4PB4m/Z+98w6vqlr6\n8LtPL+k9QOi9Sa8XpYrSVARRBKSogAKiIOgnSLEhWLAiiAVQ6YpSBaVKCb1DAoEAgfSe08v6/ji0\nQxJJSADR/T5PnsvdZ61Za+/E7Mmsmd+MfpkPZ3/iKXQxqMDqxBBn45lBA2VH6x5GjmzJyMjk481J\nk5jx4QykMD2SkHAlm3hr6tSbNgq+VR557FFWHtuCqHCdw+Vwo9ubxcljJ6hQoUKR7GRmZtLhwY7E\nnj2N20+N0uQizD+YLRs3U65cuXzjJ0yYwDsLP4XKN1SQZdmoYQkhKTGJ7Nq6fMc6hjgro58ayplz\nZzkdF0fLZs155eVXCu1FebfYsmULI0eNInrffq8o1uaNG3l93KscOHDgLu7u5qxfv54vZ88iPSOD\nR7p25/nnny9ytZ/NZmPZsmXs2LmTShUr0r9/f8LDwwsc63a7iapYnkshVk/7piskW6jqCCH2+Mnb\n1mKroL1MnjKFj2d+jBsBbsHQoc8zfdr0O9b3UaboyNIPMjIyt8TmzZvp2rMH5rrGaxWBFifsSqF+\nvfps3rjJq/dbaXDixAmat2yBOVSBK1gDVifGSy4GPdmfzz79rMh2evZ6nNX7NmGvclkXSgiU5y00\nCa3Bru07841fsWIF/V8YTF5tvVcOljLexIAHerJt+1+cNqRDkHdUx/eYhYVfz6dr1663ftN3gPnz\n57P299/5+NPPeH/aeyxevBAhBF27dmPZosXFyt+604x//TW+mDMLU5gCNAr0WYIwlT/7du8lODj4\nb+empKTQolVLUq1Z5Bmc6BwqlOl2Vv76G+3atcs3PiYmhsYtmmJq7JtPjkO3K5PTMaduKulR2ths\nNlJSUggNDf3XRxXvZWRnS0ZG5pZ44sk+LD34u6ch8/WczoY0KyHGQFISk0v9L/1Tp04x9e232LRl\nM6GhIbwy6mX69etX5HXy8vIIDg3B3jzIuzG1W6DbncXJo8fzRcicTid16tflrDUZR5TOk5ycZMbn\noov9e/exadMmXp4wDnMtPWiUIARSkoWwTC0J5y7csUiDyWRi+fLlXLp0iWbNmtGuXbsiPZfDhw/T\npUsX9L5GLphTsEWoQZJQXbKiynCQlpx603y6u0FcXBx176uHtbG/57lfRnPKxKgnnmXG9Bl/O/+p\np59i2c51Hn2wK6RbCboASZcS8+WdnTlzhroN6mNp5u/tbLkFmp3pXIg/f1vy6WTufeRqRBkZmVsi\nPTPd6wV3Fa0S/DSkZaYze/bsUl+3WrVqLJg3n4T48xzYs5/+/fsXy6HLy8tDoVSAKn+VoMagJSMj\nI98clUrFjm3b6d26K5roDBRbkmgZUpstmzZTrVo1nnvuOZ7vPwjd3iz8Yu34HjZTzuTLxg1/3jFH\na/fu3ZSNKsuLE15hwpxpPPJkT5q1bE5eXt5N59avX5+QkBDOpiZgq3a5QbmvGmd1H/DTMG/evDtw\nB8Vn9erVnjy6G34O7WFqlixf9rdzhRD8vPxnnFE3RIOCdThVnny+G6lUqRLlo6IgyeJ1XbpkoV79\n+kVytE6fPs3T/fsRGVWWOvXrMnv27LvWP1Lmn4fsbMnIyHjRo0t3DFk3RJiFgGQLBGnBX8OiJYvv\nzub+hrCwMM/xZpbd+wOTA7fNSa1atQqcFxwczI8LfsBqsWK329mxdTuNGjUCPH+1fvzhx8SfiWfB\nZ3NZt2I18XFnqV279u2+HcCj/9Xtke5kRynJq6HDVcWHvPpGjiSeYvzrrxXJRsUqlXCFabwjNpKE\nNUjB6nVrbtPOS4ZarUYq6JBDCNRFcHKdTqdH8f5GlFK+hubg+T4v+nEh/okC/SkLnM/DEGshME3B\nD0UQEo2NjaVx0yYs3rWapHJOjquSeGXSeAYNGXzTuTL/DWRnS0ZGxovBgwcTrgmEoxmQY4dsOxzJ\nBAGE6iDHfkerohwOB8uWLWPMmDE8/fTTjBw5kh9//BGr1eo1TqFQ8OnHn2A4ZYEkM1hdkGLBcNLC\nO2+9fdO8F0mSvHraxcfH8+677zJ+/HiOHj1K9+7dadWqVYGVjRkZGYwYOYLgsBACgoMYNGQwiYmJ\nJb73bdu2YRVO72pJScJWTsu8+TePSiUnJ5OWkoaUbIUsm8dpvozCLggrRJH/bvPoo48iUi1gdl67\nKAS6JCcDBzzzt3MlSeKBdm2REr2jVJgcOLOttG7dusB5DRo04MypON4e9QaD7+/FtLGTOXM6jpo1\na950v29MnEBeqISrotEjxBusw1zLwNJlS4mJibnpfJn/AEXpVn2nvjzbkZGRudukp6eLBo0aClSS\nwKASVPYV3B8uKGcUCo1SbNiw4Y7sIzk5WVSuWkUYwv09ewjRCVSS0If6iXIVosTFixfzzVm/fr1o\n3qqFCAgOFPc1aiCWL19e7HW//fZbofcxCHXFAEFlP+ET4i86dOoobDZbvrEWi0VUrVFNaCoECFqG\nCVqFC1XlABFZrozIyMi4pfu+wq+//ir8okIEHct6f7WNFEql8m/nLlu2TAQGBoq+/fqJ0WPGiIiy\nkUIfFShoX0bwv3Bh8PMRu3btKtH+bidffvml0PsYhKpKgKCav/AJDxBNmjcVJpPppnOPHTsm/AL9\nhbpyoKBhsJBqBAiDv4+YPWf2bdlrUGiwoFV4vu+ToVKw+Oqrr27LmjL/DC77LTf1b+QEeRkZmXyc\nOHGCY8eO8epr44iPj/cknDvcKNRKHu/Rk8WLFt2RUvievR5n5YGNOCtd1xonyQxnclFEGOlcuzVr\nVq4u1TUTExOpXLUK1vt8wXg5kdot0J8w8+64SYwePdpr/Pfff8+ICa9gquld0ag/ZWHyC+MZN27c\nLe8lPT2dsuXLYWsc4N0rMsFEm8j72Lpxc6HzqlWrxpr1G2hwuYeh3W7nwQ7tORBzGIXVxVtT3mLs\n2LG3vLeicunSJT759BO27fiLyhUrM3rUSzRp0qRIc0+ePMl3339HekYGXR56mB49ehQ5V+7ChQt8\nNPNjtm7fRqXyFXhl9Cu0atWqJLdSKJWqViY+MNerTRWAb4yVr2d8QZ8+fW7LujJ3H7kaUUZGptjk\n5ubyaM/H2Bm9C3WQAWeWhbKRZYgqF0VgQCDPDhlC586d74ij5XA4MPoYcbQM8a4uFAJ2pkCtANRH\nssnOyi7V1jFffPEFr37wpqfR9PWkW6nljOD44aNel5/u34+f9q6CcjdUbyZbaBfegI0b/izRfqa8\nNZUZMz/EVFYJBjWKDDv6ZBdbN22+mlt2I3PnzmX9hg3M/2mh1/XNGzcy6sUX2Lx58x1p3H3y5Ela\ntG6JNUDC5iuhsLjRJTmY9dmXDBgw4Lavf6eYMWMGkz5+B0st47VcsQwbPqdtJCcmYTAY/t6AzD2L\nXI0oIyNTbJ4b+jzbT+3D0tSfnGoazI39iLeloNFqWLZ0KQ899NAdE3d0Op243QKUN6wnSZ6KQyEQ\n4nIydClisVhwSgVUkakUWCyWfJfLREaicuR/JpLNTZnIkjs0kya+yYK539PcryZRKTqeaPoQe3ZF\nF+pogacyM7CAhsVBwcFIkkRaWhqZmZmAR3Jj4sSJvDhiBCtXrsTlchVo0+12s3fvXnbu3Indbi9w\nzI28OGokOaFgq2yAUD3u8kbMtY28MOJFzGZzkWwUBafTyYEDBzh+/Dh34w/20aNH06lFWwz7ctDG\nmfGJteJz2sZvK36VHS0ZQI5sycjIXCY3N5fQ8DBsTQO8S+5dbnTRWcSfOVuoAvftolHTxhywnIXI\n615YeQ5Pk+qqftynr8jBfaWrgn706FGatWqBpbEfqK79Pao5bWZkr8F8MOMDr/ExMTE0bNIIS10f\nT3I0gMWJ4YiJP3/fQIsWLUp1f0Xh2LFjdOrUiUPHT+Dr63v1+tiXX+bbb+ai9tFiz7PSsEEDDhw6\niDNMi1PpxidHQd1qtdi44U+vaOGOHTvo1ac3uVYTCqUCyS74evYcevfuXege3G43ao0ad5twr+cI\n4HfCyvLvF9GxY8cS3+vPP//Ms0Ofw4kbt9NFWEgYyxYv+Vtn9Haxf/9+tm3bRlBQEI899hg+Pp5o\npxCCffv2kZiYSOPGje9IVFHmziAfI8rIyBSL8+fPU6t+HcxN81ca+h4ysf3PrdSrV++O7ik6OpoO\nnTpiCVPiDlRDrgPO5iIFaDFYlPyx/vY4M88PG8pPPy/GFK4AtQJthpsQYeTA3v2EFlDBt2DBAoYO\nH4Yq2AASOFLzmPbeNF4a9VKp762oDBs2jD179zLu9dcJD49g4Y8/8sOCeZjrGD16WyYH7E6F5mHX\nmh4Lgf6kmYkjxl3t25iSkkKV6lXJq6iGEJ0nsphjx3DCzF9bttHwck7YjQgh0Gi1OFsG59PL8jtq\n4bdFP/PAAw+U6B73799Pm3b3Y66u9+RLXZYo8bvoJj7ubKl3OrgV4uPjebhbFy4kXkTpo8Welkff\np/syZ9Zsr+pXmXsT2dmSkZEpFk6nk9CIMLKqqsBXc+0DsxPjEROpySmlmhtVVE6ePMm7095jy19b\nsVmsGAwG2rVtx7ixr1KjRo3bsqYQgmXLlvH5V1+SnZ3Fo90fYdTIUQQVcDR3hezsbNatW4fT6aRz\n586EhITclr0VFbfbzY8//si8efPIzMzkxMkTWOoawe9yEneCySMHUfeGe8q0USUvgNMnTwEwffp0\nJs16H+sNOWyK82b6tujGgnmF61A9/kQvftv/J85K1ym5Z9gIPOcmOTEpn5J7cXm6/9Ms2r0Gd3lv\nFXzDKQvTxkxm5MiRJbJfUoQQ1KhdkziRirvc5QIKpxvDSTMTXhp/2xuRy9x+ZGdLRkam2MyaNYux\nb4zHXEkD/lpPBCPezhtjxvN/r/8fsbGxnDhxgipVqlC3bt27vV2ZInLhwgVq1q2Nudl1UcvzeZ7o\nVq0boj85dqJSDZw/Ew/A80Of5+vNS6D8DQUAaVaaG6oV2HPyComJiTRr2ZxMlwmTwYXWoUSZZuPX\nn1eUyhFi4+ZN2O+I924eDXAulxc79+fzzz4v8RolYdeuXXTq9hB5DYzeorI5dsIuKEi+lHT3NidT\nKsgJ8jIyMsVm+PDhzPlsFpVy/FFuTSYqw8jM9z5g1MhRPNT1YRo0aUi/FwfToEkjVBo1gcFBvDhy\nxD+6ofG/gfT0dEa/8jJlypejXIUoxr82npycnCLPDwsL8yiyXy8SGqKDFCs4vIsBNCkOevd8/Or/\nb9a0GUZL/uMuRZaD+Ph4uj/6CBs2bChw3cjISGKOn+TTKTMYdP/jTBjyMqdOxpaKowXQpGFjVLn5\nixmMVhWNGzUulTVKwsWLF1H4qL0dLQCjivTU9LuzKZm7ghzZkpGRuSkDBg5g6aZVWMtrYG8ahOuh\nnNHTqPeSnUrGCA7tP4hWq725MZlikZubS/0G93HJlYk9QgNCoE1yUMW/LPv37CvyM5/45pt8NOdT\nzFV1oFeB1YXqkKczgDNKD1olugw3IZIPB/buv3oMajKZqFqjGql6K65yOo+0wSUTnMqBGv7gBkOy\ni3GjxzDpzUkFrm2321mxYgVbt22lbJmyDBgwgLJly5b42Zw6dYqGjRthqqD2qOwLgSLBQqhJx5lT\ncRgMBtxuN8ePH0elUlGjRo0SV9OeP3+eixcvUqtWLQICAv527NmzZ6ldrw7WZgGeJudXSLZQXxXF\nof0HS7QXmbtPUSNbd101/vovZAV5GZl/HHl5eUKr1wnujxBU8RNEGryVsjuUET5lAsVPP/10W/dx\n5swZsXv37iIpiP+bmDlzptCW8S/wmc+fP7/Idlwul5gwcYIw+voIo7+P0BsNos+TfURQSLBQ6tRC\noVcLlUYt3n///Xxzz507Jzp3eUio1CohKS53FWgeKmgTIagfJKgfJDR6rUhISMg3NyMjQ9SsU0v4\nRAYKqvoJbaVAYfAxitWrV5fouVxhx44dou599YRGpxFqrUa069henD17VgghxLp160R4mQjhE+Qn\nDAG+omKVSiI6OvqW1klPTxftOnYQOqNe+EcGC51BJ14e87JwuVx/O69P3yeFPjJA0CLMo95fP0jo\nfY1i3bp1t7QPmX8WyAryMjIypcHFixepVqsGluYBcCDNE9EKvSFR/nweg+/vxTdfz70t6/fs/ThH\njh5BbdDhMtuZOGEC48eNL/W1/mmYzWYiy5clJ1KCiBv0mhJMPNn4YRb+8FOxbNpsNpKSktDr9VSv\nWZ3sckoIu1xlaHZiOG5ixZKf6dSpU4Fzy0SVJaOKAhItcNHkqQK0OpHsgikTJjFx4kSvOcNeGMZ3\naxZjr3pdF4AsG76n7Mz77nu+mD2LxMRLtL2/LeNfHUf58uUBsFqtLF26lHXrfyciPJxnhzxbaDNx\n8PSnVKvVV6UuTp48SeNmTTyRvKDL0b8UK74XnJyOOUVYWFixntv/7m/DnoRj2CvqPdpvNheGWAsT\nR7/Ga68V3hTc4XAw9a2pfP7lF2RnZFG7Xh0+eH8GDz30ULHWl/lnIifIy8jIlAoul4uwyHAyKing\nQp6nUvGGZGnNGTPjnx7B1KlTS3Vtt9tNzTq1OONMxVVe7znCMjtRHMqkYe36TJk0mS5dutwxodU7\nzZhXxzLzq89wR+qggq/XZ8qzJl7sNoBPZn5yS7a/+eYbXpo6HlP1G5LLL5roWL4pG9atL3BeZLky\nJGlyId0GDS+r+wsBl8z4JQnSklO9qgz9AwPIqa27Ji9xGe2hbDC7sFXQgl6FOtOFIVMQvXMXSUlJ\n9OrdixybCXuoChVK1Ml2Pv/kMwYPHlyk+xv2wnDmbljkaQ59HbrTFiYNffVvHaQbOXnyJI2bN8Hc\nxP+aQjxAroPgs27SklOLZEcIUaKfVSEEW7du5fDhw1SsWJGHH364yO2LZG4PcoK8jIxMqaBUKnln\n6tsYTlk9jta5PLBel2ida0eZYmPQoEGlvva2bdtITE/BVUF/7SVnUOGu5su+Ywfo80xfhr0wDCEE\nCxcupH6j+wgJD+XBhzsTHR1d6vu503z//fe4KxjgvAms1ym7m52oEq089+xzt2z7woULmFSO/B/4\nqIk/d67QeQP69YdLFqjqf62NkiRBWSNurYL1672dtFrUPAAAIABJREFUNIfDkb8LAGBz2LFFaaGM\nEQK1OCobyA4WdOjckY5dHiRNb8HuK8H5PJxqsNTz4cWRI8jIyCjS/R0/eRyXIf8rzqpzcezk8SLZ\nuMLZs2dRBxi8HS0AH0+ie1G7GJTE0crKyqJxsyZ06/UI42ZO5umhA6lQuSJxcXG3bFPmziE7WzIy\nMjdl2LBhzP70Syq6g8Dugh0paI/l4htjxXDMxLxvv6dSpUpFtieEYMGCBdS9rx4h4aE81PVh9u7d\nm2/cmTNnEL6q/NVcvmpwCEz1jPyw8CeGvzCc50YO44g7gfSqSjbE76Z9pw5s3ry5hHd+d7FYLB5Z\ngygj7EqGoxlwJAOiU+j75FNX5TeSkpKYNWsWM2fOJCYmpki2GzVqhK9Z6YlKXYcyy0Hzps0KnTdx\nwkQUbvJFqgDceiWJiYle1zp37owi0XrDjTk9ArXhNxxHq+BiahLOZsFQPcAjS9E0DOJyQJJQhRpZ\nvbrgxuOnT5/mgw8+YMaMGcTGxtKkURPUpvwnJQaLkiYNi1epWKdOHWzpeeC6ofIxy05Uhag7El16\nYcQLHEs7Q959RqyV9eTW0ZNkNPNIz0dv+9oyJUc+RpSRkSk2aWlpbNiwAbVaTefOnb1awhSF8a+/\nxudzZ2Eup/a8tDNsGC46WL/2d1q3bn113J49e2jXuQOmRr7eDley2SPK2TgUKTYXZZLF84LWXSdR\nkGyhnrIchw8cKunt3jW69ujG2pi/EOV9PJGtNCu43GgTbMSfiSciIoK538xl5KhRSGF63JJAkWrj\nuWefZeZHM/82kuJ0Oql7Xz3OmJNwlNd5WuokmTFecLInevff5ke169iezRcPePL3ruAWGPZms2Pr\ndu67776rl8+cOUOTZk0x+QnsAQqwuNAm2EApYWt6g8bXvlQoa8yfnxaTBWoFPm4Nn036gIEDB3p9\nPGXqFKbNmI471JObpUy1MWTQEL6f9z15UaqrTp10yUJgmoK4U6dvWkl4I7369GbNjj+wVNR5fs6y\n7RhOW/ny48945plnimWruNhsNvwC/LE3C/RW4xcCw94c9u78+++XzO1DPkaUkZG5bYSEhPDUU0/R\nq1evYjtaqampfPLJJ5hrGTxaTwYVlDNiLq9h9NiXvcY2adKEerXroj1t9kTUhIAMG8RmQ0XPupLd\nidJP6+1oAYTqOHr4qOcY6x7lg/dn4JMiUMabPPevkjBmwCsvjyEiIoK4uDhGvfQS1vt8sVTVY6ti\nwNLYn28WfM/KlSv/1rZKpWL71r/o1boLmugMFFuSaOpfg41//HnTF/e0d97DcNEBiWZPtMfkQBdj\n5v4293s5WgCVK1fm2JGjjH7iORprKvFI7bb8tnwFWkkNmbZrA4VAsrqvHU1ej1oBdhfOFDMPP/yw\n10e7du1i+kcfYG3oh72KAXsVA5ZGfny74Hs++uBD6qqj0OxMR7MjnebBNdnx1/ZiO1oAP87/gcGP\nPo3+QA7a7emEXpCYOf3D2+5ogadYQAiR/9lIEiqD5mpTcZl/LnJkS0ZG5o6yatUqnn5xEDnVb9CH\ncgkUW5JwOp1eEZmcnByGvTCMpUuX4XQ5QauAKv6eCjqbC+3+bJQaFebGft7RL6sL3f5szHmmf2wC\nvdlsZtGiRRw4dJAa1arTr1+/fI5AXFwc7057j01bNhMZEcErL71Mz549kSSJSZMn8d78T3FU8U4C\n55KJzhVbsG712iLtw+1243K5itU+Z/v27bz86hj279mHr58vQ59/nimTpxRZ9+uPP/7g0Z6P4Q7S\nYFE68DEp8VHqyFJasdbwjpixMxmtQs3bk99i7NixXnaGPPcs321ZhqjgXbQhnc+jf6tHmffd9xw5\ncoTjx49TrVo1GjZsWKKfB7vdTm5uLoGBgSgUdyZeIYSgWq0axOkzPH+gXMHsxHA4j5SkZIxGY+EG\nZG4bRY1syWUMMjIyd5TAwECExQlC4+0c2VwYfIz5XoR+fn789MNPzPpiFl26deXgySOYL5ngRCY4\nBcbQYNQqNZZEC6LM5eMnIdCet9K/f/9SdbQ2b97Me9OnEXfmDI0aNGTC/71B/fr1b8nW2bNnadm6\nFXkqOyatE4NDzYRJE9n85yYaNGhwdVyVKlUKldTIzMzEocyvoI5GSXoRE8kBFApFsR2H1q1bs3vH\nrmLNuZ6OHTsSf+YsCxcu5NKlS7Ru3ZqWLVvSpFlTEk9lYQtRgtON4pyZ8JAIli5c7HXEfIWsrCyE\nKv/3WKgkMrMyGfL8s/z0409oQ3xw5tqoUC6KtavWXJWYKC4ajYbg4OBbmnurSJLE5zM/pecTvbDY\nXBCohTwHhgsO3poyVXa07gHkyJaMjMwdxe12U6FSRRJ88yDysnPkFuhizTz/+N9LGbhcLtp37MD2\nI7txVff1HEGm29CdNqNTa3HpFDj0oMxyUr92Xdav/R0fH59C7RWH7777jhEvj8JcRgU+ahTZDnSJ\nDtauWsP9999fbHsPtG/LXxcPeTdRTjRTxRHCqZMxRXIS16xZQ5+BT5NXz7tSTjqSSRltENPeeY++\nffvesQhMaZCZmcnMT2ayZPky9Ho9Q4c8x5AhQwpNQl+wYAHDx7+Eqbb+mvMuBMYTFjq3bMe67Rsx\n19R7ctKEQHnBQnV1JMeOHP3HRjwLY/v27bw5ZRKHDx+mfPnyvPHa/9GzZ8+7va3/NLLOloyMzD+W\no0eP0r5jB6xKJw6dhDLTTpOGjVmzcjUGg6HQeefOnaNm7Vqe9ieq6xyIVAs1nGG8/840EhISaNSo\nES1atCjWy9Rut7N48WIWL1+CUW9gyKAhdOrUCUmSsNlshEaEkVtTBz7XHbUlW6hNJMcOHy3W/Wdn\nZxMWHoa9VYi3LMLlhOd9u/ZQs2bNAufGxsYybfo0dkbvokL5Cly8eJG41AtYIlUeWwkmT15bZV+M\naYInuvfk27nfFmt/t4Lb7UaSpDvuwNhsNlq0bsnJ5LNYwzwOmS7FSbWQ8iQmJpJWEY9kyRWEwOdA\nHhvX/UHTpk3v6F5l/n3ICfIyMjL/WOrWrUvC+QvM/+IbPnhlChvX/cHmPzf9raMFcPDgQTShPt6O\nFkCwjtjjMfTo0YMXX3yRli1bFuulb7VaadP2foaPH8XqU3+x5MB6ej7VmxdGvHh1XUmr8na0AMJ0\nxMbEcvRo8Zwth8PhiUTd+BtYklColdhstgLn7d27l8ZNmzB/yy+c1KXy+9ldxJ09Q+fmbfGPd8Gh\nDE8SdbNQKGPEVNvAoqVLOH68eLpSxWHXrl00a9kclUqF0dfI0OHDyM3NLbadhIQEoqOji93UXKvV\n8teWbUx84VVq2kKpYQvljWFj2LFtOxmp6WC84XsmSSh8tVy8eLHYe5SRuVXkyJaMjMw9w759+3jg\nwfaYGvp453sVU8n7Rj7//HPGvzfRUyF5xa7TjeFALlv+2IROp6PF/a3yS1A43bAlEa1BT9WqVVm4\n4Efq1atXpDVr1avDSSkRwq9zMLNshJyXSLqUiFKpzDeneesW7M6M8cgj5DogyewpEshyExwWyqUI\nG/hpvOZo48y8N3IiL7/8cj57JeXQoUO0atMac5QGIvRgd6E9b6N+mepE79hVJIc3MzOTPk89yba/\ntqH11WPLsTBs2FA+nPFhiY8/69Svy3Ep0dOk+gpON7rdWZw8foIKFSqUyL6MjBzZkpGR+dfRqFEj\nKpYrj/K85ZoYp8ON4ZyN0aNeumW783/6AXOowtuRUimwBitZ/vNy6tSpQ0RoBCRZrn0uBJzNhTA9\nthaBHHMkcH/bB4pchj/3qzkY4x0eWYcMK4rzJgwxFr6ePadAR8vhcLA3eo8nz+1crqdPpUICXzU2\npYv0tDSPPMQNKN2K25ZAPWnqZCyRaihzOWdMp8JWzcCJ0zFs3bq1SDYe6/U4W2L2YG0WSHZdPdbG\n/sz58Xvem/Zeifc3Y9p09PE2SL3885LnQB9joWfPx2RHS+aOIjtbMjIy9wySJLFu9VpqG6Iw7svF\nL8aGdk8m3ds9TEpqKk1aNKV3n97s3LmzWHYVCgUUElRXKBRIksSK5T8TlKzAJ8bqUTTfk+oRGa3u\n73HSyhiw+0rMnz+/SGu2bt2a/Xv3Mah9bxooKvBksy78tWUbjz5asCK4QqHwOGG5dojPg2ZhUMXP\n0zOxeRguvQL1GYtHKuEKuQ5EmuW2JVHv3rMbEeQdSUOSsPkp2Ldv303nnzp1it17orFX1l/LXdMq\nMVfS8OFHH1LSk44uXbqw9KfF1HSGI21MJCDWwZhnRzDvu3klsisjU1xk6QcZGZl7inLlynHowEEO\nHz7MpUuX0Ov1PPLYo1iCFDj8Few/dJo1D63l048+YciQIUWyObDfAI5MfR1ziLhW1Wd3oU1z0rtX\nb8CTZ3bh3HmWLVvGGxPfICFIQGU/rypAs9bFkWNFz9+qXr06X8+eU6SxSqWSxx7vybJ1v+IO13uL\nuCoknFF6fM870RzMw+wPWqFESrXx3TffEhISUuQ9FYeyZcuSaI7Ll8umsysoW7bsTefHx8ejCTBi\nubHnoFFFdlYaDocDjUZT8OQi0rVrV7p27Yrb7b6nqjJl/l3IOVsydw2Hw8HGjRvJzc2lTZs2hIeH\n3+0tydyDtO3Qji0XD3r6B14hz4HhqKnIYo92u52OnTtx4MRh8gIFkktCn+pi2LPP8+GMD/KNHzp8\nGN/+sQRnRe+EfsMpC9PGTGbkyJH55hw9epSEhATuu+8+IiMji3+jeNokVa9Zg0yjzdM78HrSrdQV\nZfjy0y/YuHEjAQEB9OnTh4iIiFtaqygsW7aMgUOHYKpt8Dh/QkCylaAkiXNn41m7di2Lly1Bp9Ux\ncMAzdOjQwSuPKyEhgWo1q2NtekN1aZaNyCQtly4k3La9y8iUBkXN2UIIcctfQCCwHogBfgf8Cxnn\nAvYDB4AVf2NPyPw32LFjhyhbtqxo3ryF6Na9uwgICBATJ04Ubrf7bm9N5h7C5XIJhVIhaBcp6FjW\n68uvbLBYv359kW05HA6xbNky8WTfp8TgZ4eIbdu2FTp23759Qq3TCOoHCTqUEbQvI6RagSIwOEhk\nZmZ6jU1MTBQNmzQWBn8f4R8VInQGvRg4eJBwOBy3dM/R0dFCY9QJ2l53zx3KCHWkr5gydcrVcbt2\n7RKPPv6YqFWvtujbr684cuTILa13MyZPnSJ0Br3wKxcifEMDRNny5cSePXvEA+3bCmN4gKBmgKC6\nvzAG+Ymhw4fmm//Ek32EvlyA4H8RnntpFioMQb5i7ty5t2W/MjKlyWW/5eb+UlEGFToZ3gfGXf73\neGBaIeNyimjv9j0RmX8Mubm5IiwsTPz862/C4nQJi9Mlzl1KFLXr1BGLFy++29uTuYdwu91CrVEL\n7o/I52z5hgeKLVu2lPqaWVlZokr1qkIT6iPQKwVqhUApiaCwYHH06NF84xs2aSRUVQM9TlnHsoK2\nkcIQGSAmvjnxlvfw3PPPCZWPVlArQFAvSBCsFZJGKRo1bSwsFotYvHixMPgZhVQjQNAkRCiqBQiD\nr1Fs2rSpBHdeOBkZGWLNmjVi+/btwuVyiW+++UYYIwIE7ctc+560jRSGAB+xc+dOr7lWq1W8OHKE\nMPgYhNagFyFhoWLWrFm3ZZ8yMqVNUZ2tEh0jSpJ0EnhACJEsSVIEsFkIkU+JT5KkXCHETbvVyseI\n/w3mzZvH8p9/ZsnPv3hd/+Xn5XwzezZ//PHHXdqZzL1In6f68PPu9TgrX3dcmG4lOMEjoVCY8vit\nMmXKFN77dia2apePEK0ucAsMx838tWkrDRs2vDr2yJEjtGjTCnOTG/o25jnwj7WTmZZxSyKgW7du\n5cGuD2EzCHADwVqI1GOItfLBhHd5480JZFZSgv91+U4pFqo5Qog5dvK2C48+0KEtW1MPe8taANLZ\nPF7qMZiPP/oo3xy73U52djZBQUEFVmPKyPwTuVPSD2FCiGQAIUQSEFrIOK0kSbslSdohSdIjJVxT\n5h4nOTmZylWq5rtepUpVkpKS7sKOZO5lPp35KeUIxOeEBc7lojttwRhnY9mSpaXuaAEsXr4UW4jK\n4zxJEuhVYFRjC1KyevVqr7EJCQmo/XTejhaAUUVOZjYuV36phqLw8y8/Yw9XQ/1gaBAMUT6gUmIO\nVjDn27k4cXs7WgChOs7HnyctLe2W1iwWN/mb2WazsWTJEqZOncqiRYuw2WxoNBpCQ0NL7GjZ7XbO\nnTuHyWQqkR0ZmdLkpr+JJEnaAFyfuSzh+U9pQjHWKS+ESJIkqRKwUZKkw0KIswUNnDx58tV/t23b\nlrZt2xZjGZl7gebNmzNs+HDemTbN6xfr2tWrad68+V3cmcy9SHh4OCePn2DZsmXs3LWTihUqMmDA\nAMLCwm7LelqNBlz5vQklCrRarde1+vXrY0s3gVPtnQCeYaNi1cq37AyqVCokpPw+jRCkpaVhNVtA\nGLydPLdAuN359lgYDoeD1NRUgoKC0Ol0xdrfM/0GsG/CGEyh11V3Ot3o0920+d//qFytCjkuC3la\nJz52FS+PfYXtW/+icuXK+Wy5XC6WLVvGvB/m43a76d+3H3369EGpVHpF6IQQTJ8xnXfeexe3cONy\nuOj7dF+++PTzYu9fRqYwNm/ezObNm4s9r6THiCeAttcdI24SQtS6yZzvgJVCiJ8L+Ew+RvwPIITg\nwc6d8Q8IYOKkyYSGhbHop5+Y9s7bbNu2jRo1atztLcrIFMqXX37Jq2+/4VGbv+JIWJzoDuZw/Mgx\nKlWq5DV+4OBBLF23AnNFjadxdoYNwxkb8+Z+R69evW5pD/v27eP+Dm0x3+cDmst/sLgF7E5F0qoQ\nJjtU8vUozV9Gec7MAxUb8+f6DX9rWwjBBx98wDvvvYvd6QC3YMjgwXz4wYdFlmFwOBx06tyJvccP\nYQrE0xg6VdC395McO36M6OTjuMpfO2JUXDDTOLAau3dGe9lxu930eOwRNu/6C1MIIEnoUpyoHRK5\nWTkY/XwYPGgw7783ja+//prX35qIuZrO06LH5kJ/1krXVp1YunhJkfYtI1Nc7kgjakmS3gcyhBDv\nS5I0HggUQrx2w5gAwCyEsEuSFAJsBx4RQpwswJ7sbP1HMJvNTJkyhR9++IGcnBzad+jAW1OnUr9+\n/bu9NZk7gBCC7du3s3fvXsqVK0f37t2LHHEpKvHx8axcuRJJknjkkUeIiooqFbsOh4Ou3buxc180\neQEClVuBOsXOu2+/w+iXRucb73Q6mfrWVD757FNys3KoVLUy77877ZYdrSuMffVVZn39FdZQJW5J\nQIIZjCqoHwRmJ+xP8+hfBWjwsanxU+jZtX3nTZ/DRx9/xJvvTsFU9XLTbavHaenVsTvzvy+aYOuV\n+/7ll19YtGQxOp2WgQMGUr9+fSpUqoitZZCXPhlugXZXJnGxp7z0uVauXMlTQ/pjqme8Nt4tPIKy\n5X3AX4PuvI3m1Rtw7OgxT9Pp69sVOd3o9mRxOuZUkXS//klYLBZWrVpFWloabdq0oW7dund7SzIF\ncKecrSBgCRAFnAd6CyGyJElqDAwVQjwvSVJLYDYe+QcF8LEQ4vtC7MnOlozMv5y8vDw6PfQgR04c\nwxmgRGNToLFLbPpzY5H7Ct6MKW9NZdr70zw98QSQauGtyVMZO3Zsqdh3u938+eefrFy1Ej9fP/r1\n60fNmvlqgwBP77+pb7/FoiWLkYC+Tz7FhDcmEBAQUOD44rBr1y4W/LCANevWEm9LgRr+Xr0dpeNZ\nNIyqxZhXxvD444/f1KF1u92EhIeSWUUFvtcJlTrd6HZnEn8mvkR6ePHx8dS5ry7mpv758tiMe3PY\nH72X6tWrX73Wb0B/foxe6XGsrueiCTJsUC/IU5ywPwebyYrrgfx78z9h45cFS2jXrl2x95uRkYHN\nZiMiIuK2FxVcz86dO3m4axfcRiVONZBu5aEHO7Nk4eLbkococ+vcEWertJGdLRmZfz9Dhw9j3prF\nnmq+Ky+wRDPl8nw5d+ZsiVW+//rrLzp374K5nhG0l4/YrE4Mh/PYtmkrjRo1KuEdFB2TyUT9hg1I\nsKdhj9AAAk2igwqGMA7tP4her7+pjaLwYJeH2HBhN0R4V/9xIY9+zXuwYF7hEal9+/YxcfKb7Nmz\nh7DwMGJOxOC6PyyfM+R/3MbqJSto3bp1sfeXnJzMO+++wy+//UpiYiKuELVHlPVKi54sG2EXlVy6\ncNErj3PQkEF8/9cv+Z2tBBNk2aBuEADa02YUaTYsdX281exdAt3uTE4eK17T6TNnzjBg0DPs2b0H\nhdKjhj939td3JIfYarUSWTaSrPJKCLmca+YS6E+amDz6/xg3btxt34NM0ZEbUcvIyPzjEEKwYMEC\nbOW13i/zCD3Zphyio6MLn1xEZn89B0uY8pqjBaBTYQ1T8/U3c0tsvzgsWLCAJEs69qoGT6TIV4O9\nmoFLuan89NNPpbZOzx6PYsjkWnNuPP/2yZZ4pHuPQudt376d+9s9wNpTO0irouC4lIhLBcRkew9M\nMpOTmslT/fsyYOAzxMbGFnlv6enpNGramK9+W0BCmAVXXX8wu2BPCmTbkBJMGGItzPr8y3yViP36\n9sOYJsDpvnbR5YaEPAi/5qhq7BKPP9YTwxkbWJ2ei0432jMW2rdvXyxHy2w20/J/rdmZfAx7y2Cs\nLQKJ02XQtUd3jh07VmQ7t8ratWtx6a9ztACUEpayaj6f9cVtX1/m9iA7WzIyMncMIYSnUk5zQ3m/\nJKHQq8jKyrpl2wcPHqTHY4+wZPlShDr/H5puFaRnpBc4NzU1lSNHjmA2m295/YJYtXY1Zj+8HUtJ\nwuQnWL1uTamt88wzz1AxqAy6WLPneC3div6EmTqVaxba2Bpg9NiXMZfXeFodGVQQqocmIXDJDHkO\nz6C4HDidg6jhx4VQCz9t/43GTZtw6NChAm2uWLGC/7W9n6o1qzPkuWeZPGUKGUozjqpGTz5VoBYa\nBqOUlERcUtOl2v/4Y92GAptlt2/fnicffwLjYRPSuTxPA+6dKZ4E+BCdx7lMNKN3q5n79VxGDhmO\n/kAuvodMaHdn0rVpOxb/tKhYz3LJkiWYlHbcUQZP5E2SIEyPLULN9A9mFMvWrZCZmYlbU0CgRKck\nOzs7/3WZewLZ2ZKRkbljKBQKGjVtDMkW7w9MDvKSsvnwk48ZOnwYhw8fLpbdnTt30vr+/7HqxFaP\n/lSiOV+Ux5gj0b1LN6952dnZ9HjsEaIqlqd1h/sJDQ9jytQplFY6Q3hYOApHATIRTggLLUyWsOjE\nxMTw66+/cvbsWXZt38kbQ8dQ0x5GHXcZ3nplApv/3FRojo8Qgn3Re70iRABolWiCDKgPZOFzyATn\n8qBpqOeI0k+Dq6KRvDJKXnl1TD6bE998k37PPsP29KPE+WUxb/Nyvpw9C2vgDa8ahYQrTMtTfZ5k\n1W8radmyZYF7lCSJr2fPYc0vK3muQx+ebf8EfR7thSbbjd8pO76HPcfPf274A61Wy7R33yMlKZnt\nf24l4dwFli9djo+PT4G2C+PwkcOYdM58111+Sg4cOlAsW7dCmzZtcKWavaN5gJRio02bNrd9fZnb\ng5yzJSMjc0fZsWMHnR56EEsZNSJIA1l2OJWDKtSIM1iFZHHD+TzKREYyYviLjBgx4qYvzGYtm7Mn\n5xSUMXiOmfameSrzonxACHTJTqoFl2fPrt1eSeLtO3Vgx+kD2CrqPDpYFieGWAvvvjGVl156qcT3\numfPHtp2bIe5vg/oLjs9FieGI3n8tXmbl9p8ccjNzeWxXj3ZsXMn6iADjkwzTRo2ZuWvv+Hv719k\nOz5+vpjqGz3CrFcQAp/DZpb/sJijR48yeea75Na4QafK6Ua1PQ2H3X71UnJysqfSsEmA9xFudIrn\n+1DGO59ME2dm4uBXmDChOJKNHlJTU4mOjiYoKIgWLVqUOM/veubMmcPL77yOubq3E6o4b6J3k4dY\n9OPCUlurMAYMfIbl637FXFYNOiVSqg1jsoud23fIVYn/MOScLRkZmX8krVq1YtvmrXSt2YawcwoC\nUiUUUT446/hBhAFRyQfROJiLFy8y5bNptGjdEovFUqg9IQR7o/dAxOWXo1IBjUNAr0I6nElEkppx\ng0exY9t2L0crNjaWXdHR2CrrrwmO6lWYK2p59/33SuVemzZtyluTp6Lbn4PhtBXjaSu6Azm89/a7\nt+xoATw37Hn+itmLpak/OdU0WJr4E33uMP0HDiiWnYEDB6I9b/OOAiZZCDD40rFjR48USwGROexu\n9AZvZ2Tr1q1oQn28HS3wHFGeyQHHdZEakwNFipV+/foVa79XCA0NpVu3brRq1apUHS2AJ598Eq0Z\npEvXRUczbegSHYwb82qprlUY33/7He9PeJuq5iCCT7t4tH57du3YKTta9zByZEtGRuauYvAxYmnk\nl/8lvT8NyhkwpMOHE95l2LBhhdow+vp4BD5viND4Hjaz9pdVBVbQrVmzhr7DB5Jd/QahTiFgYyJO\nh6PUevQlJSWxatUqJEmiW7duXvIJsbGxHD58mAoVKtCkSZOrEgNCCPbt20dycjKNGjUiMjISgJyc\nHMIiwrE1CwT1dY6G0412dyYJ5y4QEhJSpH2ZTCYe6vowB44cwhWgQm2T0DoUbPzjT+rVq4fD4SCy\nbBnSy4prCdtCoD1l5tkeT/P5Z59ftbV27VqefLY/ObVviILl2dEczkGhUEKoDoVbwp1qZvasrxgw\noHjO4Z3i2LFj9H7yCeLPnUOpVqLX6Jg7+2t69Ci82EDmv4ks/SAjI3NPYPT1wdzAF3QFOFtRRnAJ\n2pdpzJ+/F658/sKIF/j2t4XYql8nJ5FkoWy2gfPx5wqMfpw5c4Y699XD2vQ6CQKALBtlkrVcPJ9Q\n6HqXLl1i0aJFZGZm0q5dO9q1a1dsHSar1UqvPr3ZuHEj6mAjrlwblaIq8PuaddhsNh7u1oWEpEuo\nfLRY03IZNHAgX3z2BefOnaNeo/swNfHLZ9NM0NeCAAAZsklEQVT3QB67tu6gdu3aRd6HEILo6Gj2\n7t1LmTJl6Nat21Wl+MOHD/Pdd9/x1ZyvUAQZsKqdGPIU1KhUlU1/bMTX1/eqHbvdTnhkOFkVlBB8\nnWMWa2Z470EMHzqMtWvXotfrefTRR29bO6XSIi8vj+joaPz8/GjUqJHcHFumQIrqbMnqaDIyMneN\npKQkmjdvztYz+3BVuS4vK9cBuXYICoJEC37XvdQLYvq06Rw4eJAjB4/h8FehtUmo7RKrN6wq9Jip\ncuXKtG/Xjo0Ht2OtpPNUSOY5MJyxM3nau4WutXTpUp4ZNBB3qBabwsXMrz6jyX2NWLd6bbFU8Me+\nOpaN+//C0iwAi0ICoebEuQs80vNRMjMzOSul427o43EeKwUyf/lCqlapyqiRo1BJnr16aUqZnQiH\nK1+7oMIQQrBq1So+n/UF6RnpdH2oC0899RQajQan08mTTz/F2nVrcQdrUQUbcKSZGfhUX5588kk6\ndOiQ77lqNBpW/LyCbj26IzLArHBgzFNQs3I13p76Fkaj0Uuw9J+Kw+Fg9Csv8+1336LSanDZHAwd\n+jwz3p8hC4rK3DJyZEtGRuaO43K5GP7iC8xfMB+Nv4G81CwI0CLCtJ5WMxfNHjX0YB3GIyaW/rCI\nhx9++G9tXt8CqGzZsnTv3v2mDYjNZjPDXhjG0qXLUKiVqJVqJr/5Ji+NeqnASFVGRgblykd5xDOv\nKKy7BfqTZiaNeo3x48cX6f6dTid+Af5YGvpeS5y/bEu7OxOVWoWpka+3ZES2nchENZv+2MjSZUt5\na/p72KsZwF8DOXbUp0xMHj+B/3v9/4q0h1fHvcqsb+ZgilCARok2002gU8eBvftZuHAhE6ZPwVzL\neC3ql2HD57SNpEuJGI1GL1tms5m8vDxCQ0PJzs5myZIlJCcn06JFiwIds38yL4x4gXm/LMRcRec5\n2ra6MJy2MqzfYD6c8eHd3p7MPwz5GFFGRuYfy1tvv8W0Lz7CXEPvyTtyuJCOZ6M2uXE6nBCgBaMK\nbYaLwQMG8tmnn93Wdil5eXlkZGQQGRmJWq0udNx3333HyCmvYqp2gxOXZaNyjj9xMaeLtF5ubi5B\nwcE47w/Np9RuOJSLUEoeh+56LuTBqRx8Anyxmiw4nS5QS2B1gV6JWqXhhWefZ+ZHM2+6/tUj1EZ+\nXppn6jgTz3V9mt83/E6cT5ZHE+s6fGOszH7/M5566inPbWdlMXT4MFasWIGkkAgJCWHmhx+XuO9j\nSXC5XCxYsIA533yN2WLhicd7MeLFEfj55T92vZGcnBzCIyOwNvb3ziG0utAfzCEtORWDwVC4AZn/\nHPIxooyMzD+Wjz+Zibmq5lqCt1KBUEvYbXb0Ef64cm0YhZofFi6kS5cut30/Pj4+RdJjMpvNuBQF\n/EGoUmA2F14xWdB6kWUjuZBphqDrHBqbC1eeHUkhgUtciyqlWiA+F5qGkOerAZePp8Iv0watwkCh\nwGFzMXv2bCZNnERgYODfrr9u3TqkUF0+cVlHuIZfVvyCw+GAoPzRKKdKkJmZCXgiiQ8+3JlDSbHY\nmweBSuJippUBQwbi5+fHgw8+WOTnUVoIIejZ+3H+3LEFU5gCVBIxs2bw/fx57Nu91yvHrCASEhJQ\nG7RYbyzW0ClRqlUkJSVRuXLl23gHMv9W7p3YroyMzL8Ct9tNZnqmRwfrCufyPBGaNhFYahmxNw0k\nO9jNS6+MLjWB0dKgU6dOSKnWfIKTqhQ7j3TvXmQ7kiTx4fQPMMRZPI6Uyw3ZdgwxFka8OIIuXbqg\njzGDyQFu4VFxrxEAvpcrJ5USVPXzOGRZl5XetUq0/kZOnDhx0/V1Ok9VYD6cbjRaLR3ad0CRZvf+\nzOWGNNvV/oDR0dEcjz2JvYrB4zRLEgRpsZTXMGHSxCI/i9Jk69at/Ll1E6baBo9Ya7AOa3UDF0wp\nfPXVVzedX65cORxmG9hc3h9YXbjsTiIiIm7TzmX+7cjOloyMzB1FoVBQpXpVSLddu5hggur+1/Su\nJAl3OT1J6Sml0i+xtKhevToDnxmI8agZksyQaUMTZybQpGHiG8VzMHr37s3C+T9R2x2J6q9UyiRp\nePeNKcyYPp2FP/zES88Mw++kDWlTIgqb8LS6uR5J8uRrmS+rnbsFtlwLZcqUuenaPXr08KiUX2nJ\nAyAE+iQnQ54ZxFtTpuKTKlDGmzwOX7oVw3Ezj/Z45Gql49GjRz3r33i8G6gl5mRMsZ5FabFq1SrM\nAXhXl0oS1mAli5cvuel8Pz8/nhn4DPo46zWHy+bCEGdl2LCh8hGizC0jO1syMjJ3nPffeQ/DWU8P\nP4QAu8tbIws8/RKNGpKSku7OJgvhi88+59sv5tA6uC61HeGM6jWEI4cOU7Zs2WLb6tGjB8cOH8Vh\nd3DxfMLVxHyNRsN7775HdkYWTqfTI4CafUOkSQjPNaMK3AJ1vIXmzZpRsWLFm64bEhLC17PnoD+S\nhybODGdz8Tlipn75mowdO5Zq1aqxd/cenmjehfBzCmrYw5g+8R0WzJt/1UblypVRmJzegqgAuQ6i\nykcV+1mUBgaDAaUo4LXmdGMwGPNfL4DPZn7KwMeeQrc/G58Deej3Z/Nsn2eYPm16Ke9W5r+EnCAv\nIyNzV1i2bBnjXh9P/Jl4JJWEu4a/d58+pxvdnixiT8QQFVW8l/epU6eY+eknHD1+jEYNGvLSyFFF\nckJKkyvVkUePHqVy5cp06NDhlrWa1qxZQ+++fTwtZPw14HQjncmDSyZ8I4NwZlupX68+K1f8WmRB\nU4D4+HgWLFhAWno6D3bqxEMPPVTkPbrdbqrXqkG8SMcVpQeFBGYnhpNmvv3ya/r06XNL91oSYmJi\naNikEZYG11V5utwYj5mZ8/GX9O3bt8i2cnNzuXTpEmXLli12f0WZ/w5yNaKMjMw9gd1uZ/PmzTza\nqyeWiloI0YLJieG8nd4PP8b3335XLHubNm2i2yPdsYdrcBok1CaBNtXJht/X06JFi9t0F95kZmbS\n4cGOnDobh8tfhcrkJtgngC0bN1O+fPlbsjlv3jzGjBuL1WbDaXfQtl1b3n3rHZKSkqhYsWKxhExL\ni4SEBB5/ohdHjhxBbdThttiZ/OZkxozJ36T6TvHRRx/xxqSJOEM1uCQ3hkxB185dWPjjT/eUBIXM\nvYHsbMnIyNxT/PHHH7z62jiOHj5CYHAQo0e+xPjx44sVDRJCUL5SBRICzdfaywAkmakhIjh59Pht\n2Hl+evd5gt92b/Akj0sSCIHygoWGgVXZs2v3Ldt1Op2cP38ef39/goODS3HHJePs2bOkp6dTp04d\n9Hr9zSfcZk6dOsXixYsxm810796dFi1a3FbpEJn/LrKzJSMj858jJiaGxi2aYmp8gyCoEOh2ZRIX\ne7pICeR/R0pKCtNnTOfXVSvx9fFh+PPDGDx48FWn0Gw2ExQchK15kHfvQrdAuT2V335ecUfkLIrL\ngQMHWLpsKWaTGZvNxp4De/H382f488N4/PHHZWdFRqYAZJ0tGRmZ/xwqlQrhduf/QIBwixK3W0lJ\nSeG+Rg3IUFuwh6jAmc7oieNYt+F3li9ZBngEUlFIoLrh969CwqX06EB9M2cuTz/9dIn2Upq8MnYM\ns7+egyVQQiSaIEADZYxwyc2OoYNYtWZ1sY9zZWRkriEfYMvIyPxrqFy5MmUiy0Cyt8ColGihdp3a\nJW5+PH3GdI+jVdXoUbkP0WGubeD3DevZs2cPAKGhoYSGhkLmDdWDJgc43Njq+jJ0+DDMZnOJ9lJa\nbNu2jTnffo25oS9Cgef4tX6w538jDVjr+zJvwXz6D+iPy+W6qb3iEBsby9Dhw2jasjkDBw/yyEnI\nyPwLkZ0tGRmZfw2SJLHox4X4JrjQx1kgwYT+lAX/FFjw/fybG7gJv65a6YloXY9SwhqoYP369Vf3\n8MlHM9GftkCiGaxOSLHAwXSo7At+GpR+WrZu3Vri/fx/e3cfHVV953H8/Z2nJJMEAsozSGRRMLFG\nhfqEWKBKXbWrImxri25lha3r02nVVreeXbWnp5b1WFC3HtsuVBOtD7i6PoAUjkWNWkyFCMYEIeIK\naAgkEjOZJJNMfvtHYgWSQEJmMjPh8/orc/nduZ9wT5Lv3Pu7318s/OGxRwkf62m/5bm3CUYf1EvK\n54GRGTz13AruvufumB23uLiY06dOYdnap/lrcyVFxc9z5jlnsWrVqpgdQyRZqNgSkQFlypQpbNuy\nlX9fdBvfm3ox99xwB5UfbiM/P7/P752dlQUtnW9T+p33gKVg5syZwwvPPo9tqYN39sAnIZg4GMZ1\ntBBwHHEbiFgLh8P8rTXVl8sEHazN0TLMz5KlS2ltbe3zMZ1zXHPtAhpyA7TmBuGYdKLjMwmfkM6C\nhf9MW1e3gkVSmIotERlwhg8fzu23387jhUXceuutDB06NCbve92iHxKsih5YkIRasD2NzJs374Cx\n559/PnPmzME7bhBMHfZVD7G6CIRbOe+882KSafv27RQXF1NbW3tE+8+dcwVZ+6x9WaARGe1rMLbt\n9/2FO67MjckkEolQV1fX58xVVVXs2LEDhh+0oPeQNOrDDVRUVPT5GCLJRMWWiEgPLViwgItnzCa4\n8Qu8lSHStzWSsbme3z3yO0aNGtVp/AO/XsqISCaZW9pvafo/CpNR3kDRY4WkpaV1cYSeq6mpYcY3\nZ5J3yslc8p3LGD1uDDfefFOvrwpdeumlTMkrIFgehoAHWh28tbt9oest+6BkD5wwGFrbyMjIICcn\np0+5Afx+P67NQVcX0aLRPv/fiCQbtX4QEemlkpIS1qxZQ3Z2NvPmzTvkAsWhUIjCwkJeK36d3OPG\ns2jhIiZMmNDnDNPOm07JrjJacju6t0eiBLc0csdNt3Lnv93Zq/eKRCIsX76cR4seIxqNsu/zfVTu\n/JjoUD+MzQTnCG5r4q7b7uS2227rc3aAs6adzTs1Fbhx+y2j81mYSW4E5e9/oFYTkhLUZ0tEZICq\nqKhgyplTCU8d3F5ofSnUwpCtrdTs2dunYiUSifCjW37M8uXLMK8Xr8fD7T/5KXfcfkfMiqCtW7dy\nzrnTaEyP0pAeJdjsxV/fxmuvrqOgoCAmxxCJNxVbIiIppLGxkVdeeYVQKMTMmTMZO3Zst2NXr17N\ndxbOp27SQbfbnMNe/Yzm5mb8fn9MMtXU1DBixIiYvN/B6uvrKSoqonRTKfkn5XPVVVcxZMiQLsc6\n5ygrK6OxsZGCggICgUDM84j0lootEZEUsXbtWubMvQKy/Tif0VLdwI3XX8/iXy3u8krSzp07OWHy\niTR9Pae9NcOXPm9m7N4Mdnz8ST+mj79NmzZx+bwr2F29G0/Ah7W08V8PPMT8+fMTHU2Ociq2RERS\nQG1tLcfljqfhxHQY0nGlKhIl84Mwy3/z+05POX7pu9+/khdee6V98e50L9RFCFY28/CSh7j66qv7\n8TuIr/r6eo47fjz7RgIjM9qXYfoiQrAizJ9WrmbatGmJjihHsZ4WW3oaUUQkgZ555hnc0MBXhRZA\nwEvDKC/3P7Ck2/0eW/4oi/7xBwTfCxF4cy8jPvXx4H1LBlShBfDUU0/RkmkwKvjVepeDAjSO9vOr\n+xYnNpxID2ltRBGRBKqurqbR00Wj0HQf1dXV3e4XCARYcv+vuW/xfxIKhRg8ePCAfIKvsrKSBl8L\nkHHAdpflY1vltsSEEuklXdkSEUmgadOmkVlvcNAUCl9tC9+cMfOw+/t8PnJycgZkoQVQUFBAVnPn\nyfneuihTTpuSgEQivac5WyIiCeSc49xvTGfD9jKaxgTA78Gzu4nsvVC6YSO5ubmJjphQzc3NnDh5\nErt8dUTHZoDXoLqR4McRSv7yDnl5eYmOKEcxzdkSEUky7777LnfffTf33nsvlZWVQPsv67Wr1/Cj\nq69j+A4P2e+HuaxgFiXr3znqCy2AtLQ03n7zLS6YdDb+t/biL95Lvo1h9cpXVGhJytCVLRGROHPO\nseDaBTz9PytoGuLFi+HbE+Hnd93DLbfckuh4KSMcDhOJRGKyZJBILKj1g4hIklixYgU/+NdracgP\nftUXq6mVjNJ6/rq+RFdoRFKUbiOKiCSJR37/WxqGeQ5sQJruo2V4gKKiosQFE5F+oWJLRCTO6kMh\n8Hf+8NvqaSPUEEpAot5zzqE7DyJHRsWWiEiMOed47rnn+NZFF3L29GkcO2Qo6XvbDmzv0ObI2mdc\ncvEliQvaA5WVlVz07YvxBwKkpadxxbwr2LVrV6JjiaQUzdkSEYmxRT/8F5549kkahnvA7yG9po3o\n3jCeY4I0j/BC1BHc3ca5p57JqpdX4vEk5+fePXv2MDnvJPYNidI2JgPaHN5dTQxvDvJh+RaysrIO\nuW80GmXkyJH9mFikf2nOlohIApSWlvL4Hx+n4eRMGJ0JwzJomhTEMyzIOZNP5+S20ZyeNoH777qX\nl154MWkLLYCHH36YcFYbbeMz2+ebBbxEj8/kC08ThYWFXe5TVlbGlDOmMnb8OHL/7njyvpbP+vXr\n+zm5SHLRcj0iIjG0cuVKmo/xHTgZ3ozm4T4+211F+eayxIXrpXXFr9OU3flDe0OwjdfffIPrrrvu\ngO21tbWc+43p1A0Hd/YxYFC++zPOn30B72/azPjx4/srukhSSd6PVCIiKSgQCODt6ldr1BEIBPo/\nUB9MyD0eb1Nbp+2BiDEh9/hO25ctW0ZztuHGBMFj7QtHjwwSGeZn6YMP9EdkkaSkYktEJIbmzp2L\np7oZGvdbXLrNEdwdZdGCaxMX7AjceP0NpFW1QH3LVxv3NePbE2HhtQs7jd/43kYa0zsXZ5FM2FC6\nMZ5RRZKaii0RkRjKzc3ll7/4BRnv1eP7qAE+ridrcwNn5U9h4cLOBUoyKygo4LcPP0JWeSODypsY\nVNbIoMoWnv7jU10uJZSfl096U+c/K76w42t5+f2QWCQ56WlEERnQnHOUl5cTCoUoKCggLS2tX45b\nXl5OYVEhdXVf8O1LLmH27NlJPRn+UBobG3njjTfwer1Mnz6929uh1dXVTJx0AvVjvTAio31jTTOZ\nHzVT+u5GJk6c2I+pReJPy/WIyFGvrKyMy+fOYVfVp/gCflwkytL7l3DNNdckOtqAVVJSwpXzv8dn\nVVWYx8gZlMNjy//ArFmzEh1NJOZUbInIUS0cDjMu9zhqh7XBqIz2ydr1LQQrwrz8/IvMmDEj0REH\nLOcclZWVtLa2MmnSJMwO+7dIJCWpz5aIHNVWrFhBJB0YHWwvtACy/YRH+/jl4nsTmm2gMzMmTpzI\n5MmTVWiJoGJLRAao7du3E/K3dP6HbD+VH33U/4FE5KilYktEBqRTTjmF7MbOfZs9+1o4/dTTEpBI\nRI5WmrMlIgNSa2srJ540mR2uhtZxGeA1qG4i+HEzb73xJgUFBYmOKCIpTnO2ROSo5vP5eLv4TS48\neTqBt2vwF+/lJDeSl194SYWWiPQrXdkSkQEvHA4TiUTIyclJdBQRGUDU+kFEREQkjnQbUURERCQJ\nqNgSERERiSMVWyIiIiJxpGJLREREJI5UbImIiIjEkYotERERkThSsSUiIiISRyq2REREROJIxZaI\niIhIHKnYEhEREYkjFVsiIiIicdSnYsvM5prZ+2YWNbPTDzHuQjOrMLMPzeynfTmmJK9169YlOoL0\ngc5f6tK5S206fwNfX69sbQYuB17rboCZeYCHgG8B+cCVZja5j8eVJKRfGKlN5y916dylNp2/gc/X\nl52dc1sAzOxQK16fAWx1zv1fx9gngUuBir4cW0RERCQV9MecrTHAjv1e7+zYJiIiIjLgmXPu0APM\n1gAj9t8EOOBnzrkXO8b8GbjFObehi/3nArOdc4s6Xs8Hvu6cu7mLsYcOIyIiIpJEnHOHursH9OA2\nonPugj7m2Akct9/rscCn3RzrsIFFREREUkksbyN2VyiVABPNbLyZBYDvAi/E8LgiIiIiSauvrR8u\nM7MdwFnAS2a2qmP7KDN7CcA5FwVuAP4ElAFPOufK+xZbREREJDUcds6WiIiIiBy5pOsgb2aLzazc\nzErN7FkzG5ToTNJzPW10K8lDTYdTl5n9t5ntNrNNic4ivWNmY83sVTP7wMw2m9lNic4kPWdmaWa2\n3sw2dpy//zjU+KQrtmi/3ZjvnDsV2ArckeA80juHbXQryUNNh1PectrPnaSeVuDHzrk84Gzgev3s\npQ7nXDMw0zl3GnAq8PdmdkZ345Ou2HLOrXXOtXW8/AvtTy9KinDObXHObaX7ByYkufyt6bBzrgX4\nsumwpADnXDHweaJzSO8556qcc6UdX4eActSDMqU458IdX6bR3t2h23lZSVdsHWQBsCrRIUQGMDUd\nFkkwM8ul/erI+sQmkd4wM4+ZbQSqgDXOuZLuxvZpuZ4j1cNGqT8DWpxzTyQgohxCT86fpIyurkDq\nqRmRfmJmWcAK4OaOK1ySIjruwp3WMbf8eTPLc8590NXYhBRbh2uUamb/BFwEzOqfRNIbMWh0K8mj\nx02HRSS2zMxHe6FV6Jz730TnkSPjnPvCzNYBFwJdFltJdxvRzC4EfgL8Q8cENEldmreV/NR0OPUZ\n+llLVcuAD5xzSxMdRHrHzI41s8EdX2cA5wMV3Y1PumILeBDIAtaY2QYz+02iA0nPddfoVpKTmg6n\nNjN7AngLONHMPjGzaxKdSXrGzKYB3wdmdbQP2NBxsUFSwyjgz2ZWSvtcu9XOuZXdDVZTUxEREZE4\nSsYrWyIiIiIDhootERERkThSsSUiIiISRyq2REREROJIxZaIiIhIHKnYEhEREYkjFVsiIiIicfT/\nDX9u7LtHVykAAAAASUVORK5CYII=\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "#Let's plot the dataset and see how it is\n",
- "plt.scatter(X[:,0], X[:,1], s=40, c=y, cmap=plt.cm.BuGn)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Start Building our MLP building blocks\n",
- "\n",
- "Note: This process will eventually result in our own Neural Networks class"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### A look at the details"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "import random\n",
- "random.seed(123)\n",
- "\n",
- "# calculate a random number where: a <= rand < b\n",
- "def rand(a, b):\n",
- " return (b-a)*random.random() + a"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "##### Function to generate a random number, given two numbers\n",
- "\n",
- "**Where will it be used?**: When we initialize the neural networks, the weights have to be randomly assigned."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "# Make a matrix \n",
- "def makeMatrix(I, J, fill=0.0):\n",
- " return np.zeros([I,J])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Define our activation function. Let's use sigmoid function"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# our sigmoid function\n",
- "def sigmoid(x):\n",
- " #return math.tanh(x)\n",
- " return 1/(1+np.exp(-x))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Derivative of our activation function. \n",
- "\n",
- "Note: We need this when we run the backpropagation algorithm\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# derivative of our sigmoid function, in terms of the output (i.e. y)\n",
- "def dsigmoid(y):\n",
- " return y - y**2"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Our neural networks class\n",
- "\n",
- "When we first create a neural networks architecture, we need to know the number of inputs, number of hidden layers and number of outputs.\n",
- "\n",
- "The weights have to be randomly initialized."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "```python\n",
- "class MLP:\n",
- " def __init__(self, ni, nh, no):\n",
- " # number of input, hidden, and output nodes\n",
- " self.ni = ni + 1 # +1 for bias node\n",
- " self.nh = nh\n",
- " self.no = no\n",
- "\n",
- " # activations for nodes\n",
- " self.ai = [1.0]*self.ni\n",
- " self.ah = [1.0]*self.nh\n",
- " self.ao = [1.0]*self.no\n",
- " \n",
- " # create weights\n",
- " self.wi = makeMatrix(self.ni, self.nh)\n",
- " self.wo = makeMatrix(self.nh, self.no)\n",
- " \n",
- " # set them to random vaules\n",
- " self.wi = rand(-0.2, 0.2, size=self.wi.shape)\n",
- " self.wo = rand(-2.0, 2.0, size=self.wo.shape)\n",
- "\n",
- " # last change in weights for momentum \n",
- " self.ci = makeMatrix(self.ni, self.nh)\n",
- " self.co = makeMatrix(self.nh, self.no)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Activation Function"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "```python\n",
- "def activate(self, inputs):\n",
- " \n",
- " if len(inputs) != self.ni-1:\n",
- " print(inputs)\n",
- " raise ValueError('wrong number of inputs')\n",
- "\n",
- " # input activations\n",
- " for i in range(self.ni-1):\n",
- " self.ai[i] = inputs[i]\n",
- "\n",
- " # hidden activations\n",
- " for j in range(self.nh):\n",
- " sum_h = 0.0\n",
- " for i in range(self.ni):\n",
- " sum_h += self.ai[i] * self.wi[i][j]\n",
- " self.ah[j] = sigmoid(sum_h)\n",
- "\n",
- " # output activations\n",
- " for k in range(self.no):\n",
- " sum_o = 0.0\n",
- " for j in range(self.nh):\n",
- " sum_o += self.ah[j] * self.wo[j][k]\n",
- " self.ao[k] = sigmoid(sum_o)\n",
- "\n",
- " return self.ao[:]\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### BackPropagation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "```python\n",
- "def backPropagate(self, targets, N, M):\n",
- " \n",
- " if len(targets) != self.no:\n",
- " print(targets)\n",
- " raise ValueError('wrong number of target values')\n",
- "\n",
- " # calculate error terms for output\n",
- " output_deltas = np.zeros(self.no)\n",
- " for k in range(self.no):\n",
- " error = targets[k]-self.ao[k]\n",
- " output_deltas[k] = dsigmoid(self.ao[k]) * error\n",
- "\n",
- " # calculate error terms for hidden\n",
- " hidden_deltas = np.zeros(self.nh)\n",
- " for j in range(self.nh):\n",
- " error = 0.0\n",
- " for k in range(self.no):\n",
- " error += output_deltas[k]*self.wo[j][k]\n",
- " hidden_deltas[j] = dsigmoid(self.ah[j]) * error\n",
- "\n",
- " # update output weights\n",
- " for j in range(self.nh):\n",
- " for k in range(self.no):\n",
- " change = output_deltas[k] * self.ah[j]\n",
- " self.wo[j][k] += N*change + \n",
- " M*self.co[j][k]\n",
- " self.co[j][k] = change\n",
- "\n",
- " # update input weights\n",
- " for i in range(self.ni):\n",
- " for j in range(self.nh):\n",
- " change = hidden_deltas[j]*self.ai[i]\n",
- " self.wi[i][j] += N*change + \n",
- " M*self.ci[i][j]\n",
- " self.ci[i][j] = change\n",
- "\n",
- " # calculate error\n",
- " error = 0.0\n",
- " for k in range(len(targets)):\n",
- " error += 0.5*(targets[k]-self.ao[k])**2\n",
- " return error\n",
- "```"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "# Putting all together\n",
- "\n",
- "class MLP:\n",
- " def __init__(self, ni, nh, no):\n",
- " # number of input, hidden, and output nodes\n",
- " self.ni = ni + 1 # +1 for bias node\n",
- " self.nh = nh\n",
- " self.no = no\n",
- "\n",
- " # activations for nodes\n",
- " self.ai = [1.0]*self.ni\n",
- " self.ah = [1.0]*self.nh\n",
- " self.ao = [1.0]*self.no\n",
- " \n",
- " # create weights\n",
- " self.wi = makeMatrix(self.ni, self.nh)\n",
- " self.wo = makeMatrix(self.nh, self.no)\n",
- " \n",
- " # set them to random vaules\n",
- " for i in range(self.ni):\n",
- " for j in range(self.nh):\n",
- " self.wi[i][j] = rand(-0.2, 0.2)\n",
- " for j in range(self.nh):\n",
- " for k in range(self.no):\n",
- " self.wo[j][k] = rand(-2.0, 2.0)\n",
- "\n",
- " # last change in weights for momentum \n",
- " self.ci = makeMatrix(self.ni, self.nh)\n",
- " self.co = makeMatrix(self.nh, self.no)\n",
- " \n",
- "\n",
- " def backPropagate(self, targets, N, M):\n",
- " \n",
- " if len(targets) != self.no:\n",
- " print(targets)\n",
- " raise ValueError('wrong number of target values')\n",
- "\n",
- " # calculate error terms for output\n",
- " output_deltas = np.zeros(self.no)\n",
- " for k in range(self.no):\n",
- " error = targets[k]-self.ao[k]\n",
- " output_deltas[k] = dsigmoid(self.ao[k]) * error\n",
- "\n",
- " # calculate error terms for hidden\n",
- " hidden_deltas = np.zeros(self.nh)\n",
- " for j in range(self.nh):\n",
- " error = 0.0\n",
- " for k in range(self.no):\n",
- " error += output_deltas[k]*self.wo[j][k]\n",
- " hidden_deltas[j] = dsigmoid(self.ah[j]) * error\n",
- "\n",
- " # update output weights\n",
- " for j in range(self.nh):\n",
- " for k in range(self.no):\n",
- " change = output_deltas[k] * self.ah[j]\n",
- " self.wo[j][k] += N*change + M*self.co[j][k]\n",
- " self.co[j][k] = change\n",
- "\n",
- " # update input weights\n",
- " for i in range(self.ni):\n",
- " for j in range(self.nh):\n",
- " change = hidden_deltas[j]*self.ai[i]\n",
- " self.wi[i][j] += N*change + M*self.ci[i][j]\n",
- " self.ci[i][j] = change\n",
- "\n",
- " # calculate error\n",
- " error = 0.0\n",
- " for k in range(len(targets)):\n",
- " error += 0.5*(targets[k]-self.ao[k])**2\n",
- " return error\n",
- "\n",
- "\n",
- " def test(self, patterns):\n",
- " self.predict = np.empty([len(patterns), self.no])\n",
- " for i, p in enumerate(patterns):\n",
- " self.predict[i] = self.activate(p)\n",
- " #self.predict[i] = self.activate(p[0])\n",
- " \n",
- " def activate(self, inputs):\n",
- " \n",
- " if len(inputs) != self.ni-1:\n",
- " print(inputs)\n",
- " raise ValueError('wrong number of inputs')\n",
- "\n",
- " # input activations\n",
- " for i in range(self.ni-1):\n",
- " self.ai[i] = inputs[i]\n",
- "\n",
- " # hidden activations\n",
- " for j in range(self.nh):\n",
- " sum_h = 0.0\n",
- " for i in range(self.ni):\n",
- " sum_h += self.ai[i] * self.wi[i][j]\n",
- " self.ah[j] = sigmoid(sum_h)\n",
- "\n",
- " # output activations\n",
- " for k in range(self.no):\n",
- " sum_o = 0.0\n",
- " for j in range(self.nh):\n",
- " sum_o += self.ah[j] * self.wo[j][k]\n",
- " self.ao[k] = sigmoid(sum_o)\n",
- "\n",
- " return self.ao[:]\n",
- " \n",
- "\n",
- " def train(self, patterns, iterations=1000, N=0.5, M=0.1):\n",
- " # N: learning rate\n",
- " # M: momentum factor\n",
- " patterns = list(patterns)\n",
- " for i in range(iterations):\n",
- " error = 0.0\n",
- " for p in patterns:\n",
- " inputs = p[0]\n",
- " targets = p[1]\n",
- " self.activate(inputs)\n",
- " error += self.backPropagate([targets], N, M)\n",
- " if i % 5 == 0:\n",
- " print('error in interation %d : %-.5f' % (i,error))\n",
- " print('Final training error: %-.5f' % error)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Running the model on our dataset"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "error in interation 0 : 53.62995\n",
- "Final training error: 53.62995\n",
- "Final training error: 47.35136\n",
- "1 loop, best of 1: 36.7 ms per loop\n"
- ]
- }
- ],
- "source": [
- "# create a network with two inputs, one hidden, and one output nodes\n",
- "ann = MLP(2, 1, 1)\n",
- "\n",
- "%timeit -n 1 -r 1 ann.train(zip(X,y), iterations=2)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Predicting on training dataset and measuring in-sample accuracy"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "1 loop, best of 1: 11.8 ms per loop\n"
- ]
- }
- ],
- "source": [
- "%timeit -n 1 -r 1 ann.test(X)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " actual | \n",
- " prediction | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " 1.0 | \n",
- " 0.491100 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " 1.0 | \n",
- " 0.495469 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " 0.0 | \n",
- " 0.097362 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " 0.0 | \n",
- " 0.400006 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " 1.0 | \n",
- " 0.489664 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " actual prediction\n",
- "0 1.0 0.491100\n",
- "1 1.0 0.495469\n",
- "2 0.0 0.097362\n",
- "3 0.0 0.400006\n",
- "4 1.0 0.489664"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "prediction = pd.DataFrame(data=np.array([y, np.ravel(ann.predict)]).T, \n",
- " columns=[\"actual\", \"prediction\"])\n",
- "prediction.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0.076553078113180129"
- ]
- },
- "execution_count": 16,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "np.min(prediction.prediction)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Let's visualize and observe the results"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "# Helper function to plot a decision boundary.\n",
- "# This generates the contour plot to show the decision boundary visually\n",
- "def plot_decision_boundary(nn_model):\n",
- " # Set min and max values and give it some padding\n",
- " x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5\n",
- " y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5\n",
- " h = 0.01\n",
- " # Generate a grid of points with distance h between them\n",
- " xx, yy = np.meshgrid(np.arange(x_min, x_max, h), \n",
- " np.arange(y_min, y_max, h))\n",
- " # Predict the function value for the whole gid\n",
- " nn_model.test(np.c_[xx.ravel(), yy.ravel()])\n",
- " Z = nn_model.predict\n",
- " Z[Z>=0.5] = 1\n",
- " Z[Z<0.5] = 0\n",
- " Z = Z.reshape(xx.shape)\n",
- " # Plot the contour and training examples\n",
- " plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)\n",
- " plt.scatter(X[:, 0], X[:, 1], s=40, c=y, cmap=plt.cm.BuGn)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 18,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\nAMtPDmsIrI065iKQWimV6VvHFkIIIYRIivS6BkspZQ3YAhc/eckSePLR18+IGcKEEEIIIX4I+rhE\nCEDU5cFtwIComSydl2PposV1rgkTJkR/bm9vj729vR4qFEIIIYT4Nk5OTjg5OX3xOKVpceaceFNK\nGQL7gIOapi2I5fWlwElN0zZHfX0fsNM07VUsx2r6qCkums/qBDu3EEIIIZIOlb5jwo+hFJqmxZhI\n0tclwpXA3djCVZQ9QPuoQsoBfrGFKyGEEEKIH8E3XyJUSlUE2gC3lFLXiLz0NxrIAWiapi3XNO2A\nUqqOUsoFeA90+tZxhRBCCCGSqm8OWJqmnQUM4nFc328dSwghhBDieyA7uQshhBBC6JkELCGEEEII\nPZOAJYQQQgihZxKwhBBCCCH0TAKWEEIIIYSeScASQgghhNAzCVhCCCGEEHomAUsIIYQQQs8kYAkh\nhBBC6JkELCGEEEIIPZOAJYQQQgihZxKwhBBCCCH0TAKWEEIIIYSeScASQgghhNAzCVhCCCGEEHom\nAUsIIYQQQs8kYAkhhBBC6JkELCGEEEIIPZOAJYQQQgihZxKwhBBCCCH0TAKWEEIIIYSeScASQggh\nhNAzCVhCCCGEEHomAUsIIYQQQs8kYAkhhBBC6JkELCHEVwkNDSMgICixyxBCiCRNApYQIl783gbS\nZcAa0uXpT8YCAylTYxrHTt1J7LKEECJJkoAlhPgiTdOo23oRBqa5uefijvfbdwz7eQZteqzg4lXX\nxC5PCCGSHMPELkAIkfSdPHMP//caC39dhlIKgAYNG/Hi2XNmLfqT7atzJ3KFQgiRtMgMlhDii27c\neYJd1erR4epvVatX59bdp4lUlRBCJF0SsIQQX2RtZcGtG9ditN+6dROr7BaJUJEQQiRtErCEEF9U\nt4YNTx+7s/y3X4mIiADAzdWVcaNH0K9LlUSuTgghkh6laVpi16BDKaUlZE2az+oEO7cQP7KHLi9p\n03MF3r5BZMqYARcXV8YNq0//7g6JXZoQQsRKpe+Y8GMohaZpKka7BCwhRHxpmsad+8/wextI8aI5\nSJnSOLFLEkKIOCVmwJK7CIUQ8aaUokjBbIldhhBCJHmyBksIIYQQQs8kYAkhhBBC6JkELCGEEEII\nPZOAJYQQQgihZxKwhBBCCCH0TAKWEEIIIYSeScASQgghhNAzCVhCCCGEEHomAUsIIYQQQs8kYAkh\n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\npwAAAABJRU5ErkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plot_decision_boundary(ann)\n",
- "plt.title(\"Our initial model\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "**Exercise**: \n",
- "\n",
- "Create Neural networks with 10 hidden nodes on the above code. \n",
- "\n",
- "What's the impact on accuracy?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# Put your code here \n",
- "#(or load the solution if you wanna cheat :-)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "# %load solutions/sol_111.py\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "**Exercise:**\n",
- "\n",
- "Train the neural networks by increasing the epochs. \n",
- "\n",
- "What's the impact on accuracy?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "#Put your code here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "scrolled": false,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "# %load solutions/sol_112.py"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "# Addendum\n",
- "\n",
- "There is an additional notebook in the repo, i.e. [MLP and MNIST](extra/1.1.2 MLP and MNIST.ipynb) for a more complete (but still *naive* implementation) of **SGD** and **MLP** applied on **MNIST** dataset.\n",
- "\n",
- "Another terrific reference to start is the online book http://neuralnetworksanddeeplearning.com/. Highly recommended! "
- ]
- }
- ],
- "metadata": {
- "anaconda-cloud": {},
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- },
- "nbpresent": {
- "slides": {
- "5445cab1-b2b9-4492-a3be-c4063bd67610": {
- "id": "5445cab1-b2b9-4492-a3be-c4063bd67610",
- "prev": "ef2af7e1-6294-42cf-a434-b1e17cf679a7",
- "regions": {
- "4baa3e75-a346-47d1-a015-c9040545adbd": {
- "attrs": {
- "height": 0.4,
- "width": 0.8,
- "x": 0.1,
- "y": 0.5
- },
- "content": {
- "cell": "8c3060aa-fee9-438c-bc60-4685c0eb4750",
- "part": "whole"
- },
- "id": "4baa3e75-a346-47d1-a015-c9040545adbd"
- },
- "bde8ff6d-7eb8-4d83-b6ba-f57b94dc889d": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "3896ecb2-47fa-4dbc-a2ff-9c76e9dfe93e",
- "part": "whole"
- },
- "id": "bde8ff6d-7eb8-4d83-b6ba-f57b94dc889d"
- }
- }
- },
- "d263b7c7-85dc-422a-aec7-fa2c09bc1d23": {
- "id": "d263b7c7-85dc-422a-aec7-fa2c09bc1d23",
- "prev": "ff705989-f5c1-46a1-8f7a-0fe14a949357",
- "regions": {
- "053c599b-2e88-4270-bc7b-1299a2a2bd20": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "4fa2e86a-be32-4e78-96d9-f511a07e3908",
- "part": "whole"
- },
- "id": "053c599b-2e88-4270-bc7b-1299a2a2bd20"
- }
- }
- },
- "e3153a08-42da-4785-a596-7a9ebb6a6f19": {
- "id": "e3153a08-42da-4785-a596-7a9ebb6a6f19",
- "prev": "5445cab1-b2b9-4492-a3be-c4063bd67610",
- "regions": {
- "215ebdb3-236e-4a0d-aa65-6b4fb839e5b3": {
- "attrs": {
- "height": 0.4,
- "width": 0.8,
- "x": 0.1,
- "y": 0.5
- },
- "content": {
- "cell": "2f1c6299-954a-461a-b5c1-a86a1d12ad15",
- "part": "whole"
- },
- "id": "215ebdb3-236e-4a0d-aa65-6b4fb839e5b3"
- },
- "6b33306d-283d-47ef-afec-1f8b5e7fa9a5": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "6287766f-972f-4b4d-bee7-5418f0af74de",
- "part": "whole"
- },
- "id": "6b33306d-283d-47ef-afec-1f8b5e7fa9a5"
- }
- }
- },
- "edcbed78-ec6f-4c1d-84f0-fb1601a07f1d": {
- "id": "edcbed78-ec6f-4c1d-84f0-fb1601a07f1d",
- "prev": "f912a9b4-1188-440a-b13e-86224d1dada5",
- "regions": {
- "b619970a-3b72-4add-88af-158f75e81f2f": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "356d5ec7-3392-4daa-9671-4cc7111c5c91",
- "part": "whole"
- },
- "id": "b619970a-3b72-4add-88af-158f75e81f2f"
- },
- "d86b2236-e08b-44cf-9298-0c818a1c9c88": {
- "attrs": {
- "height": 0.4,
- "width": 0.8,
- "x": 0.1,
- "y": 0.5
- },
- "content": {
- "cell": "5678486b-caf4-440b-be62-2f1286982c71",
- "part": "whole"
- },
- "id": "d86b2236-e08b-44cf-9298-0c818a1c9c88"
- }
- }
- },
- "ef2af7e1-6294-42cf-a434-b1e17cf679a7": {
- "id": "ef2af7e1-6294-42cf-a434-b1e17cf679a7",
- "prev": "f59d310a-ea9f-4360-8151-6ea1c66a66ac",
- "regions": {
- "e33b4032-a118-4ab7-920b-5cd4c1bb0523": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "24ca50a0-b9ad-425d-a28f-6bd3ca3ac378",
- "part": "whole"
- },
- "id": "e33b4032-a118-4ab7-920b-5cd4c1bb0523"
- }
- }
- },
- "f59d310a-ea9f-4360-8151-6ea1c66a66ac": {
- "id": "f59d310a-ea9f-4360-8151-6ea1c66a66ac",
- "prev": null,
- "regions": {}
- },
- "f607e60a-8fc2-4061-bbbe-fb75f498cec7": {
- "id": "f607e60a-8fc2-4061-bbbe-fb75f498cec7",
- "prev": "d263b7c7-85dc-422a-aec7-fa2c09bc1d23",
- "regions": {
- "cea17e10-48c1-4b1a-a39e-5462b17adc89": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "df0121bc-10f1-4ace-840e-6fc89c6fdc7f",
- "part": "whole"
- },
- "id": "cea17e10-48c1-4b1a-a39e-5462b17adc89"
- },
- "fe327edc-53cc-4a66-b242-ffbc1148099f": {
- "attrs": {
- "height": 0.4,
- "width": 0.8,
- "x": 0.1,
- "y": 0.5
- },
- "content": {
- "cell": "c25d7194-10bd-4196-9d4c-592bf6e188f9",
- "part": "whole"
- },
- "id": "fe327edc-53cc-4a66-b242-ffbc1148099f"
- }
- }
- },
- "f912a9b4-1188-440a-b13e-86224d1dada5": {
- "id": "f912a9b4-1188-440a-b13e-86224d1dada5",
- "prev": "f607e60a-8fc2-4061-bbbe-fb75f498cec7",
- "regions": {
- "213f5824-f494-4cf6-8458-5dd5d629794c": {
- "attrs": {
- "height": 0.4,
- "width": 0.8,
- "x": 0.1,
- "y": 0.5
- },
- "content": {
- "cell": "92d4603e-7e39-4156-818c-785df6189fe8",
- "part": "whole"
- },
- "id": "213f5824-f494-4cf6-8458-5dd5d629794c"
- },
- "b141fdfe-4270-4293-a445-2b5642daf56e": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "15260f90-13d1-4fcc-afc6-379c507cb950",
- "part": "whole"
- },
- "id": "b141fdfe-4270-4293-a445-2b5642daf56e"
- }
- }
- },
- "ff705989-f5c1-46a1-8f7a-0fe14a949357": {
- "id": "ff705989-f5c1-46a1-8f7a-0fe14a949357",
- "prev": "e3153a08-42da-4785-a596-7a9ebb6a6f19",
- "regions": {
- "fe64f274-127a-4ab1-9a01-d011d67aa8fb": {
- "attrs": {
- "height": 0.8,
- "width": 0.8,
- "x": 0.1,
- "y": 0.1
- },
- "content": {
- "cell": "5e13607b-3ec5-4a95-a2d8-f898f20748da",
- "part": "whole"
- },
- "id": "fe64f274-127a-4ab1-9a01-d011d67aa8fb"
- }
- }
- }
- },
- "themes": {
- "default": "cdfd905a-2df0-447c-8f49-becf28e8e1b1",
- "theme": {
- "cdfd905a-2df0-447c-8f49-becf28e8e1b1": {
- "id": "cdfd905a-2df0-447c-8f49-becf28e8e1b1",
- "palette": {
- "19cc588f-0593-49c9-9f4b-e4d7cc113b1c": {
- "id": "19cc588f-0593-49c9-9f4b-e4d7cc113b1c",
- "rgb": [
- 252,
- 252,
- 252
- ]
- },
- "31af15d2-7e15-44c5-ab5e-e04b16a89eff": {
- "id": "31af15d2-7e15-44c5-ab5e-e04b16a89eff",
- "rgb": [
- 68,
- 68,
- 68
- ]
- },
- "50f92c45-a630-455b-aec3-788680ec7410": {
- "id": "50f92c45-a630-455b-aec3-788680ec7410",
- "rgb": [
- 155,
- 177,
- 192
- ]
- },
- "c5cc3653-2ee1-402a-aba2-7caae1da4f6c": {
- "id": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c",
- "rgb": [
- 43,
- 126,
- 184
- ]
- },
- "efa7f048-9acb-414c-8b04-a26811511a21": {
- "id": "efa7f048-9acb-414c-8b04-a26811511a21",
- "rgb": [
- 25.118061674008803,
- 73.60176211453744,
- 107.4819383259912
- ]
- }
- },
- "rules": {
- "blockquote": {
- "color": "50f92c45-a630-455b-aec3-788680ec7410"
- },
- "code": {
- "font-family": "Anonymous Pro"
- },
- "h1": {
- "color": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c",
- "font-family": "Lato",
- "font-size": 8
- },
- "h2": {
- "color": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c",
- "font-family": "Lato",
- "font-size": 6
- },
- "h3": {
- "color": "50f92c45-a630-455b-aec3-788680ec7410",
- "font-family": "Lato",
- "font-size": 5.5
- },
- "h4": {
- "color": "c5cc3653-2ee1-402a-aba2-7caae1da4f6c",
- "font-family": "Lato",
- "font-size": 5
- },
- "h5": {
- "font-family": "Lato"
- },
- "h6": {
- "font-family": "Lato"
- },
- "h7": {
- "font-family": "Lato"
- },
- "pre": {
- "font-family": "Anonymous Pro",
- "font-size": 4
- }
- },
- "text-base": {
- "font-family": "Merriweather",
- "font-size": 4
- }
- }
- }
- }
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/1.2 Introduction - Tensorflow.ipynb b/1.2 Introduction - Tensorflow.ipynb
deleted file mode 100644
index 8629f51..0000000
--- a/1.2 Introduction - Tensorflow.ipynb
+++ /dev/null
@@ -1,1667 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "# Tensorflow\n",
- "\n",
- ">**TensorFlow** (https://www.tensorflow.org/) is a software library, developed by Google Brain Team within Google's Machine Learning Intelligence research organization, for the purposes of conducting machine learning and deep neural network research. \n",
- "\n",
- ">TensorFlow combines the computational algebra of compilation optimization techniques, making easy the calculation of many mathematical expressions that would be difficult to calculate, instead.\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Tensorflow Main Features"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "* Defining, optimizing, and efficiently calculating mathematical expressions involving multi-dimensional arrays (tensors).\n",
- "\n",
- "* Programming support of **deep neural networks** and machine learning techniques.\n",
- "\n",
- "* Transparent use of GPU computing, automating management and optimization of the same memory and the data used. You can write the same code and run it either on CPUs or GPUs. More specifically, TensorFlow will figure out which parts of the computation should be moved to the GPU.\n",
- "\n",
- "* High scalability of computation across machines and huge data sets.\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- ">TensorFlow is available with Python and C++ support, but the **Python API** is better supported and much easier to learn."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Very Preliminary Example"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "11\n"
- ]
- }
- ],
- "source": [
- "# A simple calculation in Python\n",
- "x = 1\n",
- "y = x + 10\n",
- "print(y)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "import tensorflow as tf"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Tensor(\"y/read:0\", shape=(), dtype=int32)\n"
- ]
- }
- ],
- "source": [
- "# The ~same simple calculation in Tensorflow\n",
- "x = tf.constant(1, name='x')\n",
- "y = tf.Variable(x+10, name='y')\n",
- "print(y)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "**Meaning**: \"When the variable `y` is computed, take the value of the constant `x` and add `10` to it\""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "## Sessions and Models\n",
- "\n",
- "To actually calculate the value of the `y` variable and to evaluate expressions, we need to **initialise** the variables, and then create a **session** where the actual computation happens"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "model = tf.global_variables_initializer() # model is used by convention"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "11\n"
- ]
- }
- ],
- "source": [
- "with tf.Session() as session:\n",
- " session.run(model)\n",
- " print(session.run(y))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Data Flow Graph"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "* (**IDEA**) \n",
- "_A Machine Learning application is the result of the repeated computation of complex mathematical expressions, thus \n",
- "we could describe this computation by using a **Data Flow Graph**"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "* **Data Flow Graph**: a graph where:\n",
- " - each Node represents the _instance_ of a mathematical operation \n",
- " - `multiply`, `add`, `divide`\n",
- " - each Edge is a multi-dimensional data set (`tensors`) on which the operations are performed."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Tensorflow Graph Model"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "* **Node**: In TensorFlow, each node represents the instantion of an operation. \n",
- " - Each operation has inputs (`>= 2`) and outputs `>= 0`.\n",
- " \n",
- "* **Edges**: In TensorFlow, there are two types of edge:\n",
- " - Data Edges: \n",
- " They are carriers of data structures (`tensors`), where an output of one operation (from one node) becomes the input for another operation.\n",
- " - Dependency Edges: These edges indicate a _control dependency_ between two nodes (i.e. \"happens before\" relationship). \n",
- " + Let's suppose we have two nodes `A` and `B` and a dependency edge connecting `A` to `B`. This means that `B` will start its operation only when the operation in `A` ends. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Tensorflow Graph Model (cont.)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "* **Operation**: This represents an abstract computation, such as adding or multiplying matrices. \n",
- " - An operation manages tensors, and It can just be polymorphic: the same operation can manipulate different tensor element types. \n",
- " + For example, the addition of two int32 tensors, the addition of two float tensors, and so on.\n",
- "\n",
- "* **Kernel**: This represents the concrete implementation of that operation. \n",
- " - A kernel defines the implementation of the operation on a particular device. \n",
- " + For example, an `add matrix` operation can have a CPU implementation and a GPU one."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Tensorflow Graph Model Session"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "**Session**: When the client program has to establish communication with the TensorFlow runtime system, a session must be created. \n",
- " \n",
- "As soon as the session is created for a client, an initial graph is created and is empty. It has two fundamental methods:\n",
- "\n",
- "* `session.extend`: To be used during a computation, requesting to add more operations (nodes) and edges (data). The execution graph is then extended accordingly.\n",
- "\n",
- "* `session.run`: The execution graphs are executed to get the outputs (sometimes, subgraphs are executed thousands/millions of times using run invocations)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Tensorboard"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "**TensorBoard** is a visualization tool, devoted to analyzing Data Flow Graph and also to better understand the machine learning models. \n",
- "\n",
- "It can view different types of statistics about the parameters and details of any part of a computer graph graphically. It often happens that a graph of computation can be very complex."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Tensorboard Example"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Run the **TensorBoard** Server:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "```shell\n",
- "tensorboard --logdir=/tmp/tf_logs\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "[Open TensorBoard](http://localhost:6006)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Example"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "95\n"
- ]
- }
- ],
- "source": [
- "a = tf.constant(5, name=\"a\")\n",
- "b = tf.constant(45, name=\"b\")\n",
- "y = tf.Variable(a+b*2, name='y')\n",
- "model = tf.global_variables_initializer()\n",
- "\n",
- "with tf.Session() as session:\n",
- " # Merge all the summaries collected in the default graph.\n",
- " merged = tf.summary.merge_all() \n",
- " \n",
- " # Then we create `SummaryWriter`. \n",
- " # It will write all the summaries (in this case the execution graph) \n",
- " # obtained from the code's execution into the specified pathâ€\n",
- " writer = tf.summary.FileWriter(\"tmp/tf_logs_simple\", session.graph)\n",
- " session.run(model)\n",
- " print(session.run(y))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Data Types (Tensors)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## One Dimensional Tensor (Vector)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "tensor_1d = np.array([1, 2.5, 4.6, 5.75, 9.7])\n",
- "tf_tensor=tf.convert_to_tensor(tensor_1d,dtype=tf.float64)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[ 1. 2.5 4.6 5.75 9.7 ]\n",
- "1.0\n",
- "4.6\n"
- ]
- }
- ],
- "source": [
- "with tf.Session() as sess: \n",
- " print(sess.run(tf_tensor))\n",
- " print(sess.run(tf_tensor[0]))\n",
- " print(sess.run(tf_tensor[2]))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Two Dimensional Tensor (Matrix)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[[ 0 1 2 3]\n",
- " [ 4 5 6 7]\n",
- " [ 8 9 10 11]\n",
- " [12 13 14 15]]\n",
- "[[ 0. 1. 2. 3.]\n",
- " [ 4. 5. 6. 7.]\n",
- " [ 8. 9. 10. 11.]\n",
- " [ 12. 13. 14. 15.]]\n"
- ]
- }
- ],
- "source": [
- "tensor_2d = np.arange(16).reshape(4, 4)\n",
- "print(tensor_2d)\n",
- "tf_tensor = tf.placeholder(tf.float32, shape=(4, 4))\n",
- "with tf.Session() as sess:\n",
- " print(sess.run(tf_tensor, feed_dict={tf_tensor: tensor_2d}))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "# Basic Operations (Examples)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [],
- "source": [
- "matrix1 = np.array([(2,2,2),(2,2,2),(2,2,2)],dtype='float32') \n",
- "matrix2 = np.array([(1,1,1),(1,1,1),(1,1,1)],dtype='float32')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "tf_mat1 = tf.constant(matrix1) \n",
- "tf_mat2 = tf.constant(matrix2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "matrix_product = tf.matmul(tf_mat1, tf_mat2)\n",
- "matrix_sum = tf.add(tf_mat1, tf_mat2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "matrix_det = tf.matrix_determinant(matrix2)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "with tf.Session() as sess: \n",
- " prod_res = sess.run(matrix_product) \n",
- " sum_res = sess.run(matrix_sum) \n",
- " det_res = sess.run(matrix_det)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "matrix1*matrix2 : \n",
- " [[ 6. 6. 6.]\n",
- " [ 6. 6. 6.]\n",
- " [ 6. 6. 6.]]\n",
- "matrix1+matrix2 : \n",
- " [[ 3. 3. 3.]\n",
- " [ 3. 3. 3.]\n",
- " [ 3. 3. 3.]]\n",
- "det(matrix2) : \n",
- " 0.0\n"
- ]
- }
- ],
- "source": [
- "print(\"matrix1*matrix2 : \\n\", prod_res)\n",
- "print(\"matrix1+matrix2 : \\n\", sum_res)\n",
- "print(\"det(matrix2) : \\n\", det_res)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "# Handling Tensors"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 17,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "import matplotlib.image as mp_image\n",
- "filename = \"imgs/keras-logo-small.jpg\"\n",
- "input_image = mp_image.imread(filename)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "input dim = 3\n",
- "input shape = (300, 300, 3)\n"
- ]
- }
- ],
- "source": [
- "#dimension\n",
- "print('input dim = {}'.format(input_image.ndim))\n",
- "#shape\n",
- "print('input shape = {}'.format(input_image.shape))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 19,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\nuqg9fwAAAABJRU5ErkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "plt.imshow(input_image)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "### Slicing"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 20,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [],
- "source": [
- "my_image = tf.placeholder(\"uint8\",[None,None,3])\n",
- "slice = tf.slice(my_image,[10,0,0],[16,-1,-1])"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 21,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(16, 300, 3)\n"
- ]
- }
- ],
- "source": [
- "with tf.Session() as session:\n",
- " result = session.run(slice,feed_dict={my_image: input_image})\n",
- " print(result.shape)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 22,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\ngg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.imshow(result)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Transpose"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 23,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "x = tf.Variable(input_image,name='x')\n",
- "model = tf.global_variables_initializer()\n",
- "\n",
- "with tf.Session() as session:\n",
- " x = tf.transpose(x, perm=[1,0,2])\n",
- " session.run(model)\n",
- " result=session.run(x)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 24,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [
- {
- "data": {
- "image/png": "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\nfy8nLy7LAAAAAElFTkSuQmCC\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "plt.imshow(result)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "## Computing the Gradient\n",
- "\n",
- "- Gradients are free!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 25,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[0.5]\n"
- ]
- }
- ],
- "source": [
- "x = tf.placeholder(tf.float32)\n",
- "y = tf.log(x) \n",
- "var_grad = tf.gradients(y, x)\n",
- "with tf.Session() as session:\n",
- " var_grad_val = session.run(var_grad, feed_dict={x:2})\n",
- " print(var_grad_val)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Warming up: Logistic Regression"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 26,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "import tensorflow as tf\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "### Kaggle Challenge Data"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The Otto Group is one of the world’s biggest e-commerce companies, A consistent analysis of the performance of products is crucial. However, due to diverse global infrastructure, many identical products get classified differently.\n",
- "For this competition, we have provided a dataset with 93 features for more than 200,000 products. The objective is to build a predictive model which is able to distinguish between our main product categories. \n",
- "Each row corresponds to a single product. There are a total of 93 numerical features, which represent counts of different events. All features have been obfuscated and will not be defined any further.\n",
- "\n",
- "https://www.kaggle.com/c/otto-group-product-classification-challenge/data"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "##### For this section we will use the Kaggle Otto Group Challenge Data. You will find these data in \n",
- "`data/kaggle_ottogroup/` folder."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Logistic Regression"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "This algorithm has nothing to do with the canonical linear regression, but it is an algorithm that allows us to solve problems of classification(supervised learning). \n",
- "\n",
- "In fact, to estimate the dependent variable, now we make use of the so-called **logistic function** or **sigmoid**. \n",
- "\n",
- "It is precisely because of this feature we call this algorithm logistic regression.\n",
- "\n",
- "![](imgs/sigmoid.png)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Data Preparation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 27,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ]
- }
- ],
- "source": [
- "from kaggle_data import load_data, preprocess_data, preprocess_labels"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 29,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "9 classes\n",
- "93 dims\n"
- ]
- }
- ],
- "source": [
- "X_train, labels = load_data('data/kaggle_ottogroup/train.csv', train=True)\n",
- "X_train, scaler = preprocess_data(X_train)\n",
- "Y_train, encoder = preprocess_labels(labels)\n",
- "\n",
- "X_test, ids = load_data('data/kaggle_ottogroup/test.csv', train=False)\n",
- "\n",
- "X_test, _ = preprocess_data(X_test, scaler)\n",
- "\n",
- "nb_classes = Y_train.shape[1]\n",
- "print(nb_classes, 'classes')\n",
- "\n",
- "dims = X_train.shape[1]\n",
- "print(dims, 'dims')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 30,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array(['Class_1', 'Class_2', 'Class_3', 'Class_4', 'Class_5', 'Class_6',\n",
- " 'Class_7', 'Class_8', 'Class_9'], dtype=object)"
- ]
- },
- "execution_count": 30,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "np.unique(labels)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Hands On - Logistic Regression"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 31,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "# Parameters\n",
- "learning_rate = 0.01\n",
- "training_epochs = 25\n",
- "display_step = 1"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 32,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "# tf Graph Input\n",
- "x = tf.placeholder(\"float\", [None, dims]) \n",
- "y = tf.placeholder(\"float\", [None, nb_classes])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## The Model"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 33,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# Set model weights\n",
- "W = tf.Variable(tf.zeros([dims, nb_classes]))\n",
- "b = tf.Variable(tf.zeros([nb_classes]))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 34,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "# Construct model\n",
- "activation = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 35,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "# Minimize error using cross entropy\n",
- "cross_entropy = y*tf.log(activation)\n",
- "cost = tf.reduce_mean(-tf.reduce_sum(cross_entropy,reduction_indices=1))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 36,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "# Set the Optimizer\n",
- "optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 37,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "# Initializing the variables\n",
- "init = tf.global_variables_initializer()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Learning"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 38,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "def training_phase(X, Y):\n",
- " cost_epochs = []\n",
- " # Training cycle\n",
- " for epoch in range(training_epochs):\n",
- " _, c = sess.run([optimizer, cost], feed_dict={x: X, y: Y})\n",
- " cost_epochs.append(c)\n",
- " return cost_epochs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Prediction"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 39,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "def testing_phase(X, Y):\n",
- " # Test model\n",
- " correct_prediction = tf.equal(tf.argmax(activation, 1), tf.argmax(y, 1))\n",
- " # Calculate accuracy\n",
- " accuracy = tf.reduce_mean(tf.cast(correct_prediction, \"float\"))\n",
- " print(\"Model accuracy:\", accuracy.eval({x: X, y: Y}))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## TF Session"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 40,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Training phase finished\n"
- ]
- },
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEPCAYAAABRHfM8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VNW9//H3N3JRkAQCCBowQOpDvVGtNKXKwVBaL3Aq\nLUqLBiqgntZ66fFKa4sJphyVQ+1Pe/EUxQsCamsPXipVVJr6eJCbiiIItQgRQRAjt6AQSL6/P2Yy\nTMIkmUDm/nk9Dw8ze6+999o7M/s7e6313dvcHRERkeZkJboCIiKSGhQwREQkKgoYIiISFQUMERGJ\nigKGiIhERQFDRESiEtOAYWa9zGyhma02s5Vmdn2EMpeZ2dtmtsLMXjOzAWHzLjCzNWb2TzObFMu6\niohI0yyWeRhm1hPo6e4rzOxY4A1gpLuvCSszCHjP3Xea2QVAqbsPMrMs4J/AMGAzsAwYE76siIjE\nT0yvMNx9i7uvCL6uAt4D8hqUWezuO4NvF4fNLwTed/cKd98PPAGMjGV9RUSkcXHrwzCzPsAZwJIm\nil0J/C34Og/YGDbvIxoEGxERiZ828dhIsDnqKeCnwSuNSGWGAhOAwXWTIhTTfUxERBIk5gHDzNoQ\nCBaPufszjZQZAMwALnD37cHJHwEnhhXrRaAvI9LyCiQiIi3k7pF+mDcqHk1SDwGr3f3eSDPN7ETg\nL8A4d18XNmsZ8CUzyzezdsAY4NnGN+NAFcXFpbh7xv4rKSlJeB2S4Z+Og46FjkXT/w5HTK8wzOwc\noBhYaWZvETir3wbkA+7uM4DJQC7wBzMzYL+7F7p7jZldCywgENhmuvt7TW+xI5s318Zsf0REMllM\nA4a7/x9wVDNlrgKuamTeC0D/6Le4hxNOUC6iiEgspNHZdQ8FBSWUlY1PdEUSqqioKNFVSAo6Dgfp\nWBykY3FkYpq4Fy9m5sXFpZSVjadv3/xEV0dEJOmZGd7CTu+0CRjpsB/x0KdPHyoqKhJdDRGJk/z8\nfDZs2HDIdAUMaVbwQ5LoaohInDT2nT+cgJFGfRgiIhJLccn0Tibr11cwefIjbNpUS15elvo9RESi\nlFFNUuvXV/Dtb/+WdeumAB2pG1n10kvXZUzQUJOUSGZRk9Rhmjz5kbBgAdCRdeumMHnyIwmslcTS\n3LlzueCCCw5r2dNOO41XX321lWuU/IYPH85jjz2W6Go06/zzz+fxxx9v9bKtady4cdxxxx1x326s\nZFTA2LSploPBoo6yw5NF3759WbhwYauu87LLLuOFF15ottyECRO4/fbb60179913GTJkSIu2V1FR\nQVZWFtnZ2WRnZ9OvXz/uvvvuFq0j0ebPn8+4ceNadZ3Dhw+nU6dOZGdn065dO9q3bx86Rj/5yU8O\na50vvvgil156aauXlcZlVB9GXl4WsIf6QUPZ4dA6fTvqHwowM3bu3ImZ8cYbb3DuuecycOBAhg0b\n1qrbqamp4aijmryRQtKYP39+6PWECRPo3bt3k7+8U2nfMkqib4DVSjfR8mh88MEGLyi4yaHKwR2q\nvKDgJv/ggw1RLZ8OIh2r1jgurbGOPn36+CuvvBJx3owZM/xLX/qSd+3a1UeOHOmbN28OzXvxxRe9\nf//+3rlzZ//JT37i5557rs+cOdPd3R955BEfPHhwqOx//ud/+nHHHec5OTn+la98xVetWuUzZszw\ntm3bevv27b1Tp05+0UUXHVKfmpoanzp1qhcUFHh2drYPHDjQP/roo0PquWHDBs/KyvKamprQtMLC\nQp8+fXro/ebNm/3iiy/27t27e79+/fy+++4Lzfviiy/8hz/8oXfp0sVPOeUUnzZtmvfq1aveMbr7\n7rt9wIABfvTRR3tNTU2T61u6dKkPHDjQs7OzvWfPnn7TTTe5u/vevXt97Nix3rVrV+/cubMXFhb6\nJ5984u7uRUVFoeNXW1vrZWVlnp+f7z169PDLL7/cd+7cGdpXM/NHH33UTzzxRO/evbtPnTq18T9w\n0Pjx433y5Mn1pr388svep08f/6//+i/v2bOnT5w40SsrK3348OHevXt3z83N9e985zu+adOm0DKD\nBw/2Rx991N3dH3zwQT/33HP9hhtu8M6dO3tBQYEvWLDgsMquW7fOBw8e7NnZ2X7++ef71Vdf7ePH\nj4+4L3X1vuOOO7xr167er18/f+KJJ0Lzx44d69dff71feOGF3qlTJz/77LN9w4aD34lrr73We/Xq\n5Tk5OV5YWOiLFi0KzVu8eLF/9atfDf3tbr311tC81157zQcNGuSdO3f2M88801999dVGj3dj58fg\n9Jada1u6QDL+izZguAdObMXFpT506O1eXFyaUcHCPfKHp7i4NOxE76ETfnFxadTrbY11NBYwXnnl\nFe/WrZuvWLHCq6ur/brrrvMhQ4a4u/u2bds8Ozvbn376aa+pqfF7773X27VrVy9g/Nu//Zu7BwLL\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "[1 5 5 ..., 2 1 1]\n"
- ]
- }
- ],
- "source": [
- "# Launch the graph\n",
- "with tf.Session() as sess:\n",
- " # Plug TensorBoard Visualisation\n",
- " merged = tf.summary.merge_all() \n",
- " writer = tf.summary.FileWriter(\"/tmp/logistic_logs\", session.graph)\n",
- " \n",
- " sess.run(init)\n",
- " cost_epochs = training_phase(X_train, Y_train)\n",
- " print(\"Training phase finished\")\n",
- " \n",
- " #plotting\n",
- " plt.plot(range(len(cost_epochs)), cost_epochs, 'o', label='Logistic Regression Training phase')\n",
- " plt.ylabel('cost')\n",
- " plt.xlabel('epoch')\n",
- " plt.legend()\n",
- " plt.show()\n",
- " \n",
- " prediction = tf.argmax(activation, 1)\n",
- " print(prediction.eval({x: X_test}))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "[Open TensorBoard](http://localhost:6006)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Why Tensorflow ?"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "On a typical system, there are multiple computing devices. \n",
- "\n",
- "In TensorFlow, the supported device types are **CPU** and **GPU**. \n",
- "\n",
- "They are represented as strings. For example:\n",
- "\n",
- "* `\"/cpu:0\"`: The CPU of your machine.\n",
- "* `\"/gpu:0\"`: The GPU of your machine, if you have one.\n",
- "* `\"/gpu:1\"`: The second GPU of your machine, etc."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "If a TensorFlow operation has both **CPU** and **GPU** implementations, the GPU devices will be given priority when the operation is assigned to a device. \n",
- "\n",
- "For example, `matmul` has both CPU and GPU kernels. On a system with devices `cpu:0` and `gpu:0`, `gpu:0` will be selected to run `matmul`."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Example 1. Logging Device Placement\n",
- "\n",
- "`tf.Session(config=tf.ConfigProto(log_device_placement=True))`"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "```python\n",
- "# Creates a graph.\n",
- "a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')\n",
- "b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')\n",
- "c = tf.matmul(a, b)\n",
- "# Creates a session with log_device_placement set to True.\n",
- "sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))\n",
- "# Runs the op.\n",
- "print(sess.run(c))\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "```\n",
- "Device mapping:\n",
- "/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 760, pci bus\n",
- "id: 0000:05:00.0\n",
- "b: /job:localhost/replica:0/task:0/gpu:0\n",
- "a: /job:localhost/replica:0/task:0/gpu:0\n",
- "MatMul: /job:localhost/replica:0/task:0/gpu:0\n",
- "[[ 22. 28.]\n",
- " [ 49. 64.]]\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Using Multiple GPUs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "```python\n",
- "# Creates a graph.\n",
- "c = []\n",
- "for d in ['/gpu:0', '/gpu:1']:\n",
- " with tf.device(d):\n",
- " a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])\n",
- " b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])\n",
- " c.append(tf.matmul(a, b))\n",
- "with tf.device('/cpu:0'):\n",
- " sum = tf.add_n(c)\n",
- "# Creates a session with log_device_placement set to True.\n",
- "sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))\n",
- "# Runs the op.\n",
- "print sess.run(sum)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "```\n",
- "Device mapping:\n",
- "/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: GeForce GTX 760, pci bus\n",
- "id: 0000:02:00.0\n",
- "/job:localhost/replica:0/task:0/gpu:1 -> device: 1, name: GeForce GTX 760, pci bus\n",
- "id: 0000:03:00.0\n",
- "Const_3: /job:localhost/replica:0/task:0/gpu:0\n",
- "Const_2: /job:localhost/replica:0/task:0/gpu:0\n",
- "MatMul_1: /job:localhost/replica:0/task:0/gpu:0\n",
- "Const_1: /job:localhost/replica:0/task:0/gpu:1\n",
- "Const: /job:localhost/replica:0/task:0/gpu:1\n",
- "MatMul: /job:localhost/replica:0/task:0/gpu:1\n",
- "AddN: /job:localhost/replica:0/task:0/cpu:0\n",
- "[[ 44. 56.]\n",
- " [ 98. 128.]]\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## More on Tensorflow\n",
- "\n",
- "[Official Documentation](https://www.tensorflow.org/versions/r0.10/get_started/)"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/1.3 Introduction - Keras.ipynb b/1.3 Introduction - Keras.ipynb
deleted file mode 100644
index 973ab2f..0000000
--- a/1.3 Introduction - Keras.ipynb
+++ /dev/null
@@ -1,878 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "\n",
- "\n",
- "## Keras: Deep Learning library for Theano and TensorFlow"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Keras is a minimalist, highly modular neural networks library, written in Python and capable of running on top of either TensorFlow or Theano. It was developed with a focus on enabling fast experimentation. Being able to go from idea to result with the least possible delay is key to doing good research.\n",
- "ref: https://keras.io/"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Why this name, Keras?\n",
- "\n",
- "Keras (κÎÏας) means _horn_ in Greek. It is a reference to a literary image from ancient Greek and Latin literature, first found in the _Odyssey_, where dream spirits (_Oneiroi_, singular _Oneiros_) are divided between those who deceive men with false visions, who arrive to Earth through a gate of ivory, and those who announce a future that will come to pass, who arrive through a gate of horn. It's a play on the words κÎÏας (horn) / κÏαίνω (fulfill), and á¼Î»Îφας (ivory) / á¼Î»ÎµÏ†Î±Î¯Ïομαι (deceive).\n",
- "\n",
- "Keras was initially developed as part of the research effort of project ONEIROS (Open-ended Neuro-Electronic Intelligent Robot Operating System).\n",
- "\n",
- ">_\"Oneiroi are beyond our unravelling --who can be sure what tale they tell? Not all that men look for comes to pass. Two gates there are that give passage to fleeting Oneiroi; one is made of horn, one of ivory. The Oneiroi that pass through sawn ivory are deceitful, bearing a message that will not be fulfilled; those that come out through polished horn have truth behind them, to be accomplished for men who see them.\"_ Homer, Odyssey 19. 562 ff (Shewring translation)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "### Kaggle Challenge Data (again)\n",
- "\n",
- "See: [Data Description](1.2 Introduction - Tensorflow.ipynb#kaggle)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "9 classes\n",
- "93 dims\n"
- ]
- }
- ],
- "source": [
- "from kaggle_data import load_data, preprocess_data, preprocess_labels\n",
- "\n",
- "X_train, labels = load_data('data/kaggle_ottogroup/train.csv', train=True)\n",
- "X_train, scaler = preprocess_data(X_train)\n",
- "Y_train, encoder = preprocess_labels(labels)\n",
- "\n",
- "X_test, ids = load_data('data/kaggle_ottogroup/test.csv', train=False)\n",
- "\n",
- "X_test, _ = preprocess_data(X_test, scaler)\n",
- "\n",
- "nb_classes = Y_train.shape[1]\n",
- "print(nb_classes, 'classes')\n",
- "\n",
- "dims = X_train.shape[1]\n",
- "print(dims, 'dims')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "---"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Hands On - Keras Logistic Regression\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "from keras.models import Sequential\n",
- "from keras.layers import Dense, Activation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "93 dims\n",
- "Building model...\n",
- "9 classes\n",
- "Epoch 1/10\n",
- "61878/61878 [==============================] - 2s - loss: 1.0577 \n",
- "Epoch 2/10\n",
- "61878/61878 [==============================] - 3s - loss: 0.7702 \n",
- "Epoch 3/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.7283 \n",
- "Epoch 4/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.7075 \n",
- "Epoch 5/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.6945 \n",
- "Epoch 6/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.6854 \n",
- "Epoch 7/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.6787 \n",
- "Epoch 8/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.6735 \n",
- "Epoch 9/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.6694 \n",
- "Epoch 10/10\n",
- "61878/61878 [==============================] - 2s - loss: 0.6659 \n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "dims = X_train.shape[1]\n",
- "print(dims, 'dims')\n",
- "print(\"Building model...\")\n",
- "\n",
- "nb_classes = Y_train.shape[1]\n",
- "print(nb_classes, 'classes')\n",
- "\n",
- "model = Sequential()\n",
- "model.add(Dense(nb_classes, input_shape=(dims,)))\n",
- "model.add(Activation('softmax'))\n",
- "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n",
- "model.fit(X_train, Y_train)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Simplicity is pretty impressive right? :)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Now lets understand:\n",
- "The core data structure of Keras is a model, a way to organize layers. The main type of model is the Sequential model, a linear stack of layers.
\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "What we did here is stacking a Fully Connected (Dense) layer of trainable weights from the input to the output and an Activation layer on top of the weights layer."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "##### Dense"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "source": [
- "```python\n",
- "from keras.layers.core import Dense\n",
- "\n",
- "Dense(units, activation=None, use_bias=True, \n",
- " kernel_initializer='glorot_uniform', bias_initializer='zeros', \n",
- " kernel_regularizer=None, bias_regularizer=None, \n",
- " activity_regularizer=None, kernel_constraint=None, bias_constraint=None)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "* `units`: int > 0.\n",
- "\n",
- "* `init`: name of initialization function for the weights of the layer (see initializations), or alternatively, Theano function to use for weights initialization. This parameter is only relevant if you don't pass a weights argument.\n",
- "\n",
- "* `activation`: name of activation function to use (see activations), or alternatively, elementwise Theano function. If you don't specify anything, no activation is applied (ie. \"linear\" activation: a(x) = x).\n",
- "\n",
- "* `weights`: list of Numpy arrays to set as initial weights. The list should have 2 elements, of shape (input_dim, output_dim) and (output_dim,) for weights and biases respectively.\n",
- "\n",
- "* `kernel_regularizer`: instance of WeightRegularizer (eg. L1 or L2 regularization), applied to the main weights matrix.\n",
- "\n",
- "* `bias_regularizer`: instance of WeightRegularizer, applied to the bias.\n",
- "\n",
- "* `activity_regularizer`: instance of ActivityRegularizer, applied to the network output.\n",
- "\n",
- "* `kernel_constraint`: instance of the constraints module (eg. maxnorm, nonneg), applied to the main weights matrix.\n",
- "\n",
- "* `bias_constraint`: instance of the constraints module, applied to the bias.\n",
- "\n",
- "* `use_bias`: whether to include a bias (i.e. make the layer affine rather than linear)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## (some) others `keras.core.layers`"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "* `keras.layers.core.Flatten()`\n",
- "* `keras.layers.core.Reshape(target_shape)`\n",
- "* `keras.layers.core.Permute(dims)`\n",
- "\n",
- "```python\n",
- "model = Sequential()\n",
- "model.add(Permute((2, 1), input_shape=(10, 64)))\n",
- "# now: model.output_shape == (None, 64, 10)\n",
- "# note: `None` is the batch dimension\n",
- "```\n",
- "\n",
- "* `keras.layers.core.Lambda(function, output_shape=None, arguments=None)`\n",
- "* `keras.layers.core.ActivityRegularization(l1=0.0, l2=0.0)`"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "\n",
- "\n",
- "Credits: Yam Peleg ([@Yampeleg](https://twitter.com/yampeleg))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "##### Activation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "source": [
- "```python\n",
- "from keras.layers.core import Activation\n",
- "\n",
- "Activation(activation)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "**Supported Activations** : [https://keras.io/activations/]\n",
- "\n",
- "**Advanced Activations**: [https://keras.io/layers/advanced-activations/]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "##### Optimizer"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "If you need to, you can further configure your optimizer. A core principle of Keras is to make things reasonably simple, while allowing the user to be fully in control when they need to (the ultimate control being the easy extensibility of the source code).\n",
- "Here we used SGD (stochastic gradient descent) as an optimization algorithm for our trainable weights. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "\n",
- "\n",
- "Source & Reference: http://sebastianruder.com/content/images/2016/09/saddle_point_evaluation_optimizers.gif"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "\"Data Sciencing\" this example a little bit more\n",
- "====="
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "What we did here is nice, however in the real world it is not useable because of overfitting.\n",
- "Lets try and solve it with cross validation."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "##### Overfitting"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "In overfitting, a statistical model describes random error or noise instead of the underlying relationship. Overfitting occurs when a model is excessively complex, such as having too many parameters relative to the number of observations. \n",
- "\n",
- "A model that has been overfit has poor predictive performance, as it overreacts to minor fluctuations in the training data."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "source": [
- "\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "To avoid overfitting, we will first split out data to training set and test set and test out model on the test set.\n",
- "Next: we will use two of keras's callbacks EarlyStopping and ModelCheckpoint
"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "---"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Let's see first the model we implemented"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "_________________________________________________________________\n",
- "Layer (type) Output Shape Param # \n",
- "=================================================================\n",
- "dense_2 (Dense) (None, 9) 846 \n",
- "_________________________________________________________________\n",
- "activation_2 (Activation) (None, 9) 0 \n",
- "=================================================================\n",
- "Total params: 846.0\n",
- "Trainable params: 846.0\n",
- "Non-trainable params: 0.0\n",
- "_________________________________________________________________\n"
- ]
- }
- ],
- "source": [
- "model.summary()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from sklearn.model_selection import train_test_split\n",
- "from keras.callbacks import EarlyStopping, ModelCheckpoint"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train on 52596 samples, validate on 9282 samples\n",
- "Epoch 1/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6634 - val_loss: 0.6561\n",
- "Epoch 2/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6626 - val_loss: 0.6562\n",
- "Epoch 3/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6619 - val_loss: 0.6562\n",
- "Epoch 4/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6613 - val_loss: 0.6562\n",
- "Epoch 5/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6607 - val_loss: 0.6561\n",
- "Epoch 6/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6601 - val_loss: 0.6557\n",
- "Epoch 7/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6596 - val_loss: 0.6554\n",
- "Epoch 8/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6591 - val_loss: 0.6551\n",
- "Epoch 9/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6586 - val_loss: 0.6550\n",
- "Epoch 10/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6582 - val_loss: 0.6548\n",
- "Epoch 11/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6577 - val_loss: 0.6545\n",
- "Epoch 12/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6572 - val_loss: 0.6544\n",
- "Epoch 13/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6568 - val_loss: 0.6541\n",
- "Epoch 14/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6563 - val_loss: 0.6538\n",
- "Epoch 15/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6559 - val_loss: 0.6534\n",
- "Epoch 16/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6555 - val_loss: 0.6533\n",
- "Epoch 17/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6551 - val_loss: 0.6534\n",
- "Epoch 18/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6548 - val_loss: 0.6529\n",
- "Epoch 19/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6544 - val_loss: 0.6525\n",
- "Epoch 20/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6540 - val_loss: 0.6523\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 11,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train, test_size=0.15, random_state=42)\n",
- "\n",
- "fBestModel = 'best_model.h5' \n",
- "early_stop = EarlyStopping(monitor='val_loss', patience=4, verbose=1) \n",
- "best_model = ModelCheckpoint(fBestModel, verbose=0, save_best_only=True)\n",
- "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n",
- " batch_size=128, verbose=True, callbacks=[best_model, early_stop]) "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Multi-Layer Perceptron and Fully Connected"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "So, how hard can it be to build a Multi-Layer percepton with keras?\n",
- "It is baiscly the same, just add more layers!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "_________________________________________________________________\n",
- "Layer (type) Output Shape Param # \n",
- "=================================================================\n",
- "dense_3 (Dense) (None, 100) 9400 \n",
- "_________________________________________________________________\n",
- "dense_4 (Dense) (None, 9) 909 \n",
- "_________________________________________________________________\n",
- "activation_3 (Activation) (None, 9) 0 \n",
- "=================================================================\n",
- "Total params: 10,309.0\n",
- "Trainable params: 10,309.0\n",
- "Non-trainable params: 0.0\n",
- "_________________________________________________________________\n"
- ]
- }
- ],
- "source": [
- "model = Sequential()\n",
- "model.add(Dense(100, input_shape=(dims,)))\n",
- "model.add(Dense(nb_classes))\n",
- "model.add(Activation('softmax'))\n",
- "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n",
- "model.summary()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train on 52596 samples, validate on 9282 samples\n",
- "Epoch 1/20\n",
- "52596/52596 [==============================] - 1s - loss: 1.2076 - val_loss: 0.8897\n",
- "Epoch 2/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.8247 - val_loss: 0.7779\n",
- "Epoch 3/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.7595 - val_loss: 0.7378\n",
- "Epoch 4/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.7289 - val_loss: 0.7153\n",
- "Epoch 5/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.7101 - val_loss: 0.7008\n",
- "Epoch 6/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6973 - val_loss: 0.6903\n",
- "Epoch 7/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6880 - val_loss: 0.6814\n",
- "Epoch 8/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6809 - val_loss: 0.6760\n",
- "Epoch 9/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6753 - val_loss: 0.6711\n",
- "Epoch 10/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6705 - val_loss: 0.6678\n",
- "Epoch 11/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6669 - val_loss: 0.6642\n",
- "Epoch 12/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6636 - val_loss: 0.6607\n",
- "Epoch 13/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6608 - val_loss: 0.6588\n",
- "Epoch 14/20\n",
- "52596/52596 [==============================] - 1s - loss: 0.6584 - val_loss: 0.6565\n",
- "Epoch 15/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6563 - val_loss: 0.6559\n",
- "Epoch 16/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6545 - val_loss: 0.6547\n",
- "Epoch 17/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6529 - val_loss: 0.6524\n",
- "Epoch 18/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6513 - val_loss: 0.6503\n",
- "Epoch 19/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6500 - val_loss: 0.6489\n",
- "Epoch 20/20\n",
- "52596/52596 [==============================] - 0s - loss: 0.6487 - val_loss: 0.6481\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 13,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n",
- " batch_size=128, verbose=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Your Turn!"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Hands On - Keras Fully Connected\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Take couple of minutes and Try and optimize the number of layers and the number of parameters in the layers to get the best results. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "model = Sequential()\n",
- "model.add(Dense(100, input_shape=(dims,)))\n",
- "\n",
- "# ...\n",
- "# ...\n",
- "# Play with it! add as much layers as you want! try and get better results.\n",
- "\n",
- "model.add(Dense(nb_classes))\n",
- "model.add(Activation('softmax'))\n",
- "model.compile(optimizer='sgd', loss='categorical_crossentropy')\n",
- "model.fit(X_train, Y_train, validation_data = (X_val, Y_val), epochs=20, \n",
- " batch_size=128, verbose=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Building a question answering system, an image classification model, a Neural Turing Machine, a word2vec embedder or any other model is just as fast. The ideas behind deep learning are simple, so why should their implementation be painful?"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "#### Theoretical Motivations for depth"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ">Much has been studied about the depth of neural nets. Is has been proven mathematically[1] and empirically that convolutional neural network benifit from depth! "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "[1] - On the Expressive Power of Deep Learning: A Tensor Analysis - Cohen, et al 2015"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "#### Theoretical Motivations for depth"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "One much quoted theorem about neural network states that:"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ">Universal approximation theorem states[1] that a feed-forward network with a single hidden layer containing a finite number of neurons (i.e., a multilayer perceptron), can approximate continuous functions on compact subsets of $\\mathbb{R}^n$, under mild assumptions on the activation function. The theorem thus states that simple neural networks can represent a wide variety of interesting functions when given appropriate parameters; however, it does not touch upon the algorithmic learnability of those parameters."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "[1] - Approximation Capabilities of Multilayer Feedforward Networks - Kurt Hornik 1991"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/1.4 Keras Backend.ipynb b/1.4 Keras Backend.ipynb
deleted file mode 100644
index b70d98c..0000000
--- a/1.4 Keras Backend.ipynb
+++ /dev/null
@@ -1,497 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "# Linear Regression\n",
- "To get familiar with automatic differentiation, we start by learning a simple linear regression model using Stochastic Gradient Descent (SGD).\n",
- "\n",
- "Recall that given a dataset $\\{(x_i, y_i)\\}_{i=0}^N$, with $x_i, y_i \\in \\mathbb{R}$, the objective of linear regression is to find two scalars $w$ and $b$ such that $y = w\\cdot x + b$ fits the dataset. In this tutorial we will learn $w$ and $b$ using SGD and a Mean Square Error (MSE) loss:\n",
- "\n",
- "$$\\mathcal{l} = \\frac{1}{N} \\sum_{i=0}^N (w\\cdot x_i + b - y_i)^2$$\n",
- "\n",
- "Starting from random values, parameters $w$ and $b$ will be updated at each iteration via the following rule:\n",
- "\n",
- "$$w_t = w_{t-1} - \\eta \\frac{\\partial \\mathcal{l}}{\\partial w}$$\n",
- "
\n",
- "$$b_t = b_{t-1} - \\eta \\frac{\\partial \\mathcal{l}}{\\partial b}$$\n",
- "\n",
- "where $\\eta$ is the learning rate.\n",
- "\n",
- "**NOTE:** Recall that **linear regression** is indeed a **simple neuron** with a linear activation function!!"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Placeholders and variables\n",
- "To implement and run this simple model, we will use the [Keras backend module](http://keras.io/backend/), which provides an abstraction over Theano and Tensorflow, two popular tensor manipulation libraries that provide automatic differentiation.\n",
- "\n",
- "First of all, we define the necessary variables and placeholders for our computational graph. Variables maintain state across executions of the computational graph, while placeholders are ways to feed the graph with external data.\n",
- "\n",
- "For the linear regression example, we need three variables: `w`, `b`, and the learning rate for SGD, `lr`. Two placeholders `x` and `target` are created to store $x_i$ and $y_i$ values."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ]
- }
- ],
- "source": [
- "import keras.backend as K\n",
- "import numpy as np\n",
- "\n",
- "# Placeholders and variables\n",
- "x = K.placeholder()\n",
- "target = K.placeholder()\n",
- "lr = K.variable(0.1)\n",
- "w = K.variable(np.random.rand())\n",
- "b = K.variable(np.random.rand())"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Model definition\n",
- "Now we can define the $y = w\\cdot x + b$ relation as well as the MSE loss in the computational graph."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# Define model and loss\n",
- "y = w * x + b\n",
- "loss = K.mean(K.square(y-target))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Then, given the gradient of MSE wrt to `w` and `b`, we can define how we update the parameters via SGD:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "grads = K.gradients(loss, [w,b])\n",
- "updates = [(w, w-lr*grads[0]), (b, b-lr*grads[1])]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "The whole model can be encapsulated in a `function`, which takes as input `x` and `target`, returns the current loss value and updates its parameter according to `updates`."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "train = K.function(inputs=[x, target], outputs=[loss], updates=updates)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Training\n",
- "Training is now just a matter of calling the `function` we have just defined. Each time `train` is called, indeed, `w` and `b` will be updated using the SGD rule.\n",
- "\n",
- "Having generated some random training data, we will feed the `train` function for several epochs and observe the values of `w`, `b`, and loss."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Loss: 0.045, w, b: [0.48, 0.38]\n",
- "Loss: 0.010, w, b: [0.64, 0.41]\n",
- "Loss: 0.006, w, b: [0.72, 0.37]\n",
- "Loss: 0.003, w, b: [0.78, 0.34]\n",
- "Loss: 0.002, w, b: [0.82, 0.31]\n",
- "Loss: 0.001, w, b: [0.86, 0.30]\n",
- "Loss: 0.001, w, b: [0.88, 0.28]\n",
- "Loss: 0.000, w, b: [0.90, 0.27]\n",
- "Loss: 0.000, w, b: [0.92, 0.26]\n",
- "Loss: 0.000, w, b: [0.93, 0.26]\n"
- ]
- }
- ],
- "source": [
- "# Generate data\n",
- "np_x = np.random.rand(1000)\n",
- "np_target = 0.96*np_x + 0.24\n",
- "\n",
- "# Training\n",
- "loss_history = []\n",
- "for epoch in range(200):\n",
- " current_loss = train([np_x, np_target])[0]\n",
- " loss_history.append(current_loss)\n",
- " if epoch % 20 == 0:\n",
- " print(\"Loss: %.03f, w, b: [%.02f, %.02f]\" % (current_loss, K.eval(w), K.eval(b)))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "We can also plot the loss history:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[]"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# Plot loss history\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "plt.plot(loss_history)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Your Turn\n",
- "\n",
- "Please switch to the **Theano** backend and re-run the notebook.\n",
- "\n",
- "You _should_ see no difference in the execution!\n",
- "\n",
- "**Reminder**: please keep in mind that you *can* execute shell commands from a notebook (pre-pending a `!` sign).\n",
- "Thus:\n",
- "\n",
- "```shell\n",
- " !cat ~/.keras/keras.json\n",
- "```\n",
- "should show you the content of your keras configuration file."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Logistic Regression"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Let's try to re-implement the Logistic Regression Model using the `keras.backend` APIs.\n",
- "\n",
- "The following code will look like very similar to what we would write in Theano or Tensorflow - with the *only difference* that it may run on both the two backends."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from kaggle_data import load_data, preprocess_data, preprocess_labels"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "9 classes\n",
- "93 dims\n"
- ]
- }
- ],
- "source": [
- "X_train, labels = load_data('data/kaggle_ottogroup/train.csv', train=True)\n",
- "X_train, scaler = preprocess_data(X_train)\n",
- "Y_train, encoder = preprocess_labels(labels)\n",
- "\n",
- "X_test, ids = load_data('data/kaggle_ottogroup/test.csv', train=False)\n",
- "\n",
- "X_test, _ = preprocess_data(X_test, scaler)\n",
- "\n",
- "nb_classes = Y_train.shape[1]\n",
- "print(nb_classes, 'classes')\n",
- "\n",
- "dims = X_train.shape[1]\n",
- "print(dims, 'dims')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "feats = dims\n",
- "training_steps = 25"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "x = K.placeholder(dtype=\"float\", shape=X_train.shape) \n",
- "target = K.placeholder(dtype=\"float\", shape=Y_train.shape)\n",
- "\n",
- "# Set model weights\n",
- "W = K.variable(np.random.rand(dims, nb_classes))\n",
- "b = K.variable(np.random.rand(nb_classes))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "# Define model and loss\n",
- "y = K.dot(x, W) + b\n",
- "loss = K.categorical_crossentropy(y, target)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "activation = K.softmax(y) # Softmax"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "# Minimize error using cross entropy\n",
- "cross_entropy = K.categorical_crossentropy(activation, target)\n",
- "loss = K.mean(-K.sum(cross_entropy))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "grads = K.gradients(loss, [W,b])\n",
- "updates = [(W, W-lr*grads[0]), (b, b-lr*grads[1])]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "train = K.function(inputs=[x, target], outputs=[loss], updates=updates)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 16,
- "metadata": {
- "collapsed": false,
- "scrolled": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Loss: -218494.890625\n",
- "Loss: -989694.875\n"
- ]
- }
- ],
- "source": [
- "# Training\n",
- "loss_history = []\n",
- "for epoch in range(training_steps):\n",
- " current_loss = train([X_train, Y_train])[0]\n",
- " loss_history.append(current_loss)\n",
- " if epoch % 20 == 0:\n",
- " print(\"Loss: {}\".format(current_loss))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 18,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaoAAAEPCAYAAAATXoCrAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcFNW9///Xe1g0YBg2QQSEEYgajLtoFnXQqIiPiNeI\nwSBBXGLikvw0RjDEMIQkXkmMRr3e3K9ixBU1XhWjUVCcLNcFjMENQYyCMIgim4Bhm/n8/uiasWl6\nNpbp0nk/H496UP2pU+ecrmn60+dUdbUiAjMzs7QqKnQHzMzM6uJEZWZmqeZEZWZmqeZEZWZmqeZE\nZWZmqeZEZWZmqZbKRCVpoqQ3JM2W9KCkdlnbrpQ0P9l+QlZ8kKS5kt6UNDor3lvS85LmSbpXUssk\n3lrSlKSu5yTtVV8bZmbW9FKZqIBpQP+IOAiYD1wJIOmLwBnAfsBJwM3KKAJuAk4E+gNnSto3qesa\n4NqI2AdYBZybxM8FVkREP+B6YGJdbezk52tmZrVIZaKKiKcioip5+DzQI1k/BZgSEZsjYgGZJDYg\nWeZHxMKI2ARMAYYk+xwLPJisTwZOTdaHJI8B/piUq6sNMzMrgFQmqhznAI8n692BRVnbKpJYbnwx\n0F1SJ2BlVtJbnJTdoq6IqARWS+pYRxtmZlYALQvVsKTpQNfsEBDA2Ih4NCkzFtgUEfdmlckV5E+4\nkZTP3af6nlG11VVb3MzMCqBgiSoijq9ru6SRwGA+mZKDzIioZ9bjHsASMsllr9x4RHwoqb2komRU\nVV0+u64lkloAxRGxUlJtbeT2z8nLzGwbRESjzvuncupP0iDgCuCUiNiQtWkqMCy5Yq8E6AvMBGYB\nfSX1ktQaGAY8kuwzAxiarI/Mik9NHpNsn1FPG1uJCC8RjBs3ruB9SMviY+Fj4WNR97ItUpmogBuB\n3YDpkl6SdDNARMwB7gfmkDlvdWFkVAIXk7la8HUyF0PMTeoaA1wm6U2gIzApiU8COkuaD/x/Sbla\n28jXybPOGs877yzcsc/czMy2ULCpv7pE5pLx2rZdDVydJ/4EsE+e+DvAEXniG8hcht7gNnLdfffl\nPP/8OKZPv4SSkl71FTczs22Q1hHVp0Rb/vWv8Vx11e2F7khBlZaWFroLqeFj8Qkfi0/4WGwfbeuc\nYXOXuZgic+wGDhzHjBnjC9wjM7P0k0Q08mKKVE79fbqsY889PTCtT+/evVm40OfzzJqLXr16sWDB\ngh1Sl0dU2ygzolpLnz4+R9UQyaeoQnfDzJpIbf/nt2VE5aHAdhg+/DdOUmZmO5lHVNtIUm1XrVse\nHlGZNS8eUZmZWbPhRGW2E9xzzz0MGjRom/bdf//9+etf/7qDe5R+gwcP5s477yx0N+p14okncu+9\n99ZfsJFld6QRI0bw85//vMnb3Vk89beNPPXXOGme+ispKWHSpEkce+yx9RfewUaNGkXPnj23+01l\n4cKFlJSUsNtuuwHQuXNnLrjgAkaPHl3Pnp9tgwcP5m9/+xuSWL9+PZLYZZddADjrrLO4+eabC9zD\nnWPEiBH069ePn/3sZwXrw46c+vPl6VZQ77yzkKuuup2Kiiq6dy9iwoSzG31xyo6o47NAEqtXr0YS\n//jHPzjmmGM47LDDOO6443ZoO5WVlbRo0WKH1rmzPP744zXrDflQ8Gl6bs2Jp/6sYN55ZyHHH38j\nd999OeXl47n77ss5/vgbG3X/xB1RR11uueUW+vXrR+fOnTn11FN57733arZNmzaNfffdlw4dOnDR\nRRdRWlrKbbfdBsDkyZM56qijaspeeumldO3alfbt23PQQQcxZ84cbrnlFu6++24mTpxIu3btGDIk\n81ufJSUlzJiRuUdyVVUVv/rVr+jbty/FxcUcfvjhVFRU1Nrf6k+whx56KP3792f27Nk129577z1O\nP/10unTpQp8+fbjxxhtrtq1fv56RI0fSsWNH+vfvz69//Wt69vzkRwRKSkqYOHEiBx54ILvtthtV\nVVV11jdr1iwOP/xwiouL6datG5dffjkAGzZsYMSIEXTu3JkOHTpwxBFHsGzZMgAGDhxYc/wigl/8\n4hf07t2bPfbYg7PPPpuPPvoIyIwei4qKuOOOO+jVqxddunThV7/6VYP/ptmefvppSkpKuPrqq+nW\nrRvf/e53WbFiBSeffDJdunShU6dOnHLKKSxZ8skPKBx11FHccccdAEyaNInS0lIuu+wyOnToQN++\nfZk+ffo2lX377bc56qijKC4uZtCgQVx44YWMGjWqzn5PmDCBzp0706dPH+67774tyixfvpzBgwfT\nrl07vvrVr27xPcZLLrmEnj170r59e4444giee+65mm0vvPAChx56aM3fLntU/n//9398+ctfpkOH\nDhxyyCH87W9/25bD3niFvpPup3XJHDprqHzHa/jwsoC1AZG1rI3hw8saXO+OqKN3797x9NNPbxV/\n+umno3PnzjF79uzYuHFjXHLJJXH00UdHRMSyZcuiXbt28fDDD0dlZWX87ne/i9atW8ekSZMiIuL2\n22+Po446KiIinnzyyTjssMPio48+ioiIuXPnxtKlSyMi4uyzz46rrrqq1v5MnDgxDjjggJg/f35E\nRLzyyiuxYsWKrfq6YMGCKCoqis2bN0dExHPPPRdt27aNhx9+OCIiqqqq4tBDD41f/OIXsXnz5njn\nnXeiT58+MW3atIiIGD16dJSWlsbq1aujoqIiDjjggOjZs+cWfTr44IOjoqIi1q9fX299X/7yl+Ou\nu+6KiIh169bFCy+8EBER//M//xOnnHJKTR0vvfRSrFmzJiIiSktLa47fpEmTol+/frFgwYJYt25d\nnHbaaTFixIia5yopvvvd78aGDRvi5Zdfjl122SXmzp1b598537F+6qmnomXLlvHTn/40Nm3aFOvX\nr49ly5bFww8/HBs2bIg1a9bEN7/5zRg6dGjNPl/72tdi8uTJERFx6623RuvWreP222+PqqqquPHG\nG7c4bo0pO2DAgLjyyitj06ZN8de//jU+//nPx6hRo/I+l+p+jx49OjZu3BgzZsyINm3axL/+9a+I\niDjrrLNi9913j5deeik2b94c3/rWt2qOX0TEXXfdFatWrYrKysqYOHFidO/ePTZu3BgREYcffnhM\nmTIlIiLWrl0bM2fOjIiIRYsWRadOnWL69OkRkXldd+7cOe/rMSL///mseKPebz2isoKpqKgC2uZE\n27JkSVW+4jutjtrcc889nHvuuRx44IG0atWKq6++mueff553332XP//5z+y///4MGTKEoqIifvCD\nH9C1a9e89bRq1Yo1a9YwZ84cIoJ99tmn1rK5Jk2axC9/+Uv69u0LwJe+9CU6dOiQt2xEsPvuu9Om\nTRu++tWvcuGFF9aM0mbNmsWHH37I2LFjadGiBb179+a8885jypQpADzwwAOMHTuWdu3aseeee/KD\nH/xgq/p/+MMfsueee7LLLrvUW1+rVq146623WL58OW3atGHAgAE18eXLl/Pmm28iiYMPPrjmvFru\nsb/sssvo1asXbdq04eqrr2bKlClUVWX+rpIoKyujdevWHHDAARx44IG8/PLLDTqmuVq1akVZWRkt\nW7Zkl112oXPnzgwZMoTWrVuz2267MWbMGP7yl7/Uun+fPn0YOXIkkhg5ciSLFy9mxYoVDSpbUVHB\nihUrePvtt3nllVcYN24cLVu25KijjuLkk0+us98tWrSgrKyMVq1aMXDgQAYNGsQDDzxQs/3000/n\n4IMPpkWLFgwfPnyL0fXw4cMpLi6mqKiIyy+/nI8++oi33noLgNatWzN//nxWrFhB27ZtOfzwwwG4\n4447GDJkCF//+tcBOOGEEzjwwAN54oknGnagt4MTlRVM9+5FwLqcaONuSbUj6qjNkiVL6NXrk3Nd\nbdu2pWPHjlRUVLBkyZItpsYAevTokbeegQMHcvHFF3PRRRexxx578L3vfY+1a9c2qA+LFi1i7733\nblBZSSxfvpx169bxm9/8hvLycjZv3gxkpssqKiro2LEjHTt2pEOHDlx99dV88MEHNc81u/+5zy33\n+dVX32233ca8efPYd999OeKII3jssceAzEn+E088kWHDhtGjRw9Gjx5NZWXlVm3lHvtevXqxefNm\n3n///ZpYdrJv06ZNg49prq5du25xXurjjz/mvPPOo1evXrRv357jjjuODz/8sNb999hjjy36AdTa\nl9yyEcHatWt577336NSpU82FHpD/b5CtU6dO7LrrrjWPe/XqtcUUZW5b2X2aOHEi++23Hx06dKBj\nx458/PHHNc/xD3/4A6+//jr77LMPRx55JH/+85+BzN/8nnvu2eJv/sILL2zR5s7iRGUFM2HC2fTp\nM45PEs06+vQZx4QJZzdpHbXZc889t5jXX7duHcuXL6d79+5069aNRYsWbVF+8eLFtdZ18cUX8+KL\nL/L6668zb948fv3rXwOZ5FKXnj178q9//avBfY4IJHHppZeyyy671FzV1rNnT/bee29WrFjBihUr\nWLlyJatXr+bRRx+tea7Z/X/33Xe3qju7r/XV16dPH+655x6WLVvGFVdcwemnn86///1vWrZsyVVX\nXcXrr7/Os88+y5/+9KeaczjZco/9woULadWqVYNHoo2R+zeYOHEiCxcu5MUXX2TVqlU15wt3pm7d\nurF8+XI2btxYE8t9feVavnw5GzZ88ruy7777LnvuuWe9bT3zzDNcd911PPTQQ6xcuZKVK1fStm3b\nmvOb/fr1495772XZsmVcdtllfPOb32Tjxo307NmTc845Z4u/+Zo1a/jRj360jc+64ZyorGBKSnox\nffolDB/+GwYOHLdNt6TaEXUAbNy4kQ0bNtQslZWVfPvb3+YPf/gDr7zyChs2bOAnP/kJRx55JHvt\ntRcnn3wyr732GlOnTqWyspKbbrppi0/72V588UVmzpzJ5s2b+dznPseuu+5a8wm+a9euvP3227X2\n67zzzuOqq66qmZZ59dVXWblyZd6y1W801caMGcM111zDxo0bGTBgAO3atWPixImsX7+eyspKXn/9\ndV588UUAhg4dytVXX82qVauoqKjgv/7rv+o8XvXVd/fdd9d8Qi8uLkYSLVq0oLy8nNdee42qqip2\n2203WrVqRcuWW198fOaZZ3LdddexYMEC1q5dy9ixYxk2bBhFRUV5n+uOtGbNGtq0aUNxcTHLly9n\n/Pid/8sIe++9N1/60pcYP348mzZt4u9//3vNKLQ2lZWVlJWVsWnTJsrLy3niiScYOnRonftAZrTX\nqlUrOnbsyMaNGxk3bhwff/xxzfa77rqL5cuXA9CuXTuKioooKipixIgRPPTQQzz11FNUVVWxfv16\nysvLWbp06fY9+QZworKCKinpxV13ZX4m5a67xm3TZeU7oo6TTz6ZNm3a8LnPfY42bdowfvx4jj32\nWCZMmMBpp51G9+7deeedd2rOwXTq1IkHHniAH//4x3Tu3Jm5c+dy2GGHbTF1U+2jjz7i/PPPp2PH\njpSUlNC5c+eaq+DOPfdcXn/9dTp27Mhpp50GbPkJ/7LLLuOMM87ghBNOoLi4mPPOO49///vfeZ9D\n7sjg5JNPpmPHjtxyyy0UFRXx6KOPMnv2bEpKSujSpQvnn39+zZV0P/vZz+jevTslJSWccMIJDB06\ndIvnklt3ffU98cQT9O/fn3bt2nHppZdy33330bp1a5YuXcrpp59OcXEx/fv3Z+DAgQwfPnyrNs45\n5xxGjBjB0UcfTZ8+fWjTpg033HBDrf2pb2Ta0DKQOearVq2iU6dOfO1rX9vqXFF99WRvb0zZe++9\nl7/85S907tyZCRMmMGzYsLyvp2o9e/akbdu2dOvWjVGjRjFp0qSaaeK62h08eDDHHXcc/fr1Y++9\n96Z9+/Z069atZvvjjz/OfvvtR3FxMVdccQX3338/LVu2pFevXjz00ENMmDCB3Xffnd69e/Pb3/62\n5rzhzuQv/G4jf+G3cdL8hd8dISLo0aMH99xzD8ccc0yhu7Pdfv/733PffffxzDPPFLorzVb1xRBj\nx47datvTTz/N+eefX+dovNB8rz+zFJg2bRqrV69mw4YN/PKXvwTgyCOPLHCvts3SpUt59tlniQjm\nzZvHtddeWzPCs6Yxa9YsFixYQETw+OOP89hjj9VctdncpTJRSfq5pJcl/VPSE5L2yNp2g6T5kmZL\nOigrPlLSm5LmSfpOVvwQSa8k267PineQNC0p/6Sk4vraMMv23HPP0adPH7p06cJjjz3GI488UudU\nTZpt3LiRCy64gHbt2vH1r3+d//iP/+D73/9+obvVrCxZsoSjjz6adu3a8aMf/Yhbb72V/fffv9Dd\nSoVUTv1J2i0i1ibrlwBfjIjvSxoMXBQRJ0s6AvhdRBwpqQPwInAIIOAfwCERsVrSC8AlETFT0uPJ\nPk9KugZYHhETJY0GOkTEGEknARfntpGnj576a4TP+tSfmW3pMz/1V52kEm2B6rN1pwB3JGVeAIol\ndQVOBKZFxOqIWAVMAwYlI7HPR8TMZP87gFOT9SHA5GR9cvK4Op6vDTMzK4DU3pRW0i+A7wCrgIFJ\nuDuQ/eWCxUksN16RFV+cpzxA14h4HyAilkrqUksb1XXlv/bYzMx2qoKNqCRNT84dVS+vJv9+AyAi\nfhoRewF3A5dU75ZbDRB54tQTr7Nr27CPmZntJAUbUUXE8Q0sei/wJ6CMzIgo+74iPYAlSbw0J/5M\nHeUBlkrqGhHvJ1OEHyTxuvbZQllZWc16aWkppaWl+YoZmdu7NPR7LGb26Vd9C6zy8nLKy8u3q660\nXkzRNyLeStYvAY6KiDNyLqY4Erg+z8UURcn6oRGxqvpiCmAW8BhwQ0Q8kVxMsSIirpE0BmifXEyR\nt408ffTFFGZmjfRZ+uHE/5T0BTIXUSwEvgcQEY9LGizpLTI3dxuVxFdKmkAmQQUwPrmoAuBC4HZg\nV+DxiKi+1e81wP2SzgHeBYbW1YaZmRVGKkdUnwYeUZmZNd5n5vJ0MzOzak5UZmaWak5UZmaWak5U\nZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaW\nak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWaqlOVJIul1QlqWNW7AZJ8yXNlnRQ\nVnykpDclzZP0naz4IZJeSbZdnxXvIGlaUv5JScX1tWFmZk0vtYlKUg/g68DCrNhJQJ+I6AdcAPw+\niXcAfgYcDhwBjMtKPP8NnBcRXwC+IOnEJD4GeCoi9gFmAFfW1YaZmRVGahMVcB3w45zYEOAOgIh4\nASiW1BU4EZgWEasjYhUwDRgkaQ/g8xExM9n/DuDUrLomJ+uTk8d1tWFmZgWQykQl6RvAooh4NWdT\nd2BR1uPFSSw3XpEVX5ynPEDXiHgfICKWAl1qaaMiax8zM2tiLQvVsKTpQPZIRUAAPwV+Ahyfb7c8\njyNPnHridXatofuUlZXVrJeWllJaWlpP1WZmzUt5eTnl5eXbVUfBElVE5EtESNof6A28LElAD+Al\nSQPIjIh6ZhXvASxJ4qU58WfqKA+wVFLXiHg/mSL8IInXtc8WshOVmZltLfdD/Pjx4xtdR+qm/iLi\ntYjYIyL2jogSMonj4Ij4AJgKfAdA0pHAqmT67kngeEnFyYUVxwNPJlN6H0kakCS97wCPJE1NBc5O\n1s/Oiedrw8zMCqBgI6pGqJnCi4jHJQ2W9BawDhiVxFdKmgC8mJQfn1xUAXAhcDuwK/B4RDyRxK8B\n7pd0DvAuMLSuNszMrDAUUd8pG8tHUvjYmZk1jiQiIt+1ALVK3dSfmZlZNicqMzNLNScqMzNLNScq\nMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNL\nNScqMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNLNScqMzNLtVQmKknjJC2W9FKyDMradqWk+ZLe\nkHRCVnyQpLmS3pQ0OiveW9LzkuZJuldSyyTeWtKUpK7nJO1VXxtmZtb0UpmoEr+NiEOS5QkASfsB\nZwD7AScBNyujCLgJOBHoD5wpad+knmuAayNiH2AVcG4SPxdYERH9gOuBiUkbX8zXxs5/umZmlk+a\nE1W+5DAEmBIRmyNiATAfGJAs8yNiYURsAqYkZQGOBR5M1icDp2bVNTlZ/2NSDuCUWtowM7MCSHOi\nukjSbEm3SipOYt2BRVllKpJYbnwx0F1SJ2BlRFRlx3PriohKYLWkjnW0YWZmBdCyUA1Lmg50zQ4B\nAYwFbgZ+HhEh6RfAtcB55B9lBfkTbiTlc/eJrPZq2ydffCtlZWU166WlpZSWluYrZmbWbJWXl1Ne\nXr5ddRQsUUXE8Q0segvwaLK+GOiZta0HsIRMctkrNx4RH0pqL6koGVVVl8+ua4mkFkBxRKyUVFsb\nW8lOVGZmtrXcD/Hjx49vdB2pnPqTtEfWw9OA15L1qcCw5Iq9EqAvMBOYBfSV1EtSa2AY8Eiyzwxg\naLI+Mis+NXlMsn1GPW2YmVkBFGxEVY+Jkg4CqoAFwAUAETFH0v3AHGATcGFEBFAp6WJgGpnkOyki\n5iZ1jQGmSJoA/BOYlMQnAXdKmg8sJ5Pc6mrDzMwKQH4P3jaSnL/MzBpJEhHRqK/8pHLqz8zMrJoT\nlZmZpZoTlZmZpZoTlZmZpZoTlZmZpZoTlZmZpZoTlZmZpZoTlZmZpZoTlZmZpZoTlZmZpZoTlZmZ\npZoTlZmZpZoTlZmZpZoTlZmZpZoTlZmZpVqDEpWkoQ2JmZmZ7WgN+uFESS9FxCH1xZoT/3CimVnj\nbcsPJ9b5U/SSTgIGA90l3ZC1qR2wufFdNDMza5w6ExWwBHgROAX4R1Z8DXDpzuqUmZlZtTrPUUXE\nyxExGegbEZOT9anAWxGxcmd2TNIlkuZKelXSf2bFr5Q0X9Ibkk7Iig9Kyr8paXRWvLek5yXNk3Sv\npJZJvLWkKUldz0naq742zMys6TX0qr/pktpJ6gi8BNwi6bqd1SlJpcA3gP0j4kvAb5L4fsAZwH7A\nScDNyigCbgJOBPoDZ0raN6nuGuDaiNgHWAWcm8TPBVZERD/gemBi0sYX87Wxs56rmZnVraGJqjgi\nPgJOA+6IiCOA43Zet/g+8J8RsRkgIj5M4kOAKRGxOSIWAPOBAckyPyIWRsQmYEpSFuBY4MFkfTJw\nalZdk5P1PyblIDPNma8NMzMrgIYmqpaSupEZafxpJ/an2heAo5Mpu2ckHZrEuwOLsspVJLHc+GIy\nF4B0AlZGRFV2PLeuiKgEVicjxtraMDOzAqjvYopqPweeBP4vImZJ2pvMSGObSZoOdM0OAQH8NOlX\n+4g4UtLhwAPA3kmZXEH+hBtJ+dx9qq8pr62u2uJbKSsrq1kvLS2ltLQ0XzEzs2arvLyc8vLy7aqj\nQYkqIh4gkyyqH78NfHN7Go6I42vbJul7wP8m5WZJqkxGR4uBvbKK9iBzZaLyxSPiQ0ntJRUlo6rq\n8iR19QSWSGpBZnpzpaTqeG4bW8lOVGZmtrXcD/Hjx49vdB0NvTNFD0kPSfpA0vuSHpTUo9GtNdzD\nJOfAJH0BaB0Ry8lccfit5Iq9EqAvMBOYBfSV1EtSa2AY8EhS1wyg+i4aI7PiU5PHJNtnZMWH5WnD\nzMwKoKFTf38A7uGTN/yzklito6Lt9AfgNkmvAhuA7wBExBxJ9wNzgE3AhcntISolXQxMI5N8J0XE\n3KSuMcAUSROAfwKTkvgk4E5J84HlZJJbXW2YmVkBNPQWSrMj4qD6Ys2Jb6FkZtZ423ILpYZe9feh\npLMktUiWs8iMQszMzHaqhiaqc8hcmr4UeA84HRi1szplZmZWraHnqCYAI6tvm5R83+g3ZBKYmZnZ\nTtPQEdUB2ff2i4gVwME7p0tmZmafaGiiKpLUofpBMqJq6GjMzMxsmzU02VwLPCvpj2Tu0nAG8Mud\n1iszM7NEgy5Ph5q7ih9L5i4QT0fEnJ3ZsbTz5elmZo23LZenNzhR2ZacqMzMGm9nfo/KzMysIJyo\nzMws1ZyozMws1ZyozMws1ZyozMws1ZyozMws1ZyozMws1ZyozMws1ZyozMws1ZyozMws1ZyozMws\n1VKZqCRNkfRSsrwj6aWsbVdKmi/pDUknZMUHSZor6U1Jo7PivSU9L2mepHsltUzirZN25kt6TtJe\n9bVhZmZNL5WJKiKGRcQhEXEI8CDwvwCS9iPzEyP7AScBNyujCLgJOBHoD5wpad+kumuAayNiH2AV\ncG4SPxdYERH9gOuBiUkbX8zXxs5+zmZmll8qE1WOM4B7kvUhwJSI2BwRC4D5wIBkmR8RCyNiEzAl\nKQuZnyZ5MFmfDJyaVdfkZP2PSTmAU2ppw8zMCiDViUrSUcDSiHg7CXUHFmUVqUhiufHFQHdJnYCV\nEVGVHc+tKyIqgdXJLxfX1oaZmRVAwX5OXtJ0oGt2iMyvB4+NiEeT2JnAvTllcgX5E24k5XP3qf4R\nqdrqqi2+lbKyspr10tJSSktL8xUzM2u2ysvLKS8v3646CpaoIuL4urZLagGcBhySFV4M9Mx63ANY\nQia57JUbj4gPJbWXVJSMqqrLZ9e1JGmrOCJWSqqtja1kJyozM9ta7of48ePHN7qONE/9HQ+8ERHZ\nSWIqMCy5Yq8E6AvMBGYBfSX1ktQaGAY8kuwzAxiarI/Mik9NHpNsn1FPG2ZmVgAFG1E1wLfYctqP\niJgj6X5gDrAJuDD5PfhKSRcD08gk30kRMTfZbQwwRdIE4J/ApCQ+CbhT0nxgOZnkVlcbZmZWAPJ7\n8LaR5PxlZtZIkoiIRn3lJ81Tf2ZmZk5UZmaWbk5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaW\nak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5UZmaWak5U\n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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "#plotting\n",
- "plt.plot(range(len(loss_history)), loss_history, 'o', label='Logistic Regression Training phase')\n",
- "plt.ylabel('cost')\n",
- "plt.xlabel('epoch')\n",
- "plt.legend()\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/10. Multi-Modal Networks.ipynb b/10. Multi-Modal Networks.ipynb
new file mode 100644
index 0000000..1c2f7f0
--- /dev/null
+++ b/10. Multi-Modal Networks.ipynb
@@ -0,0 +1,423 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Keras Functional API"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Recall: All models (layers) are callables"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```python\n",
+ "from keras.layers import Input, Dense\n",
+ "from keras.models import Model\n",
+ "\n",
+ "# this returns a tensor\n",
+ "inputs = Input(shape=(784,))\n",
+ "\n",
+ "# a layer instance is callable on a tensor, and returns a tensor\n",
+ "x = Dense(64, activation='relu')(inputs)\n",
+ "x = Dense(64, activation='relu')(x)\n",
+ "predictions = Dense(10, activation='softmax')(x)\n",
+ "\n",
+ "# this creates a model that includes\n",
+ "# the Input layer and three Dense layers\n",
+ "model = Model(inputs=inputs, outputs=predictions)\n",
+ "model.compile(optimizer='rmsprop',\n",
+ " loss='categorical_crossentropy',\n",
+ " metrics=['accuracy'])\n",
+ "model.fit(data, labels) # starts training\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Multi-Input Networks"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Keras Merge Layer"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here's a good use case for the functional API: models with multiple inputs and outputs. \n",
+ "\n",
+ "The functional API makes it easy to manipulate a large number of intertwined datastreams.\n",
+ "\n",
+ "Let's consider the following model. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```python\n",
+ "from keras.layers import Dense, Input\n",
+ "from keras.models import Model\n",
+ "from keras.layers.merge import concatenate\n",
+ "\n",
+ "left_input = Input(shape=(784, ), name='left_input')\n",
+ "left_branch = Dense(32, input_dim=784, name='left_branch')(left_input)\n",
+ "\n",
+ "right_input = Input(shape=(784,), name='right_input')\n",
+ "right_branch = Dense(32, input_dim=784, name='right_branch')(right_input)\n",
+ "\n",
+ "x = concatenate([left_branch, right_branch])\n",
+ "predictions = Dense(10, activation='softmax', name='main_output')(x)\n",
+ "\n",
+ "model = Model(inputs=[left_input, right_input], outputs=predictions)\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Resulting Model will look like the following network:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Such a two-branch model can then be trained via e.g.:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```python\n",
+ "model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])\n",
+ "model.fit([input_data_1, input_data_2], targets) # we pass one data array per model input\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Try yourself"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Step 1: Get Data - MNIST"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# let's load MNIST data as we did in the exercise on MNIST with FC Nets"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load ../solutions/sol10.py"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Step 2: Create the Multi-Input Network"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "## try yourself\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "## `evaluate` the model on test data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Keras supports different Merge strategies:\n",
+ "\n",
+ "* `add`: element-wise sum\n",
+ "* `concatenate`: tensor concatenation. You can specify the concatenation axis via the argument concat_axis.\n",
+ "* `multiply`: element-wise multiplication\n",
+ "* `average`: tensor average\n",
+ "* `maximum`: element-wise maximum of the inputs.\n",
+ "* `dot`: dot product. You can specify which axes to reduce along via the argument dot_axes. You can also specify applying any normalisation. In that case, the output of the dot product is the cosine proximity between the two samples."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can also pass a function as the mode argument, allowing for arbitrary transformations:"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```python\n",
+ "merged = Merge([left_branch, right_branch], mode=lambda x: x[0] - x[1])\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Even more interesting\n",
+ "\n",
+ "Here's a good use case for the functional API: models with multiple inputs and outputs. \n",
+ "\n",
+ "The functional API makes it easy to manipulate a large number of intertwined datastreams.\n",
+ "\n",
+ "Let's consider the following model (from: [https://keras.io/getting-started/functional-api-guide/](https://keras.io/getting-started/functional-api-guide/) )"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Problem and Data\n",
+ "\n",
+ "We seek to predict how many retweets and likes a news headline will receive on Twitter. \n",
+ "\n",
+ "The main input to the model will be the headline itself, as a sequence of words, but to spice things up, our model will also have an auxiliary input, receiving extra data such as the time of day when the headline was posted, etc. \n",
+ "\n",
+ "The model will also be supervised via two loss functions. \n",
+ "\n",
+ "Using the main loss function earlier in a model is a good regularization mechanism for deep models.\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Using TensorFlow backend.\n"
+ ]
+ }
+ ],
+ "source": [
+ "from keras.layers import Input, Embedding, LSTM, Dense\n",
+ "from keras.models import Model\n",
+ "\n",
+ "# Headline input: meant to receive sequences of 100 integers, between 1 and 10000.\n",
+ "# Note that we can name any layer by passing it a \"name\" argument.\n",
+ "main_input = Input(shape=(100,), dtype='int32', name='main_input')\n",
+ "\n",
+ "# This embedding layer will encode the input sequence\n",
+ "# into a sequence of dense 512-dimensional vectors.\n",
+ "x = Embedding(output_dim=512, input_dim=10000, input_length=100)(main_input)\n",
+ "\n",
+ "# A LSTM will transform the vector sequence into a single vector,\n",
+ "# containing information about the entire sequence\n",
+ "lstm_out = LSTM(32)(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here we insert the auxiliary loss, allowing the LSTM and Embedding layer to be trained smoothly even though the main loss will be much higher in the model."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "auxiliary_output = Dense(1, activation='sigmoid', name='aux_output')(lstm_out)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "At this point, we feed into the model our auxiliary input data by concatenating it with the LSTM output:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.layers import concatenate\n",
+ "\n",
+ "auxiliary_input = Input(shape=(5,), name='aux_input')\n",
+ "x = concatenate([lstm_out, auxiliary_input])\n",
+ "\n",
+ "# We stack a deep densely-connected network on top\n",
+ "x = Dense(64, activation='relu')(x)\n",
+ "x = Dense(64, activation='relu')(x)\n",
+ "x = Dense(64, activation='relu')(x)\n",
+ "\n",
+ "# And finally we add the main logistic regression layer\n",
+ "main_output = Dense(1, activation='sigmoid', name='main_output')(x)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Model Definition"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "model = Model(inputs=[main_input, auxiliary_input], outputs=[main_output, auxiliary_output])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We compile the model and assign a weight of 0.2 to the auxiliary loss. \n",
+ "\n",
+ "To specify different **loss_weights or loss** for each different output, you can use a list or a dictionary. Here we pass a single loss as the loss argument, so the same loss will be used on all outputs."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Note: \n",
+ "Since our inputs and outputs are named (we passed them a \"name\" argument), \n",
+ "We can compile&fit the model via:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "model.compile(optimizer='rmsprop',\n",
+ " loss={'main_output': 'binary_crossentropy', 'aux_output': 'binary_crossentropy'},\n",
+ " loss_weights={'main_output': 1., 'aux_output': 0.2})"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```python\n",
+ "\n",
+ "# And trained it via:\n",
+ "model.fit({'main_input': headline_data, 'aux_input': additional_data},\n",
+ " {'main_output': labels, 'aux_output': labels},\n",
+ " epochs=50, batch_size=32)\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python [default]",
+ "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.5.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/2.2 CNN HandsOn - MNIST Dataset.ipynb b/2.0 - MNIST Dataset.ipynb
similarity index 80%
rename from 2.2 CNN HandsOn - MNIST Dataset.ipynb
rename to 2.0 - MNIST Dataset.ipynb
index 4c4fbc6..2772f62 100644
--- a/2.2 CNN HandsOn - MNIST Dataset.ipynb
+++ b/2.0 - MNIST Dataset.ipynb
@@ -3,21 +3,30 @@
{
"cell_type": "markdown",
"metadata": {
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "slide"
}
},
"source": [
- "# CNN HandsOn with Keras"
+ "# MNIST Dataset"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Also known as `digits` if you're familiar with `sklearn`:\n",
+ "\n",
+ "```python\n",
+ "\n",
+ "from sklearn.datasets import digits\n",
+ "\n",
+ "```"
]
},
{
"cell_type": "markdown",
"metadata": {
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -32,8 +41,6 @@
{
"cell_type": "markdown",
"metadata": {
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -54,8 +61,6 @@
{
"cell_type": "markdown",
"metadata": {
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -70,16 +75,21 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "subslide"
}
},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Using TensorFlow backend.\n"
+ ]
+ }
+ ],
"source": [
"import numpy as np\n",
"import keras\n",
@@ -88,12 +98,10 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {
"code_folding": [],
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "fragment"
}
@@ -107,8 +115,6 @@
{
"cell_type": "markdown",
"metadata": {
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "slide"
}
@@ -121,9 +127,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -137,9 +141,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -153,9 +155,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -169,9 +169,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -185,9 +183,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -201,9 +197,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -217,9 +211,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -233,9 +225,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -249,9 +239,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
+ "collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -265,8 +253,6 @@
{
"cell_type": "markdown",
"metadata": {
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "slide"
}
@@ -284,8 +270,6 @@
"execution_count": null,
"metadata": {
"collapsed": true,
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -302,8 +286,6 @@
"execution_count": null,
"metadata": {
"collapsed": true,
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -317,9 +299,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
+ "collapsed": true
},
"outputs": [],
"source": [
@@ -337,8 +317,6 @@
"execution_count": null,
"metadata": {
"collapsed": true,
- "deletable": true,
- "editable": true,
"slideshow": {
"slide_type": "subslide"
}
@@ -352,9 +330,7 @@
"cell_type": "code",
"execution_count": null,
"metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
+ "collapsed": true
},
"outputs": [],
"source": []
@@ -362,7 +338,7 @@
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3",
+ "display_name": "Python [default]",
"language": "python",
"name": "python3"
},
@@ -376,9 +352,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.5.2"
+ "version": "3.5.4"
}
},
"nbformat": 4,
- "nbformat_minor": 0
+ "nbformat_minor": 1
}
diff --git a/2.1 Convolutional Neural Networks.ipynb b/2.1 Convolutional Neural Networks.ipynb
deleted file mode 100644
index bc08ba0..0000000
--- a/2.1 Convolutional Neural Networks.ipynb
+++ /dev/null
@@ -1,1170 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Convolutional Neural Network"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "### References:\n",
- "\n",
- "Some of the images and the content I used came from this great couple of blog posts \\[1\\] [https://adeshpande3.github.io/adeshpande3.github.io/]() and \\[2\\] the terrific book, [\"Neural Networks and Deep Learning\"](http://neuralnetworksanddeeplearning.com/) by Michael Nielsen. (**Strongly recommend**) "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "A convolutional neural network (CNN, or ConvNet) is a type of **feed-forward** artificial neural network in which the connectivity pattern between its neurons is inspired by the organization of the animal visual cortex."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "The networks consist of multiple layers of small neuron collections which process portions of the input image, called **receptive fields**. \n",
- "\n",
- "The outputs of these collections are then tiled so that their input regions overlap, to obtain a _better representation_ of the original image; this is repeated for every such layer."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## How does it look like?"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "-"
- }
- },
- "source": [
- "\n",
- "\n",
- "> source: https://flickrcode.files.wordpress.com/2014/10/conv-net2.png"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# The Problem Space \n",
- "\n",
- "## Image Classification"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Image classification is the task of taking an input image and outputting a class (a cat, dog, etc) or a probability of classes that best describes the image. \n",
- "\n",
- "For humans, this task of recognition is one of the first skills we learn from the moment we are born and is one that comes naturally and effortlessly as adults."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "These skills of being able to quickly recognize patterns, *generalize* from prior knowledge, and adapt to different image environments are ones that we do not share with machines."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Inputs and Outputs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "\n",
- "\n",
- "source: [http://www.pawbuzz.com/wp-content/uploads/sites/551/2014/11/corgi-puppies-21.jpg]()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "When a computer sees an image (takes an image as input), it will see an array of pixel values. \n",
- "\n",
- "Depending on the resolution and size of the image, it will see a 32 x 32 x 3 array of numbers (The 3 refers to RGB values).\n",
- "\n",
- "let's say we have a color image in JPG form and its size is 480 x 480. The representative array will be 480 x 480 x 3. Each of these numbers is given a value from 0 to 255 which describes the pixel intensity at that point."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Goal"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "What we want the computer to do is to be able to differentiate between all the images it’s given and figure out the unique features that make a dog a dog or that make a cat a cat. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "When we look at a picture of a dog, we can classify it as such if the picture has identifiable features such as paws or 4 legs. \n",
- "\n",
- "In a similar way, the computer should be able to perform image classification by looking for *low level* features such as edges and curves, and then building up to more abstract concepts through a series of **convolutional layers**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Structure of a CNN"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "> A more detailed overview of what CNNs do would be that you take the image, pass it through a series of convolutional, nonlinear, pooling (downsampling), and fully connected layers, and get an output. As we said earlier, the output can be a single class or a probability of classes that best describes the image. \n",
- "\n",
- "source: [1]"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Convolutional Layer"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "The first layer in a CNN is always a **Convolutional Layer**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Convolutional filters\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "A Convolutional Filter much like a **kernel** in image recognition is a small matrix useful for blurring, sharpening, embossing, edge detection, and more. \n",
- "\n",
- "This is accomplished by means of convolution between a kernel and an image.\n",
- "\n",
- "#### The main difference _here_ is that the conv matrices are **learned**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "As the filter is sliding, or **convolving**, around the input image, it is multiplying the values in the filter with the original pixel values of the image
\n",
- "(a.k.a. computing **element wise multiplications**)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Now, we repeat this process for every location on the input volume. (Next step would be moving the filter to the right by 1 unit, then right again by 1, and so on)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "After sliding the filter over all the locations, we are left with an array of numbers usually called an **activation map** or **feature map**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## High Level Perspective\n",
- "\n",
- "Let’s talk about briefly what this convolution is actually doing from a high level. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Each of these filters can be thought of as **feature identifiers** (e.g. *straight edges, simple colors, curves*)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Visualisation of the Receptive Field"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "The value is much lower! This is because there wasn’t anything in the image section that responded to the curve detector filter. Remember, the output of this conv layer is an activation map. \n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Going Deeper Through the Network"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Now in a traditional **convolutional neural network** architecture, there are other layers that are interspersed between these conv layers.\n",
- "\n",
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## ReLU (Rectified Linear Units) Layer"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- " After each conv layer, it is convention to apply a *nonlinear layer* (or **activation layer**) immediately afterward.\n",
- "\n",
- "\n",
- "The purpose of this layer is to introduce nonlinearity to a system that basically has just been computing linear operations during the conv layers (just element wise multiplications and summations)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "In the past, nonlinear functions like tanh and sigmoid were used, but researchers found out that **ReLU layers** work far better because the network is able to train a lot faster (because of the computational efficiency) without making a significant difference to the accuracy."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "It also helps to alleviate the **vanishing gradient problem**, which is the issue where the lower layers of the network train very slowly because the gradient decreases exponentially through the layers"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "(**very briefly**)\n",
- "\n",
- "Vanishing gradient problem depends on the choice of the activation function. \n",
- "\n",
- "Many common activation functions (e.g `sigmoid` or `tanh`) *squash* their input into a very small output range in a very non-linear fashion. \n",
- "\n",
- "For example, sigmoid maps the real number line onto a \"small\" range of [0, 1]."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "As a result, there are large regions of the input space which are mapped to an extremely small range. \n",
- "\n",
- "In these regions of the input space, even a large change in the input will produce a small change in the output - hence the **gradient is small**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### ReLu\n",
- "\n",
- "The **ReLu** function is defined as $f(x) = \\max(0, x),$ [2]\n",
- "\n",
- "A smooth approximation to the rectifier is the *analytic function*: $f(x) = \\ln(1 + e^x)$\n",
- "\n",
- "which is called the **softplus** function.\n",
- "\n",
- "The derivative of softplus is $f'(x) = e^x / (e^x + 1) = 1 / (1 + e^{-x})$, i.e. the **logistic function**.\n",
- "\n",
- "[2] [http://www.cs.toronto.edu/~fritz/absps/reluICML.pdf]() by G. E. Hinton "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Pooling Layers"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- " After some ReLU layers, it is customary to apply a **pooling layer** (aka *downsampling layer*)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "In this category, there are also several layer options, with **maxpooling** being the most popular. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Example of a MaxPooling filter"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "Other options for pooling layers are average pooling and L2-norm pooling. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "The intuition behind this Pooling layer is that once we know that a specific feature is in the original input volume (there will be a high activation value), its exact location is not as important as its relative location to the other features. \n",
- "\n",
- "Therefore this layer drastically reduces the spatial dimension (the length and the width but not the depth) of the input volume.\n",
- "\n",
- "This serves two main purposes: reduce the amount of parameters; controlling overfitting. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "An intuitive explanation for the usefulness of pooling could be explained by an example: \n",
- "\n",
- "Lets assume that we have a filter that is used for detecting faces. The exact pixel location of the face is less relevant then the fact that there is a face \"somewhere at the top\""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Dropout Layer"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "The **dropout layers** have the very specific function to *drop out* a random set of activations in that layers by setting them to zero in the forward pass. Simple as that. \n",
- "\n",
- "It allows to avoid *overfitting* but has to be used **only** at training time and **not** at test time. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Fully Connected Layer"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "The last layer, however, is an important one, namely the **Fully Connected Layer**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Basically, a FC layer looks at what high level features most strongly correlate to a particular class and has particular weights so that when you compute the products between the weights and the previous layer, you get the correct probabilities for the different classes."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Going further: Convolution Arithmetic"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If you want to go further with Convolution and you want to fully understand how convolution works with all the details we omitted in this notebook, I strongly suggest to read this **terrific** paper: [A guide to convolution arithmetic for deep learning](https://arxiv.org/abs/1603.07285).\n",
- "\n",
- "This paper is also referenced (with animations) in the `theano` main documentation: [convnet tutorial](http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "---"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# CNN in Keras"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "**Keras** has an extensive support for Convolutional Layers:\n",
- "\n",
- "- 1D Convolutional Layers;\n",
- "- 2D Convolutional Layers;\n",
- "- 3D Convolutional Layers;\n",
- "- Depthwise Convolution;\n",
- "- Transpose Convolution;\n",
- "- ....\n",
- "\n",
- "The corresponding `keras` package is `keras.layers.convolutional`.\n",
- "\n",
- "Take a look at the [Convolutional Layers](https://keras.io/layers/convolutional/) documentation to know more about Conv Layers that are missing in this notebook."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Convolution1D\n",
- "\n",
- "```python\n",
- "from keras.layers.convolutional import Conv1D\n",
- "\n",
- "Conv1D(filters, kernel_size, strides=1, padding='valid', \n",
- " dilation_rate=1, activation=None, use_bias=True, \n",
- " kernel_initializer='glorot_uniform', bias_initializer='zeros', \n",
- " kernel_regularizer=None, bias_regularizer=None, \n",
- " activity_regularizer=None, kernel_constraint=None, \n",
- " bias_constraint=None)\n",
- "```\n",
- "\n",
- "#### Arguments:\n",
- "\n",
- "\n",
- "- filters: Integer, the dimensionality of the output space\n",
- " (i.e. the number output of filters in the convolution).
\n",
- "- kernel_size: An integer or tuple/list of a single integer,\n",
- " specifying the length of the 1D convolution window.
\n",
- "- strides: An integer or tuple/list of a single integer,\n",
- " specifying the stride length of the convolution.\n",
- " Specifying any stride value != 1 is incompatible with specifying\n",
- " any
dilation_rate
value != 1. \n",
- "- padding: One of
\"valid\"
, \"causal\"
or \"same\"
(case-insensitive).\n",
- " \"causal\"
results in causal (dilated) convolutions, e.g. output[t]\n",
- " does not depend on input[t+1:]. Useful when modeling temporal data\n",
- " where the model should not violate the temporal order.\n",
- " See WaveNet: A Generative Model for Raw Audio, section 2.1. \n",
- "- dilation_rate: an integer or tuple/list of a single integer, specifying\n",
- " the dilation rate to use for dilated convolution.\n",
- " Currently, specifying any
dilation_rate
value != 1 is\n",
- " incompatible with specifying any strides
value != 1. \n",
- "- activation: Activation function to use\n",
- " (see activations).\n",
- " If you don't specify anything, no activation is applied\n",
- " (ie. \"linear\" activation:
a(x) = x
). \n",
- "- use_bias: Boolean, whether the layer uses a bias vector.
\n",
- "- kernel_initializer: Initializer for the
kernel
weights matrix\n",
- " (see initializers). \n",
- "- bias_initializer: Initializer for the bias vector\n",
- " (see initializers).
\n",
- "- kernel_regularizer: Regularizer function applied to\n",
- " the
kernel
weights matrix\n",
- " (see regularizer). \n",
- "- bias_regularizer: Regularizer function applied to the bias vector\n",
- " (see regularizer).
\n",
- "- activity_regularizer: Regularizer function applied to\n",
- " the output of the layer (its \"activation\").\n",
- " (see regularizer).
\n",
- "- kernel_constraint: Constraint function applied to the kernel matrix\n",
- " (see constraints).
\n",
- "- bias_constraint: Constraint function applied to the bias vector\n",
- " (see constraints).
\n",
- "
"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- ">Convolution operator for filtering neighborhoods of **one-dimensional inputs**. When using this layer as the first layer in a model, either provide the keyword argument `input_dim` (int, e.g. 128 for sequences of 128-dimensional vectors), or `input_shape` (tuple of integers, e.g. (10, 128) for sequences of 10 vectors of 128-dimensional vectors)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Example\n",
- "\n",
- "```python\n",
- "\n",
- "# apply a convolution 1d of length 3 to a sequence with 10 timesteps,\n",
- "# with 64 output filters\n",
- "model = Sequential()\n",
- "model.add(Conv1D(64, 3, padding='same', input_shape=(10, 32)))\n",
- "# now model.output_shape == (None, 10, 64)\n",
- "\n",
- "# add a new conv1d on top\n",
- "model.add(Conv1D(32, 3, padding='same'))\n",
- "# now model.output_shape == (None, 10, 32)\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Convolution2D\n",
- "\n",
- "```python\n",
- "from keras.layers.convolutional import Conv2D\n",
- "\n",
- "Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', \n",
- " data_format=None, dilation_rate=(1, 1), activation=None, \n",
- " use_bias=True, kernel_initializer='glorot_uniform', \n",
- " bias_initializer='zeros', kernel_regularizer=None, \n",
- " bias_regularizer=None, activity_regularizer=None, \n",
- " kernel_constraint=None, bias_constraint=None)\n",
- "```\n",
- "\n",
- "#### Arguments:\n",
- "\n",
- "\n",
- "- filters: Integer, the dimensionality of the output space\n",
- " (i.e. the number output of filters in the convolution).
\n",
- "- kernel_size: An integer or tuple/list of 2 integers, specifying the\n",
- " width and height of the 2D convolution window.\n",
- " Can be a single integer to specify the same value for\n",
- " all spatial dimensions.
\n",
- "- strides: An integer or tuple/list of 2 integers,\n",
- " specifying the strides of the convolution along the width and height.\n",
- " Can be a single integer to specify the same value for\n",
- " all spatial dimensions.\n",
- " Specifying any stride value != 1 is incompatible with specifying\n",
- " any
dilation_rate
value != 1. \n",
- "- padding: one of
\"valid\"
or \"same\"
(case-insensitive). \n",
- "- data_format: A string,\n",
- " one of
channels_last
(default) or channels_first
.\n",
- " The ordering of the dimensions in the inputs.\n",
- " channels_last
corresponds to inputs with shape\n",
- " (batch, height, width, channels)
while channels_first
\n",
- " corresponds to inputs with shape\n",
- " (batch, channels, height, width)
.\n",
- " It defaults to the image_data_format
value found in your\n",
- " Keras config file at ~/.keras/keras.json
.\n",
- " If you never set it, then it will be \"channels_last\". \n",
- "- dilation_rate: an integer or tuple/list of 2 integers, specifying\n",
- " the dilation rate to use for dilated convolution.\n",
- " Can be a single integer to specify the same value for\n",
- " all spatial dimensions.\n",
- " Currently, specifying any
dilation_rate
value != 1 is\n",
- " incompatible with specifying any stride value != 1. \n",
- "- activation: Activation function to use\n",
- " (see activations).\n",
- " If you don't specify anything, no activation is applied\n",
- " (ie. \"linear\" activation:
a(x) = x
). \n",
- "- use_bias: Boolean, whether the layer uses a bias vector.
\n",
- "- kernel_initializer: Initializer for the
kernel
weights matrix\n",
- " (see initializers). \n",
- "- bias_initializer: Initializer for the bias vector\n",
- " (see initializers).
\n",
- "- kernel_regularizer: Regularizer function applied to\n",
- " the
kernel
weights matrix\n",
- " (see regularizer). \n",
- "- bias_regularizer: Regularizer function applied to the bias vector\n",
- " (see regularizer).
\n",
- "- activity_regularizer: Regularizer function applied to\n",
- " the output of the layer (its \"activation\").\n",
- " (see regularizer).
\n",
- "- kernel_constraint: Constraint function applied to the kernel matrix\n",
- " (see constraints).
\n",
- "- bias_constraint: Constraint function applied to the bias vector\n",
- " (see constraints).
\n",
- "
"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Example\n",
- "Assuming \n",
- "``keras.backend.image_data_format == \"channels_last\"``\n",
- "```python\n",
- "\n",
- "# apply a 3x3 convolution with 64 output filters on a 256x256 image:\n",
- "model = Sequential()\n",
- "model.add(Conv2D(64, (3, 3), padding='same', \n",
- " input_shape=(3, 256, 256)))\n",
- "# now model.output_shape == (None, 256, 256, 64)\n",
- "\n",
- "# add a 3x3 convolution on top, with 32 output filters:\n",
- "model.add(Conv2D(32, (3, 3), padding='same'))\n",
- "# now model.output_shape == (None, 256, 256, 32)\n",
- "\n",
- "```"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Dimensions of Conv filters in Keras"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "The complex structure of ConvNets *may* lead to a representation that is challenging to understand."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "source": [
- "Of course, the dimensions vary according to the dimension of the Convolutional filters (e.g. 1D, 2D)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Convolution1D\n",
- "\n",
- "**Input Shape**:\n",
- "\n",
- "**3D** tensor with shape: (`batch_size`, `steps`, `input_dim`).\n",
- "\n",
- "**Output Shape**:\n",
- "\n",
- "**3D** tensor with shape: (`batch_size`, `new_steps`, `filters`)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Convolution2D\n",
- "\n",
- "**Input Shape**:\n",
- "\n",
- "**4D** tensor with shape: \n",
- "\n",
- "- (`batch_size`, `channels`, `rows`, `cols`) if `image_data_format='channels_last'`\n",
- "- (`batch_size`, `rows`, `cols`, `channels`) if `image_data_format='channels_first'`\n",
- "\n",
- "**Output Shape**:\n",
- "\n",
- "**4D** tensor with shape:\n",
- "\n",
- "- (`batch_size`, `filters`, `new_rows`, `new_cols`) \n",
- "if `image_data_format='channels_first'`\n",
- "- (`batch_size`, `new_rows`, `new_cols`, `filters`) if `image_data_format='channels_last'`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2.1 Hidden Layer Representation and Embeddings.ipynb b/2.1 Hidden Layer Representation and Embeddings.ipynb
new file mode 100644
index 0000000..530790e
--- /dev/null
+++ b/2.1 Hidden Layer Representation and Embeddings.ipynb
@@ -0,0 +1,1528 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Fully Connected Feed-Forward Network\n",
+ "\n",
+ "In this notebook we will play with Feed-Forward FC-NN (Fully Connected Neural Network) for a *classification task*: \n",
+ "\n",
+ "Image Classification on MNIST Dataset\n",
+ "\n",
+ "**RECALL**\n",
+ "\n",
+ "In the FC-NN, the output of each layer is computed using the activations from the previous one, as follows:\n",
+ "\n",
+ "$$h_{i} = \\sigma(W_i h_{i-1} + b_i)$$\n",
+ "\n",
+ "where ${h}_i$ is the activation vector from the $i$-th layer (or the input data for $i=0$), ${W}_i$ and ${b}_i$ are the weight matrix and the bias vector for the $i$-th layer, respectively. \n",
+ "
\n",
+ "$\\sigma(\\cdot)$ is the activation function. In our example, we will use the *ReLU* activation function for the hidden layers and *softmax* for the last layer.\n",
+ "\n",
+ "To regularize the model, we will also insert a Dropout layer between consecutive hidden layers. \n",
+ "\n",
+ "Dropout works by “dropping out†some unit activations in a given layer, that is setting them to zero with a given probability.\n",
+ "\n",
+ "Our loss function will be the **categorical crossentropy**."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Model definition\n",
+ "Keras supports two different kind of models: the [Sequential](http://keras.io/models/#sequential) model and the [Graph](http://keras.io/models/#graph) model. The former is used to build linear stacks of layer (so each layer has one input and one output), and the latter supports any kind of connection graph.\n",
+ "\n",
+ "In our case we build a Sequential model with three [Dense](http://keras.io/layers/core/#dense) (aka fully connected) layers, with some [Dropout](http://keras.io/layers/core/#dropout). Notice that the output layer has the softmax activation function. \n",
+ "\n",
+ "The resulting model is actually a `function` of its own inputs implemented using the Keras backend. \n",
+ "\n",
+ "We apply the binary crossentropy loss and choose SGD as the optimizer. \n",
+ "\n",
+ "Please remind that Keras supports a variety of different [optimizers](http://keras.io/optimizers/) and [loss functions](http://keras.io/objectives/), which you may want to check out. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Introducing ReLU"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The **ReLU** function is defined as $f(x) = \\max(0, x),$ [1]\n",
+ "\n",
+ "A smooth approximation to the rectifier is the *analytic function*: $f(x) = \\ln(1 + e^x)$\n",
+ "\n",
+ "which is called the **softplus** function.\n",
+ "\n",
+ "The derivative of softplus is $f'(x) = e^x / (e^x + 1) = 1 / (1 + e^{-x})$, i.e. the **logistic function**.\n",
+ "\n",
+ "[1] [http://www.cs.toronto.edu/~fritz/absps/reluICML.pdf]() by G. E. Hinton "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Note: Keep in mind this function as it is heavily used in CNN"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.models import Sequential\n",
+ "from keras.layers.core import Dense\n",
+ "from keras.optimizers import SGD\n",
+ "\n",
+ "nb_classes = 10\n",
+ "\n",
+ "# FC@512+relu -> FC@512+relu -> FC@nb_classes+softmax\n",
+ "# ... your Code Here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol21.py"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.models import Sequential\n",
+ "from keras.layers.core import Dense\n",
+ "from keras.optimizers import SGD\n",
+ "\n",
+ "model = Sequential()\n",
+ "model.add(Dense(512, activation='relu', input_shape=(784,)))\n",
+ "model.add(Dense(512, activation='relu'))\n",
+ "model.add(Dense(10, activation='softmax'))\n",
+ "\n",
+ "model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.001), \n",
+ " metrics=['accuracy'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Data preparation (`keras.dataset`)\n",
+ "\n",
+ "We will train our model on the MNIST dataset, which consists of 60,000 28x28 grayscale images of the 10 digits, along with a test set of 10,000 images. \n",
+ "\n",
+ "![](imgs/mnist.png)\n",
+ "\n",
+ "Since this dataset is **provided** with Keras, we just ask the `keras.dataset` model for training and test data.\n",
+ "\n",
+ "We will:\n",
+ "\n",
+ "* download the data\n",
+ "* reshape data to be in vectorial form (original data are images)\n",
+ "* normalize between 0 and 1.\n",
+ "\n",
+ "The `binary_crossentropy` loss expects a **one-hot-vector** as input, therefore we apply the `to_categorical` function from `keras.utilis` to convert integer labels to **one-hot-vectors**."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.datasets import mnist\n",
+ "from keras.utils import np_utils\n",
+ "\n",
+ "(X_train, y_train), (X_test, y_test) = mnist.load_data()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(60000, 28, 28)"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "X_train = X_train.reshape(60000, 784)\n",
+ "X_test = X_test.reshape(10000, 784)\n",
+ "X_train = X_train.astype(\"float32\")\n",
+ "X_test = X_test.astype(\"float32\")\n",
+ "\n",
+ "# Put everything on grayscale\n",
+ "X_train /= 255\n",
+ "X_test /= 255\n",
+ "\n",
+ "# convert class vectors to binary class matrices\n",
+ "Y_train = np_utils.to_categorical(y_train, 10)\n",
+ "Y_test = np_utils.to_categorical(y_test, 10)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Split Training and Validation Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n",
+ "\n",
+ "X_train, X_val, Y_train, Y_val = train_test_split(X_train, Y_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(784,)"
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train[0].shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.imshow(X_train[0].reshape(28, 28))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0 1 2 3 4 5 6 7 8 9]\n",
+ "[0 0 0 0 0 1 0 0 0 0]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(np.asarray(range(10)))\n",
+ "print(Y_train[0].astype('int'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n/EBQhB8I6v8iFjUYtO9dHgAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "plt.imshow(X_val[0].reshape(28, 28))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0 1 2 3 4 5 6 7 8 9]\n",
+ "[0 0 0 0 1 0 0 0 0 0]\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(np.asarray(range(10)))\n",
+ "print(Y_val[0].astype('int'))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Training\n",
+ "Having defined and compiled the model, it can be trained using the `fit` function. We also specify a validation dataset to monitor validation loss and accuracy."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 45000 samples, validate on 15000 samples\n",
+ "Epoch 1/2\n",
+ "45000/45000 [==============================] - 1s - loss: 2.1743 - acc: 0.2946 - val_loss: 2.0402 - val_acc: 0.5123\n",
+ "Epoch 2/2\n",
+ "45000/45000 [==============================] - 1s - loss: 1.9111 - acc: 0.6254 - val_loss: 1.7829 - val_acc: 0.6876\n"
+ ]
+ }
+ ],
+ "source": [
+ "network_history = model.fit(X_train, Y_train, batch_size=128, \n",
+ " epochs=2, verbose=1, validation_data=(X_val, Y_val))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Plotting Network Performance Trend\n",
+ "The return value of the `fit` function is a `keras.callbacks.History` object which contains the entire history of training/validation loss and accuracy, for each epoch. We can therefore plot the behaviour of loss and accuracy during the training phase."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n/w/rMOoQeiTo9AAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\nrhgAAAAASUVORK5CYII=\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "\n",
+ "def plot_history(network_history):\n",
+ " plt.figure()\n",
+ " plt.xlabel('Epochs')\n",
+ " plt.ylabel('Loss')\n",
+ " plt.plot(network_history.history['loss'])\n",
+ " plt.plot(network_history.history['val_loss'])\n",
+ " plt.legend(['Training', 'Validation'])\n",
+ "\n",
+ " plt.figure()\n",
+ " plt.xlabel('Epochs')\n",
+ " plt.ylabel('Accuracy')\n",
+ " plt.plot(network_history.history['acc'])\n",
+ " plt.plot(network_history.history['val_acc'])\n",
+ " plt.legend(['Training', 'Validation'], loc='lower right')\n",
+ " plt.show()\n",
+ "\n",
+ "plot_history(network_history)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "After `2` epochs, we get a `~88%` validation accuracy. \n",
+ "\n",
+ "* If you increase the number of epochs, you will get definitely better results."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Quick Exercise: \n",
+ "\n",
+ "Try increasing the number of epochs (if you're hardware allows to)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 45000 samples, validate on 15000 samples\n",
+ "Epoch 1/2\n",
+ "45000/45000 [==============================] - 2s - loss: 0.8966 - acc: 0.8258 - val_loss: 0.8463 - val_acc: 0.8299\n",
+ "Epoch 2/2\n",
+ "45000/45000 [==============================] - 1s - loss: 0.8005 - acc: 0.8370 - val_loss: 0.7634 - val_acc: 0.8382\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Your code here\n",
+ "model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.001), \n",
+ " metrics=['accuracy'])\n",
+ "network_history = model.fit(X_train, Y_train, batch_size=128, \n",
+ " epochs=2, verbose=1, validation_data=(X_val, Y_val))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Introducing the Dropout Layer"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The **dropout layers** have the very specific function to *drop out* a random set of activations in that layers by setting them to zero in the forward pass. Simple as that. \n",
+ "\n",
+ "It allows to avoid *overfitting* but has to be used **only** at training time and **not** at test time. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```python\n",
+ "\n",
+ "keras.layers.core.Dropout(rate, noise_shape=None, seed=None)\n",
+ "```\n",
+ "\n",
+ "Applies Dropout to the input.\n",
+ "\n",
+ "Dropout consists in randomly setting a fraction rate of input units to 0 at each update during training time, which helps prevent overfitting.\n",
+ "\n",
+ "Arguments\n",
+ "\n",
+ "* rate: float between 0 and 1. Fraction of the input units to drop.\n",
+ "* noise_shape: 1D integer tensor representing the shape of the binary dropout mask that will be multiplied with the input. For instance, if your inputs have shape (batch_size, timesteps, features) and you want the dropout mask to be the same for all timesteps, you can use noise_shape=(batch_size, 1, features).\n",
+ "* seed: A Python integer to use as random seed."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Note** Keras guarantess automatically that this layer is **not** used in **Inference** (i.e. Prediction) phase\n",
+ "(thus only used in **training** as it should be!)\n",
+ "\n",
+ "See `keras.backend.in_train_phase` function"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.layers.core import Dropout\n",
+ "\n",
+ "## Pls note **where** the `K.in_train_phase` is actually called!!\n",
+ "Dropout??"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras import backend as K\n",
+ "\n",
+ "K.in_train_phase?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Exercise:\n",
+ "\n",
+ "Try modifying the previous example network adding a Dropout layer:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.layers.core import Dropout\n",
+ "\n",
+ "# FC@512+relu -> DropOut(0.2) -> FC@512+relu -> DropOut(0.2) -> FC@nb_classes+softmax\n",
+ "# ... your Code Here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol22.py"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol22.py\n",
+ "from keras.models import Sequential\n",
+ "from keras.layers.core import Dense, Dropout\n",
+ "from keras.optimizers import SGD\n",
+ "\n",
+ "model = Sequential()\n",
+ "model.add(Dense(512, activation='relu', input_shape=(784,)))\n",
+ "model.add(Dropout(0.2))\n",
+ "model.add(Dense(512, activation='relu'))\n",
+ "model.add(Dropout(0.2))\n",
+ "model.add(Dense(10, activation='softmax'))\n",
+ "\n",
+ "model.compile(loss='categorical_crossentropy', optimizer=SGD(), \n",
+ " metrics=['accuracy'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 45000 samples, validate on 15000 samples\n",
+ "Epoch 1/4\n",
+ "45000/45000 [==============================] - 2s - loss: 1.3746 - acc: 0.6348 - val_loss: 0.6917 - val_acc: 0.8418\n",
+ "Epoch 2/4\n",
+ "45000/45000 [==============================] - 2s - loss: 0.6235 - acc: 0.8268 - val_loss: 0.4541 - val_acc: 0.8795\n",
+ "Epoch 3/4\n",
+ "45000/45000 [==============================] - 1s - loss: 0.4827 - acc: 0.8607 - val_loss: 0.3795 - val_acc: 0.8974\n",
+ "Epoch 4/4\n",
+ "45000/45000 [==============================] - 1s - loss: 0.4218 - acc: 0.8781 - val_loss: 0.3402 - val_acc: 0.9055\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEKCAYAAAD9xUlFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VdW9//H3N3PIPDEPASJDmAIERHCAaq3aOqAocLWt\ntpaftlqpnehw63Bra++1ilNrrVdtb1txxGoVO2nrAMggYUYJk4Y5gYQhhEzr98c+OQZISCA52TnJ\n5/U85+EM+5zz3dmaT9Zee61lzjlEREQAIvwuQERE2g+FgoiIBCkUREQkSKEgIiJBCgUREQlSKIiI\nSJBCQUREghQKIiISpFAQEZGgKL8LOFWZmZkuOzvb7zJERMLK8uXLi51zWU1tF3ahkJ2dzbJly/wu\nQ0QkrJjZtuZsF7LTR2b2pJntMbM1TWw3zsyqzWxaqGoREZHmCWWfwtPARSfbwMwigV8AfwthHSIi\n0kwhCwXn3NvAviY2uxV4EdgTqjpERKT5fOtTMLNewFRgCjCuiW1nAbMA+vbtG/riRKRNVFVVUVRU\nREVFhd+ldBhxcXH07t2b6Ojo03q/nx3Nc4HvO+dqzeykGzrnHgceB8jPz9cCECIdRFFREUlJSWRn\nZ9PU7wFpmnOOkpISioqK6N+//2l9hp+hkA/MC/yHkAlcYmbVzrmXfaxJRNpQRUWFAqEVmRkZGRns\n3bv3tD/Dt1BwzgVjzMyeBv6iQBDpfBQIraulP89QXpL6DLAIGGxmRWb2VTO7ycxuCtV3nsyusgru\nenUtVTW1fny9iEhYCFlLwTk38xS2vT5UddQp+GQ/T723lYSYKL7zucGh/joRCQMlJSWcf/75AOza\ntYvIyEiysrxBv0uWLCEmJqbJz7jhhhuYM2cOgwc3/nvl0UcfJTU1lWuvvbZ1Cg+hsBvRfLouGt6D\nq8f25lf/KuS8wVmMy073uyQR8VlGRgYFBQUA3HnnnSQmJvKd73znmG2cczjniIho+MTKU0891eT3\nfOMb32h5sW2kU02Id8dlw+iT3oXZ8wo4UFHldzki0k4VFhaSm5vLtddey7Bhw9i5cyezZs0iPz+f\nYcOGcffddwe3PfvssykoKKC6uprU1FTmzJnDqFGjOOuss9izxxuC9eMf/5i5c+cGt58zZw7jx49n\n8ODBLFy4EIDDhw9z1VVXkZuby7Rp08jPzw8GVlvqNC0FgMTYKB6YnsfVjy3ijj+v5YHpeX6XJCIB\nd726lnU7DrTqZ+b2TOaOS4ed1ns3bNjA73//e/Lz8wG49957SU9Pp7q6milTpjBt2jRyc3OPeU9Z\nWRnnnXce9957L7fffjtPPvkkc+bMOeGznXMsWbKEV155hbvvvps33niDhx9+mO7du/Piiy+ycuVK\nxowZc1p1t1SnaikAjOmbxq2fyWH+iu28snKH3+WISDs1cODAYCAAPPPMM4wZM4YxY8awfv161q1b\nd8J74uPjufjiiwEYO3YsW7dubfCzr7zyyhO2effdd5kxYwYAo0aNYtiw0wuzlupULYU6t0zJ4e2P\n9vKj+asZ2y+NXqnxfpck0umd7l/0oZKQkBC8v3HjRh588EGWLFlCamoq1113XYOjsOt3TEdGRlJd\nXd3gZ8fGxja5jV86XUsBICoygrnTR1Nb67j92QJqajVIWkQad+DAAZKSkkhOTmbnzp389a9/bfXv\nmDRpEs899xwAq1evbrAl0hY6ZSgA9M3owp2XDeP9Lft4/O3NfpcjIu3YmDFjyM3NZciQIXzpS19i\n0qRJrf4dt956K9u3byc3N5e77rqL3NxcUlJSWv17mmLOhddfyfn5+a61FtlxzvGNP33A39ftZv7X\nJzG8V9sfAJHObP369QwdOtTvMtqF6upqqquriYuLY+PGjVx44YVs3LiRqKhTP8vf0M/VzJY75/Ib\neUtQp+xTqGNm/GzqCD7YVso3563gtVvPIT4m0u+yRKQTOnToEOeffz7V1dU45/jNb35zWoHQUp06\nFABSu8Twy2tGce0T73PP6+v46RUj/C5JRDqh1NRUli9f7ncZnbdPob5JOZl87Zz+/GHxx/xz/W6/\nyxER8Y1CIeA7nxvM0B7JfO+FVew9eNTvckREfKFQCIiNiuTBGXkcOlrN915YSbh1wIuItAaFQj2D\nuiXxg4uH8NaHe/nD4m1+lyMi0uYUCsf58sRszhuUxU9fW0/hnoN+lyMiITRlypQTBqLNnTuXm2++\nudH3JCYmArBjxw6mTZvW4DaTJ0+mqUvn586dS3l5efDxJZdcQmlpaXNLDxmFwnHMjP+5eiQJsVHc\nNq+AymotyiPSUc2cOZN58+Yd89y8efOYObPp5WB69uzJCy+8cNrffXwovP7666Smpp7257UWhUID\nuibFce+VI1i74wC//PuHfpcjIiEybdo0XnvtNSorKwHYunUrO3bsYPTo0Zx//vmMGTOGESNG8Oc/\n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\nRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "network_history = model.fit(X_train, Y_train, batch_size=128, \n",
+ " epochs=4, verbose=1, validation_data=(X_val, Y_val))\n",
+ "plot_history(network_history)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "* If you continue training, at some point the validation loss will start to increase: that is when the model starts to **overfit**. \n",
+ "\n",
+ "It is always necessary to monitor training and validation loss during the training of any kind of Neural Network, either to detect overfitting or to evaluate the behaviour of the model **(any clue on how to do it??)**"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol23.py\n",
+ "from keras.callbacks import EarlyStopping\n",
+ "\n",
+ "early_stop = EarlyStopping(monitor='val_loss', patience=4, verbose=1)\n",
+ "\n",
+ "model = Sequential()\n",
+ "model.add(Dense(512, activation='relu', input_shape=(784,)))\n",
+ "model.add(Dropout(0.2))\n",
+ "model.add(Dense(512, activation='relu'))\n",
+ "model.add(Dropout(0.2))\n",
+ "model.add(Dense(10, activation='softmax'))\n",
+ "\n",
+ "model.compile(loss='categorical_crossentropy', optimizer=SGD(), \n",
+ " metrics=['accuracy'])\n",
+ " \n",
+ "model.fit(X_train, Y_train, validation_data = (X_test, Y_test), epochs=100, \n",
+ " batch_size=128, verbose=True, callbacks=[early_stop]) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Inspecting Layers"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "_________________________________________________________________\n",
+ "Layer (type) Output Shape Param # \n",
+ "=================================================================\n",
+ "dense_4 (Dense) (None, 512) 401920 \n",
+ "_________________________________________________________________\n",
+ "dropout_1 (Dropout) (None, 512) 0 \n",
+ "_________________________________________________________________\n",
+ "dense_5 (Dense) (None, 512) 262656 \n",
+ "_________________________________________________________________\n",
+ "dropout_2 (Dropout) (None, 512) 0 \n",
+ "_________________________________________________________________\n",
+ "dense_6 (Dense) (None, 10) 5130 \n",
+ "=================================================================\n",
+ "Total params: 669,706\n",
+ "Trainable params: 669,706\n",
+ "Non-trainable params: 0\n",
+ "_________________________________________________________________\n"
+ ]
+ }
+ ],
+ "source": [
+ "# We already used `summary`\n",
+ "model.summary()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### `model.layers` is iterable"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Model Input Tensors: Tensor(\"dense_4_input:0\", shape=(?, 784), dtype=float32)\n",
+ "\n",
+ "Layers - Network Configuration:\n",
+ "\n",
+ "dense_4 True\n",
+ "Layer Configuration:\n",
+ "{'batch_input_shape': (None, 784), 'name': 'dense_4', 'units': 512, 'bias_regularizer': None, 'bias_initializer': {'config': {}, 'class_name': 'Zeros'}, 'trainable': True, 'activation': 'relu', 'use_bias': True, 'bias_constraint': None, 'activity_regularizer': None, 'kernel_regularizer': None, 'kernel_constraint': None, 'kernel_initializer': {'config': {'seed': None, 'mode': 'fan_avg', 'scale': 1.0, 'distribution': 'uniform'}, 'class_name': 'VarianceScaling'}, 'dtype': 'float32'}\n",
+ "----------------------------------------\n",
+ "dropout_1 True\n",
+ "Layer Configuration:\n",
+ "{'name': 'dropout_1', 'rate': 0.2, 'trainable': True}\n",
+ "----------------------------------------\n",
+ "dense_5 True\n",
+ "Layer Configuration:\n",
+ "{'kernel_regularizer': None, 'units': 512, 'bias_regularizer': None, 'bias_initializer': {'config': {}, 'class_name': 'Zeros'}, 'trainable': True, 'activation': 'relu', 'bias_constraint': None, 'activity_regularizer': None, 'name': 'dense_5', 'kernel_constraint': None, 'kernel_initializer': {'config': {'seed': None, 'mode': 'fan_avg', 'scale': 1.0, 'distribution': 'uniform'}, 'class_name': 'VarianceScaling'}, 'use_bias': True}\n",
+ "----------------------------------------\n",
+ "dropout_2 True\n",
+ "Layer Configuration:\n",
+ "{'name': 'dropout_2', 'rate': 0.2, 'trainable': True}\n",
+ "----------------------------------------\n",
+ "dense_6 True\n",
+ "Layer Configuration:\n",
+ "{'kernel_regularizer': None, 'units': 10, 'bias_regularizer': None, 'bias_initializer': {'config': {}, 'class_name': 'Zeros'}, 'trainable': True, 'activation': 'softmax', 'bias_constraint': None, 'activity_regularizer': None, 'name': 'dense_6', 'kernel_constraint': None, 'kernel_initializer': {'config': {'seed': None, 'mode': 'fan_avg', 'scale': 1.0, 'distribution': 'uniform'}, 'class_name': 'VarianceScaling'}, 'use_bias': True}\n",
+ "----------------------------------------\n",
+ "Model Output Tensors: Tensor(\"dense_6/Softmax:0\", shape=(?, 10), dtype=float32)\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Model Input Tensors: ', model.input, end='\\n\\n')\n",
+ "print('Layers - Network Configuration:', end='\\n\\n')\n",
+ "for layer in model.layers:\n",
+ " print(layer.name, layer.trainable)\n",
+ " print('Layer Configuration:')\n",
+ " print(layer.get_config(), end='\\n{}\\n'.format('----'*10))\n",
+ "print('Model Output Tensors: ', model.output)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Extract hidden layer representation of the given data"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "One **simple** way to do it is to use the weights of your model to build a new model that's truncated at the layer you want to read. \n",
+ "\n",
+ "Then you can run the `._predict(X_batch)` method to get the activations for a batch of inputs."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "model_truncated = Sequential()\n",
+ "model_truncated.add(Dense(512, activation='relu', input_shape=(784,)))\n",
+ "model_truncated.add(Dropout(0.2))\n",
+ "model_truncated.add(Dense(512, activation='relu'))\n",
+ "\n",
+ "for i, layer in enumerate(model_truncated.layers):\n",
+ " layer.set_weights(model.layers[i].get_weights())\n",
+ "\n",
+ "model_truncated.compile(loss='categorical_crossentropy', optimizer=SGD(), \n",
+ " metrics=['accuracy'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check\n",
+ "np.all(model_truncated.layers[0].get_weights()[0] == model.layers[0].get_weights()[0])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "hidden_features = model_truncated.predict(X_train)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(45000, 512)"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "hidden_features.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(45000, 784)"
+ ]
+ },
+ "execution_count": 21,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_train.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Hint: Alternative Method to get activations \n",
+ "\n",
+ "(Using `keras.backend` `function` on Tensors)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true
+ },
+ "source": [
+ "```python\n",
+ "def get_activations(model, layer, X_batch):\n",
+ " activations_f = K.function([model.layers[0].input, K.learning_phase()], [layer.output,])\n",
+ " activations = activations_f((X_batch, False))\n",
+ " return activations\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Generate the Embedding of Hidden Features"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.manifold import TSNE\n",
+ "\n",
+ "tsne = TSNE(n_components=2)\n",
+ "X_tsne = tsne.fit_transform(hidden_features[:1000]) ## Reduced for computational issues"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "colors_map = np.argmax(Y_train, axis=1)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(1000, 2)"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "X_tsne.shape"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "nb_classes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(array([ 1, 30, 62, 73, 86, 88, 89, 109, 112, 114, 123, 132, 134,\n",
+ " 137, 150, 165, 173, 175, 179, 215, 216, 217, 224, 235, 242, 248,\n",
+ " 250, 256, 282, 302, 303, 304, 332, 343, 352, 369, 386, 396, 397,\n",
+ " 434, 444, 456, 481, 493, 495, 496, 522, 524, 527, 544, 558, 571,\n",
+ " 595, 618, 625, 634, 646, 652, 657, 666, 672, 673, 676, 714, 720,\n",
+ " 727, 732, 737, 796, 812, 813, 824, 828, 837, 842, 848, 851, 854,\n",
+ " 867, 869, 886, 894, 903, 931, 934, 941, 950, 956, 970, 972, 974, 988]),)"
+ ]
+ },
+ "execution_count": 53,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.where(colors_map==6)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\nEJIw/z9ICX4F7LJYpgAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "colors = np.array([x for x in 'b-g-r-c-m-y-k-purple-coral-lime'.split('-')])\n",
+ "colors_map = colors_map[:1000]\n",
+ "plt.figure(figsize=(10,10))\n",
+ "for cl in range(nb_classes):\n",
+ " indices = np.where(colors_map==cl)\n",
+ " plt.scatter(X_tsne[indices,0], X_tsne[indices, 1], c=colors[cl], label=cl)\n",
+ "plt.legend()\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Using Bokeh (Interactive Chart)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ " \n",
+ "
\n",
+ "
Loading BokehJS ...\n",
+ "
"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/javascript": [
+ "\n",
+ "(function(global) {\n",
+ " function now() {\n",
+ " return new Date();\n",
+ " }\n",
+ "\n",
+ " var force = true;\n",
+ "\n",
+ " if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n",
+ " window._bokeh_onload_callbacks = [];\n",
+ " window._bokeh_is_loading = undefined;\n",
+ " }\n",
+ "\n",
+ "\n",
+ " \n",
+ " if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n",
+ " window._bokeh_timeout = Date.now() + 5000;\n",
+ " window._bokeh_failed_load = false;\n",
+ " }\n",
+ "\n",
+ " var NB_LOAD_WARNING = {'data': {'text/html':\n",
+ " \"\\n\"+\n",
+ " \"
\\n\"+\n",
+ " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
+ " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
+ " \"
\\n\"+\n",
+ " \"
\\n\"+\n",
+ " \"- re-rerun `output_notebook()` to attempt to load from CDN again, or
\\n\"+\n",
+ " \"- use INLINE resources instead, as so:
\\n\"+\n",
+ " \"
\\n\"+\n",
+ " \"
\\n\"+\n",
+ " \"from bokeh.resources import INLINE\\n\"+\n",
+ " \"output_notebook(resources=INLINE)\\n\"+\n",
+ " \"
\\n\"+\n",
+ " \"
\"}};\n",
+ "\n",
+ " function display_loaded() {\n",
+ " if (window.Bokeh !== undefined) {\n",
+ " var el = document.getElementById(\"0af86eff-6a55-4644-ab84-9a6f5fcbeb3e\");\n",
+ " el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n",
+ " } else if (Date.now() < window._bokeh_timeout) {\n",
+ " setTimeout(display_loaded, 100)\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " function run_callbacks() {\n",
+ " window._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n",
+ " delete window._bokeh_onload_callbacks\n",
+ " console.info(\"Bokeh: all callbacks have finished\");\n",
+ " }\n",
+ "\n",
+ " function load_libs(js_urls, callback) {\n",
+ " window._bokeh_onload_callbacks.push(callback);\n",
+ " if (window._bokeh_is_loading > 0) {\n",
+ " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
+ " return null;\n",
+ " }\n",
+ " if (js_urls == null || js_urls.length === 0) {\n",
+ " run_callbacks();\n",
+ " return null;\n",
+ " }\n",
+ " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
+ " window._bokeh_is_loading = js_urls.length;\n",
+ " for (var i = 0; i < js_urls.length; i++) {\n",
+ " var url = js_urls[i];\n",
+ " var s = document.createElement('script');\n",
+ " s.src = url;\n",
+ " s.async = false;\n",
+ " s.onreadystatechange = s.onload = function() {\n",
+ " window._bokeh_is_loading--;\n",
+ " if (window._bokeh_is_loading === 0) {\n",
+ " console.log(\"Bokeh: all BokehJS libraries loaded\");\n",
+ " run_callbacks()\n",
+ " }\n",
+ " };\n",
+ " s.onerror = function() {\n",
+ " console.warn(\"failed to load library \" + url);\n",
+ " };\n",
+ " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
+ " document.getElementsByTagName(\"head\")[0].appendChild(s);\n",
+ " }\n",
+ " };var element = document.getElementById(\"0af86eff-6a55-4644-ab84-9a6f5fcbeb3e\");\n",
+ " if (element == null) {\n",
+ " console.log(\"Bokeh: ERROR: autoload.js configured with elementid '0af86eff-6a55-4644-ab84-9a6f5fcbeb3e' but no matching script tag was found. \")\n",
+ " return false;\n",
+ " }\n",
+ "\n",
+ " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.5.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.5.min.js\"];\n",
+ "\n",
+ " var inline_js = [\n",
+ " function(Bokeh) {\n",
+ " Bokeh.set_log_level(\"info\");\n",
+ " },\n",
+ " \n",
+ " function(Bokeh) {\n",
+ " \n",
+ " },\n",
+ " \n",
+ " function(Bokeh) {\n",
+ " \n",
+ " document.getElementById(\"0af86eff-6a55-4644-ab84-9a6f5fcbeb3e\").textContent = \"BokehJS is loading...\";\n",
+ " },\n",
+ " function(Bokeh) {\n",
+ " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.5.min.css\");\n",
+ " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.5.min.css\");\n",
+ " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.5.min.css\");\n",
+ " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.5.min.css\");\n",
+ " }\n",
+ " ];\n",
+ "\n",
+ " function run_inline_js() {\n",
+ " \n",
+ " if ((window.Bokeh !== undefined) || (force === true)) {\n",
+ " for (var i = 0; i < inline_js.length; i++) {\n",
+ " inline_js[i](window.Bokeh);\n",
+ " }if (force === true) {\n",
+ " display_loaded();\n",
+ " }} else if (Date.now() < window._bokeh_timeout) {\n",
+ " setTimeout(run_inline_js, 100);\n",
+ " } else if (!window._bokeh_failed_load) {\n",
+ " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
+ " window._bokeh_failed_load = true;\n",
+ " } else if (force !== true) {\n",
+ " var cell = $(document.getElementById(\"0af86eff-6a55-4644-ab84-9a6f5fcbeb3e\")).parents('.cell').data().cell;\n",
+ " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
+ " }\n",
+ "\n",
+ " }\n",
+ "\n",
+ " if (window._bokeh_is_loading === 0) {\n",
+ " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
+ " run_inline_js();\n",
+ " } else {\n",
+ " load_libs(js_urls, function() {\n",
+ " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n",
+ " run_inline_js();\n",
+ " });\n",
+ " }\n",
+ "}(this));"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "from bokeh.plotting import figure, output_notebook, show\n",
+ "\n",
+ "output_notebook()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ " \n",
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "p = figure(plot_width=600, plot_height=600)\n",
+ "\n",
+ "colors = [x for x in 'blue-green-red-cyan-magenta-yellow-black-purple-coral-lime'.split('-')]\n",
+ "colors_map = colors_map[:1000]\n",
+ "for cl in range(nb_classes):\n",
+ " indices = np.where(colors_map==cl)\n",
+ " p.circle(X_tsne[indices, 0].ravel(), X_tsne[indices, 1].ravel(), size=7, \n",
+ " color=colors[cl], alpha=0.4, legend=str(cl))\n",
+ "\n",
+ "# show the results\n",
+ "p.legend.location = 'bottom_right'\n",
+ "show(p)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Note: We used `default` TSNE parameters. Better results can be achieved by tuning TSNE Hyper-parameters"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercise 1: \n",
+ "\n",
+ "### Try with a different algorithm to create the manifold"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Multi Dimensional Scaling** (aka [MDS](http://scikit-learn.org/stable/auto_examples/manifold/plot_mds.html)):\n",
+ "\n",
+ "For a comparison of different Manifold Learning algorithms, see the [manifold module page](http://scikit-learn.org/stable/auto_examples/manifold/plot_compare_methods.html) on the Scikit-learn Documentation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.manifold import MDS"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "## Your code here"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exercise 2: \n",
+ "\n",
+ "### Try extracting the Hidden features of the First and the Last layer of the model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "## Your code here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "## Try using the `get_activations` function relying on keras backend\n",
+ "def get_activations(model, layer, X_batch):\n",
+ " activations_f = K.function([model.layers[0].input, K.learning_phase()], [layer.output,])\n",
+ " activations = activations_f((X_batch, False))\n",
+ " return activations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python [default]",
+ "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.5.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/2.2.1 CNN HandsOn - MNIST & FC Nets.ipynb b/2.2.1 CNN HandsOn - MNIST & FC Nets.ipynb
deleted file mode 100644
index feb5bc0..0000000
--- a/2.2.1 CNN HandsOn - MNIST & FC Nets.ipynb
+++ /dev/null
@@ -1,254 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "# Fully Connected Feed-Forward Network\n",
- "\n",
- "In this notebook we will play with Feed-Forward FC-NN (Fully Connected Neural Network) for a *classification task*: Image Classification on MNIST Dataset\n",
- "\n",
- "**RECALL**\n",
- "\n",
- "In the FC-NN, the output of each layer is computed using the activations from the previous one, as follows:\n",
- "\n",
- "$$h_{i} = \\sigma(W_i h_{i-1} + b_i)$$\n",
- "\n",
- "where ${h}_i$ is the activation vector from the $i$-th layer (or the input data for $i=0$), ${W}_i$ and ${b}_i$ are the weight matrix and the bias vector for the $i$-th layer, respectively. \n",
- "
\n",
- "$\\sigma(\\cdot)$ is the activation function. In our example, we will use the *ReLU* activation function for the hidden layers and *softmax* for the last layer.\n",
- "\n",
- "To regularize the model, we will also insert a Dropout layer between consecutive hidden layers. \n",
- "\n",
- "Dropout works by “dropping out†some unit activations in a given layer, that is setting them to zero with a given probability.\n",
- "\n",
- "Our loss function will be the **categorical crossentropy**."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Model definition\n",
- "Keras supports two different kind of models: the [Sequential](http://keras.io/models/#sequential) model and the [Graph](http://keras.io/models/#graph) model. The former is used to build linear stacks of layer (so each layer has one input and one output), and the latter supports any kind of connection graph.\n",
- "\n",
- "In our case we build a Sequential model with three [Dense](http://keras.io/layers/core/#dense) (aka fully connected) layers, with some [Dropout](http://keras.io/layers/core/#dropout). Notice that the output layer has the softmax activation function. \n",
- "\n",
- "The resulting model is actually a `function` of its own inputs implemented using the Keras backend. \n",
- "\n",
- "We apply the binary crossentropy loss and choose SGD as the optimizer. \n",
- "\n",
- "Please remind that Keras supports a variety of different [optimizers](http://keras.io/optimizers/) and [loss functions](http://keras.io/objectives/), which you may want to check out. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ]
- }
- ],
- "source": [
- "from keras.models import Sequential\n",
- "from keras.layers.core import Dense, Dropout\n",
- "from keras.optimizers import SGD\n",
- "\n",
- "nb_classes = 10\n",
- "\n",
- "# FC@512+relu -> DropOut(0.2) -> FC@512+relu -> DropOut(0.2) -> FC@nb_classes+softmax\n",
- "# ... your Code Here"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# Decomment and Execute this cell to get the solution\n",
- "# %load solutions/sol_221_1.py"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Data preparation (`keras.dataset`)\n",
- "\n",
- "We will train our model on the MNIST dataset, which consists of 60,000 28x28 grayscale images of the 10 digits, along with a test set of 10,000 images. \n",
- "\n",
- "![](imgs/mnist.png)\n",
- "\n",
- "Since this dataset is **provided** with Keras, we just ask the `keras.dataset` model for training and test data.\n",
- "\n",
- "We will:\n",
- "\n",
- "* download the data\n",
- "* reshape data to be in vectorial form (original data are images)\n",
- "* normalize between 0 and 1.\n",
- "\n",
- "The `binary_crossentropy` loss expects a **one-hot-vector** as input, therefore we apply the `to_categorical` function from `keras.utilis` to convert integer labels to **one-hot-vectors**."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "from keras.datasets import mnist\n",
- "from keras.utils import np_utils\n",
- "\n",
- "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
- "X_train = X_train.reshape(60000, 784)\n",
- "X_test = X_test.reshape(10000, 784)\n",
- "X_train = X_train.astype(\"float32\")\n",
- "X_test = X_test.astype(\"float32\")\n",
- "X_train /= 255\n",
- "X_test /= 255\n",
- "\n",
- "# convert class vectors to binary class matrices\n",
- "Y_train = np_utils.to_categorical(y_train, 10)\n",
- "Y_test = np_utils.to_categorical(y_test, 10)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "## Training\n",
- "Having defined and compiled the model, it can be trained using the `fit` function. We also specify a validation dataset to monitor validation loss and accuracy."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "network_history = model.fit(X_train, Y_train, batch_size=128, \n",
- " epochs=100, verbose=1, validation_data=(X_test, Y_test))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "### Plotting Network Performance Trend\n",
- "The return value of the `fit` function is a `keras.callbacks.History` object which contains the entire history of training/validation loss and accuracy, for each epoch. We can therefore plot the behaviour of loss and accuracy during the training phase."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "\n",
- "plt.figure()\n",
- "plt.xlabel('Epochs')\n",
- "plt.ylabel('Loss')\n",
- "plt.plot(network_history.history['loss'])\n",
- "plt.plot(network_history.history['val_loss'])\n",
- "plt.legend(['Training', 'Validation'])\n",
- "\n",
- "plt.figure()\n",
- "plt.xlabel('Epochs')\n",
- "plt.ylabel('Accuracy')\n",
- "plt.plot(network_history.history['acc'])\n",
- "plt.plot(network_history.history['val_acc'])\n",
- "plt.legend(['Training', 'Validation'], loc='lower right')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "After `100` epochs, we get a `98.8%` validation accuracy. \n",
- "\n",
- "If you continue training, at some point the validation loss will start to increase: that is when the model starts to **overfit**. \n",
- "\n",
- "It is always necessary to monitor training and validation loss during the training of any kind of Neural Network, either to detect overfitting or to evaluate the behaviour of the model **(any clue on how to do it??)**"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# %load solutions/sol_221_2.py"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2.2.2 CNN HandsOn - MNIST & CN Nets.ipynb b/2.2.2 CNN HandsOn - MNIST & CN Nets.ipynb
deleted file mode 100644
index 19f4cc9..0000000
--- a/2.2.2 CNN HandsOn - MNIST & CN Nets.ipynb
+++ /dev/null
@@ -1,1028 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Convolution Nets for MNIST"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Deep Learning models can take quite a bit of time to run, particularly if GPU isn't used. \n",
- "\n",
- "In the interest of time, you could sample a subset of observations (e.g. $1000$) that are a particular number of your choice (e.g. $6$) and $1000$ observations that aren't that particular number (i.e. $\\neq 6$). \n",
- "\n",
- "We will build a model using that and see how it performs on the test dataset"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "#Import the required libraries\n",
- "import numpy as np\n",
- "np.random.seed(1338)\n",
- "\n",
- "from keras.datasets import mnist"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "from keras.models import Sequential\n",
- "from keras.layers.core import Dense, Dropout, Activation, Flatten"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "from keras.layers.convolutional import Conv2D\n",
- "from keras.layers.pooling import MaxPooling2D"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "from keras.utils import np_utils\n",
- "from keras.optimizers import SGD"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Loading Data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [],
- "source": [
- "#Load the training and testing data\n",
- "(X_train, y_train), (X_test, y_test) = mnist.load_data()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "X_test_orig = X_test"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## Data Preparation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "from keras import backend as K"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Very Important: \n",
- "When dealing with images & convolutions, it is paramount to handle `image_data_format` properly"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "img_rows, img_cols = 28, 28\n",
- "\n",
- "if K.image_data_format() == 'channels_first':\n",
- " shape_ord = (1, img_rows, img_cols)\n",
- "else: # channel_last\n",
- " shape_ord = (img_rows, img_cols, 1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Preprocess and Normalise Data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [],
- "source": [
- "X_train = X_train.reshape((X_train.shape[0],) + shape_ord)\n",
- "X_test = X_test.reshape((X_test.shape[0],) + shape_ord)\n",
- "\n",
- "X_train = X_train.astype('float32')\n",
- "X_test = X_test.astype('float32')\n",
- "\n",
- "X_train /= 255\n",
- "X_test /= 255"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "np.random.seed(1338) # for reproducibilty!!\n",
- "\n",
- "# Test data\n",
- "X_test = X_test.copy()\n",
- "Y = y_test.copy()\n",
- "\n",
- "# Converting the output to binary classification(Six=1,Not Six=0)\n",
- "Y_test = Y == 6\n",
- "Y_test = Y_test.astype(int)\n",
- "\n",
- "# Selecting the 5918 examples where the output is 6\n",
- "X_six = X_train[y_train == 6].copy()\n",
- "Y_six = y_train[y_train == 6].copy()\n",
- "\n",
- "# Selecting the examples where the output is not 6\n",
- "X_not_six = X_train[y_train != 6].copy()\n",
- "Y_not_six = y_train[y_train != 6].copy()\n",
- "\n",
- "# Selecting 6000 random examples from the data that \n",
- "# only contains the data where the output is not 6\n",
- "random_rows = np.random.randint(0,X_six.shape[0],6000)\n",
- "X_not_six = X_not_six[random_rows]\n",
- "Y_not_six = Y_not_six[random_rows]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "# Appending the data with output as 6 and data with output as <> 6\n",
- "X_train = np.append(X_six,X_not_six)\n",
- "\n",
- "# Reshaping the appended data to appropraite form\n",
- "X_train = X_train.reshape((X_six.shape[0] + X_not_six.shape[0],) + shape_ord)\n",
- "\n",
- "# Appending the labels and converting the labels to \n",
- "# binary classification(Six=1,Not Six=0)\n",
- "Y_labels = np.append(Y_six,Y_not_six)\n",
- "Y_train = Y_labels == 6 \n",
- "Y_train = Y_train.astype(int)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "print(X_train.shape, Y_labels.shape, X_test.shape, Y_test.shape)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "fragment"
- }
- },
- "outputs": [],
- "source": [
- "# Converting the classes to its binary categorical form\n",
- "nb_classes = 2\n",
- "Y_train = np_utils.to_categorical(Y_train, nb_classes)\n",
- "Y_test = np_utils.to_categorical(Y_test, nb_classes)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# A simple CNN"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "# -- Initializing the values for the convolution neural network\n",
- "\n",
- "nb_epoch = 2 # kept very low! Please increase if you have GPU\n",
- "\n",
- "batch_size = 64\n",
- "# number of convolutional filters to use\n",
- "nb_filters = 32\n",
- "# size of pooling area for max pooling\n",
- "nb_pool = 2\n",
- "# convolution kernel size\n",
- "nb_conv = 3\n",
- "\n",
- "sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Step 1: Model Definition"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "model = Sequential()\n",
- "\n",
- "model.add(Conv2D(nb_filters, (nb_conv, nb_conv), padding='valid', \n",
- " input_shape=shape_ord)) # note: the very first layer **must** always specify the input_shape\n",
- "model.add(Activation('relu'))\n",
- "\n",
- "model.add(Flatten())\n",
- "model.add(Dense(nb_classes))\n",
- "model.add(Activation('softmax'))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Step 2: Compile"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "model.compile(loss='categorical_crossentropy',\n",
- " optimizer='sgd',\n",
- " metrics=['accuracy'])"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "#### Step 3: Fit"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "hist = model.fit(X_train, Y_train, batch_size=batch_size, \n",
- " epochs=nb_epoch, verbose=1, \n",
- " validation_data=(X_test, Y_test))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline\n",
- "\n",
- "plt.figure()\n",
- "plt.xlabel('Epochs')\n",
- "plt.ylabel('Loss')\n",
- "plt.plot(hist.history['loss'])\n",
- "plt.plot(hist.history['val_loss'])\n",
- "plt.legend(['Training', 'Validation'])\n",
- "\n",
- "plt.figure()\n",
- "plt.xlabel('Epochs')\n",
- "plt.ylabel('Accuracy')\n",
- "plt.plot(hist.history['acc'])\n",
- "plt.plot(hist.history['val_acc'])\n",
- "plt.legend(['Training', 'Validation'], loc='lower right')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Step 4: Evaluate"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "print('Available Metrics in Model: {}'.format(model.metrics_names))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# Evaluating the model on the test data \n",
- "loss, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
- "print('Test Loss:', loss)\n",
- "print('Test Accuracy:', accuracy)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "### Let's plot our model Predictions!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "import matplotlib.pyplot as plt\n",
- "\n",
- "%matplotlib inline"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "slice = 15\n",
- "predicted = model.predict(X_test[:slice]).argmax(-1)\n",
- "\n",
- "plt.figure(figsize=(16,8))\n",
- "for i in range(slice):\n",
- " plt.subplot(1, slice, i+1)\n",
- " plt.imshow(X_test_orig[i], interpolation='nearest')\n",
- " plt.text(0, 0, predicted[i], color='black', \n",
- " bbox=dict(facecolor='white', alpha=1))\n",
- " plt.axis('off')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Adding more Dense Layers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "model = Sequential()\n",
- "model.add(Conv2D(nb_filters, (nb_conv, nb_conv),\n",
- " padding='valid', input_shape=shape_ord))\n",
- "model.add(Activation('relu'))\n",
- "\n",
- "model.add(Flatten())\n",
- "model.add(Dense(128))\n",
- "model.add(Activation('relu'))\n",
- "\n",
- "model.add(Dense(nb_classes))\n",
- "model.add(Activation('softmax'))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "model.compile(loss='categorical_crossentropy',\n",
- " optimizer='sgd',\n",
- " metrics=['accuracy'])\n",
- "\n",
- "model.fit(X_train, Y_train, batch_size=batch_size, \n",
- " epochs=nb_epoch,verbose=1,\n",
- " validation_data=(X_test, Y_test))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "#Evaluating the model on the test data \n",
- "score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
- "print('Test score:', score)\n",
- "print('Test accuracy:', accuracy)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Adding Dropout"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "model = Sequential()\n",
- "\n",
- "model.add(Conv2D(nb_filters, (nb_conv, nb_conv),\n",
- " padding='valid',\n",
- " input_shape=shape_ord))\n",
- "model.add(Activation('relu'))\n",
- "\n",
- "model.add(Flatten())\n",
- "model.add(Dense(128))\n",
- "model.add(Activation('relu'))\n",
- "model.add(Dropout(0.5))\n",
- "model.add(Dense(nb_classes))\n",
- "model.add(Activation('softmax'))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "model.compile(loss='categorical_crossentropy',\n",
- " optimizer='sgd',\n",
- " metrics=['accuracy'])\n",
- "\n",
- "model.fit(X_train, Y_train, batch_size=batch_size, \n",
- " epochs=nb_epoch,verbose=1,\n",
- " validation_data=(X_test, Y_test))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "#Evaluating the model on the test data \n",
- "score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
- "print('Test score:', score)\n",
- "print('Test accuracy:', accuracy)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Adding more Convolution Layers"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "model = Sequential()\n",
- "model.add(Conv2D(nb_filters, (nb_conv, nb_conv),\n",
- " padding='valid', input_shape=shape_ord))\n",
- "model.add(Activation('relu'))\n",
- "model.add(Convolution2D(nb_filters, (nb_conv, nb_conv)))\n",
- "model.add(Activation('relu'))\n",
- "model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))\n",
- "model.add(Dropout(0.25))\n",
- " \n",
- "model.add(Flatten())\n",
- "model.add(Dense(128))\n",
- "model.add(Activation('relu'))\n",
- "model.add(Dropout(0.5))\n",
- "model.add(Dense(nb_classes))\n",
- "model.add(Activation('softmax'))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "model.compile(loss='categorical_crossentropy',\n",
- " optimizer='sgd',\n",
- " metrics=['accuracy'])\n",
- "\n",
- "model.fit(X_train, Y_train, batch_size=batch_size, \n",
- " epochs=nb_epoch,verbose=1,\n",
- " validation_data=(X_test, Y_test))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "#Evaluating the model on the test data \n",
- "score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
- "print('Test score:', score)\n",
- "print('Test accuracy:', accuracy)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "# Exercise\n",
- "\n",
- "The above code has been written as a function. \n",
- "\n",
- "Change some of the **hyperparameters** and see what happens. "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "# Function for constructing the convolution neural network\n",
- "# Feel free to add parameters, if you want\n",
- "\n",
- "def build_model():\n",
- " \"\"\"\"\"\"\n",
- " model = Sequential()\n",
- " model.add(Conv2D(nb_filters, (nb_conv, nb_conv), \n",
- " padding='valid',\n",
- " input_shape=shape_ord))\n",
- " model.add(Activation('relu'))\n",
- " model.add(Conv2D(nb_filters, (nb_conv, nb_conv)))\n",
- " model.add(Activation('relu'))\n",
- " model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))\n",
- " model.add(Dropout(0.25))\n",
- " \n",
- " model.add(Flatten())\n",
- " model.add(Dense(128))\n",
- " model.add(Activation('relu'))\n",
- " model.add(Dropout(0.5))\n",
- " model.add(Dense(nb_classes))\n",
- " model.add(Activation('softmax'))\n",
- " \n",
- " model.compile(loss='categorical_crossentropy',\n",
- " optimizer='sgd',\n",
- " metrics=['accuracy'])\n",
- "\n",
- " model.fit(X_train, Y_train, batch_size=batch_size, \n",
- " epochs=nb_epoch,verbose=1,\n",
- " validation_data=(X_test, Y_test))\n",
- " \n",
- "\n",
- " #Evaluating the model on the test data \n",
- " score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
- " print('Test score:', score)\n",
- " print('Test accuracy:', accuracy)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "#Timing how long it takes to build the model and test it.\n",
- "%timeit -n1 -r1 build_model()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Batch Normalisation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Normalize the activations of the previous layer at each batch, i.e. applies a transformation that maintains the mean activation close to 0 and the activation standard deviation close to 1."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "## How to BatchNorm in Keras"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "```python\n",
- "from keras.layers.normalization import BatchNormalization\n",
- "\n",
- "BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, \n",
- " beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros',\n",
- " moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None,\n",
- " beta_constraint=None, gamma_constraint=None)\n",
- "```\n",
- "\n",
- "#### Arguments\n",
- "\n",
- "\n",
- "- axis: Integer, the axis that should be normalized\n",
- " (typically the features axis).\n",
- " For instance, after a
Conv2D
layer with\n",
- " data_format=\"channels_first\"
,\n",
- " set axis=1
in BatchNormalization
. \n",
- "- momentum: Momentum for the moving average.
\n",
- "- epsilon: Small float added to variance to avoid dividing by zero.
\n",
- "- center: If True, add offset of
beta
to normalized tensor.\n",
- " If False, beta
is ignored. \n",
- "- scale: If True, multiply by
gamma
.\n",
- " If False, gamma
is not used.\n",
- " When the next layer is linear (also e.g. nn.relu
),\n",
- " this can be disabled since the scaling\n",
- " will be done by the next layer. \n",
- "- beta_initializer: Initializer for the beta weight.
\n",
- "- gamma_initializer: Initializer for the gamma weight.
\n",
- "- moving_mean_initializer: Initializer for the moving mean.
\n",
- "- moving_variance_initializer: Initializer for the moving variance.
\n",
- "- beta_regularizer: Optional regularizer for the beta weight.
\n",
- "- gamma_regularizer: Optional regularizer for the gamma weight.
\n",
- "- beta_constraint: Optional constraint for the beta weight.
\n",
- "- gamma_constraint: Optional constraint for the gamma weight.
\n",
- "
"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Excercise"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [],
- "source": [
- "# Try to add a new BatchNormalization layer to the Model \n",
- "# (after the Dropout layer) - before or after the ReLU Activation"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2.2.3 CNN HandsON - CIFAR10.ipynb b/2.2.3 CNN HandsON - CIFAR10.ipynb
deleted file mode 100644
index 5d6fdf2..0000000
--- a/2.2.3 CNN HandsON - CIFAR10.ipynb
+++ /dev/null
@@ -1,378 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "# Convolutional Neural Network\n",
- "\n",
- "In this second exercise-notebook we will play with Convolutional Neural Network (CNN). \n",
- "\n",
- "As you should have seen, a CNN is a feed-forward neural network tipically composed of Convolutional, MaxPooling and Dense layers. \n",
- "\n",
- "If the task implemented by the CNN is a classification task, the last Dense layer should use the **Softmax** activation, and the loss should be the **categorical crossentropy**.\n",
- "\n",
- "Reference: [https://github.com/fchollet/keras/blob/master/examples/cifar10_cnn.py]()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Network Topology Model\n",
- "\n",
- "A simple CNN, with one input branch and one output branch can be defined using a [Sequential](http://keras.io/models/#sequential) model and stacking together all its layers. \n",
- "\n",
- "In this exercise we want to build a (_quite shallow_) network which contains two \n",
- "[Convolution, Convolution, MaxPooling] stages, and two Dense layers.\n",
- "\n",
- "To test a different optimizer, we will use [AdaDelta](http://keras.io/optimizers/), which is a bit more complex than the simple Vanilla SGD with momentum."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ]
- }
- ],
- "source": [
- "from keras.models import Sequential\n",
- "from keras.layers.core import Dense, Dropout, Flatten, Activation\n",
- "from keras.layers.convolutional import Convolution2D, MaxPooling2D\n",
- "from keras.optimizers import Adadelta\n",
- "\n",
- "input_shape = (3, 32, 32)\n",
- "nb_classes = 10\n",
- "\n",
- "## [conv@32x3x3+relu]x2 --> MaxPool@2x2 --> DropOut@0.25 -->\n",
- "## [conv@64x3x3+relu]x2 --> MaxPool@2x2 --> DropOut@0.25 -->\n",
- "## Flatten--> FC@512+relu --> DropOut@0.5 --> FC@nb_classes+SoftMax\n",
- "## NOTE: each couple of Conv filters must have `border_mode=\"same\"` and `\"valid\"`, respectively\n",
- "\n",
- "## your code here\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# %load solutions/sol_223.py"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "### Understanding layer shapes\n",
- "\n",
- "An important feature of Keras layers is that each of them has an `input_shape` attribute, which you can use to visualize the shape of the input tensor, and an `output_shape` attribute, for inspecting the shape of the output tensor.\n",
- "\n",
- "As we can see, the input shape of the first convolutional layer corresponds to the `input_shape` attribute (which must be specified by the user). \n",
- "\n",
- "In this case, it is a `32x32` image with three color channels. \n",
- "\n",
- "Since this convolutional layer has the `border_mode` set to `same`, its output width and height will remain the same, and the number of output channel will be equal to the number of filters learned by the layer, 16. \n",
- "\n",
- "The following convolutional layers, instead, have the default `border_mode`, and therefore reduce width and height by $(k-1)$, where $k$ is the size of the kernel. \n",
- "\n",
- "MaxPooling layers, instead, reduce width and height of the input tensor, but keep the same number of channels. Activation layers, of course, don't change the shape."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Layer 0 \t (None, 3, 32, 32) \t (None, 32, 32, 32)\n",
- "Layer 1 \t (None, 32, 32, 32) \t (None, 32, 32, 32)\n",
- "Layer 2 \t (None, 32, 32, 32) \t (None, 32, 30, 30)\n",
- "Layer 3 \t (None, 32, 30, 30) \t (None, 32, 30, 30)\n",
- "Layer 4 \t (None, 32, 30, 30) \t (None, 32, 15, 15)\n",
- "Layer 5 \t (None, 32, 15, 15) \t (None, 32, 15, 15)\n",
- "Layer 6 \t (None, 32, 15, 15) \t (None, 64, 15, 15)\n",
- "Layer 7 \t (None, 64, 15, 15) \t (None, 64, 15, 15)\n",
- "Layer 8 \t (None, 64, 15, 15) \t (None, 64, 13, 13)\n",
- "Layer 9 \t (None, 64, 13, 13) \t (None, 64, 13, 13)\n",
- "Layer 10 \t (None, 64, 13, 13) \t (None, 64, 6, 6)\n",
- "Layer 11 \t (None, 64, 6, 6) \t (None, 64, 6, 6)\n",
- "Layer 12 \t (None, 64, 6, 6) \t (None, 2304)\n",
- "Layer 13 \t (None, 2304) \t (None, 512)\n",
- "Layer 14 \t (None, 512) \t (None, 512)\n",
- "Layer 15 \t (None, 512) \t (None, 512)\n",
- "Layer 16 \t (None, 512) \t (None, 10)\n",
- "Layer 17 \t (None, 10) \t (None, 10)\n"
- ]
- }
- ],
- "source": [
- "for i, layer in enumerate(model.layers):\n",
- " print (\"Layer\", i, \"\\t\", layer.input_shape, \"\\t\", layer.output_shape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "### Understanding weights shape\n",
- "In the same way, we can visualize the shape of the weights learned by each layer. In particular, Keras lets you inspect weights by using the `get_weights` method of a layer object. This will return a list with two elements, the first one being the weight tensor and the second one being the bias vector.\n",
- "\n",
- "Of course, MaxPooling layer don't have any weight tensor, since they don't have learnable parameters. Convolutional layers, instead, learn a $(n_o, n_i, k, k)$ weight tensor, where $k$ is the size of the kernel, $n_i$ is the number of channels of the input tensor, and $n_o$ is the number of filters to be learned. For each of the $n_o$ filters, a bias is also learned. Dense layers learn a $(n_i, n_o)$ weight tensor, where $n_o$ is the output size and $n_i$ is the input size of the layer. Each of the $n_o$ neurons also has a bias."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Layer 0 \t (32, 3, 3, 3) \t (32,)\n",
- "Layer 2 \t (32, 32, 3, 3) \t (32,)\n",
- "Layer 6 \t (64, 32, 3, 3) \t (64,)\n",
- "Layer 8 \t (64, 64, 3, 3) \t (64,)\n",
- "Layer 13 \t (2304, 512) \t (512,)\n",
- "Layer 16 \t (512, 10) \t (10,)\n"
- ]
- }
- ],
- "source": [
- "for i, layer in enumerate(model.layers):\n",
- " if len(layer.get_weights()) > 0:\n",
- " print(\"Layer\", i, \"\\t\", layer.get_weights()[0].shape, \"\\t\", layer.get_weights()[1].shape)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "# Training the network\n",
- "\n",
- "We will train our network on the **CIFAR10** [dataset](https://www.cs.toronto.edu/~kriz/cifar.html), which contains `50,000` 32x32 color training images, labeled over 10 categories, and 10,000 test images. \n",
- "\n",
- "As this dataset is also included in Keras datasets, we just ask the `keras.datasets` module for the dataset.\n",
- "\n",
- "Training and test images are normalized to lie in the $\\left[0,1\\right]$ interval."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "from keras.datasets import cifar10\n",
- "from keras.utils import np_utils\n",
- "\n",
- "(X_train, y_train), (X_test, y_test) = cifar10.load_data()\n",
- "Y_train = np_utils.to_categorical(y_train, nb_classes)\n",
- "Y_test = np_utils.to_categorical(y_test, nb_classes)\n",
- "X_train = X_train.astype(\"float32\")\n",
- "X_test = X_test.astype(\"float32\")\n",
- "X_train /= 255\n",
- "X_test /= 255"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "To reduce the risk of overfitting, we also apply some image transformation, like rotations, shifts and flips. All these can be easily implemented using the Keras [Image Data Generator](http://keras.io/preprocessing/image/)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Warning: The following cells may be computational Intensive...."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "from keras.preprocessing.image import ImageDataGenerator\n",
- "\n",
- "generated_images = ImageDataGenerator(\n",
- " featurewise_center=True, # set input mean to 0 over the dataset\n",
- " samplewise_center=False, # set each sample mean to 0\n",
- " featurewise_std_normalization=True, # divide inputs by std of the dataset\n",
- " samplewise_std_normalization=False, # divide each input by its std\n",
- " zca_whitening=False, # apply ZCA whitening\n",
- " rotation_range=0, # randomly rotate images in the range (degrees, 0 to 180)\n",
- " width_shift_range=0.2, # randomly shift images horizontally (fraction of total width)\n",
- " height_shift_range=0.2, # randomly shift images vertically (fraction of total height)\n",
- " horizontal_flip=True, # randomly flip images\n",
- " vertical_flip=False) # randomly flip images\n",
- "\n",
- "generated_images.fit(X_train)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- "Now we can start training. \n",
- "\n",
- "At each iteration, a batch of 500 images is requested to the `ImageDataGenerator` object, and then fed to the network."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(50000, 3, 32, 32)"
- ]
- },
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X_train.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "gen = generated_images.flow(X_train, Y_train, batch_size=500, shuffle=True)\n",
- "X_batch, Y_batch = next(gen)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 12,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "(500, 3, 32, 32)"
- ]
- },
- "execution_count": 12,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "X_batch.shape"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "scrolled": true
- },
- "outputs": [],
- "source": [
- "from keras.utils import generic_utils\n",
- "\n",
- "n_epochs = 2\n",
- "for e in range(n_epochs):\n",
- " print('Epoch', e)\n",
- " print('Training...')\n",
- " progbar = generic_utils.Progbar(X_train.shape[0])\n",
- " \n",
- " for X_batch, Y_batch in generated_images.flow(X_train, Y_train, batch_size=500, shuffle=True):\n",
- " loss = model.train_on_batch(X_batch, Y_batch)\n",
- " progbar.add(X_batch.shape[0], values=[('train loss', loss[0])])"
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2.3 Deep Convolutional Neural Networks.ipynb b/2.3 Deep Convolutional Neural Networks.ipynb
deleted file mode 100644
index df7cbaa..0000000
--- a/2.3 Deep Convolutional Neural Networks.ipynb
+++ /dev/null
@@ -1,481 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Deep CNN Models"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "Constructing and training your own ConvNet from scratch can be Hard and a long task.\n",
- "\n",
- "A common trick used in Deep Learning is to use a **pre-trained** model and finetune it to the specific data it will be used for. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "## Famous Models with Keras\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "This notebook contains code and reference for the following Keras models (gathered from [https://github.com/fchollet/keras/tree/master/keras/applications]())\n",
- "\n",
- "- VGG16\n",
- "- VGG19\n",
- "- ResNet50\n",
- "- Inception v3\n",
- "- Xception\n",
- "- ... more to come\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "## References\n",
- "\n",
- "- [Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556) - please cite this paper if you use the VGG models in your work.\n",
- "- [Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385) - please cite this paper if you use the ResNet model in your work.\n",
- "- [Rethinking the Inception Architecture for Computer Vision](http://arxiv.org/abs/1512.00567) - please cite this paper if you use the Inception v3 model in your work.\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "source": [
- "All architectures are compatible with both TensorFlow and Theano, and upon instantiation the models will be built according to the image dimension ordering set in your Keras configuration file at `~/.keras/keras.json`. \n",
- "\n",
- "For instance, if you have set `image_data_format=\"channels_last\"`, then any model loaded from this repository will get built according to the TensorFlow dimension ordering convention, \"Width-Height-Depth\"."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# VGG16"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# VGG19"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "source": [
- "# `keras.applications`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "subslide"
- }
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using TensorFlow backend.\n"
- ]
- }
- ],
- "source": [
- "from keras.applications import VGG16\n",
- "from keras.applications.imagenet_utils import preprocess_input, decode_predictions\n",
- "import os"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# -- Jupyter/IPython way to see documentation\n",
- "# please focus on parameters (e.g. include top)\n",
- "VGG16??"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Downloading data from https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels.h5\n"
- ]
- }
- ],
- "source": [
- "vgg16 = VGG16(include_top=True, weights='imagenet')"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If you're wondering **where** this `HDF5` files with weights is stored, please take a look at `~/.keras/models/`"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### HandsOn VGG16 - Pre-trained Weights"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "IMAGENET_FOLDER = 'imgs/imagenet' #in the repo"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\u001b[31mapricot_565.jpeg\u001b[m\u001b[m \u001b[31mapricot_787.jpeg\u001b[m\u001b[m \u001b[31mstrawberry_1174.jpeg\u001b[m\u001b[m\r\n",
- "\u001b[31mapricot_696.jpeg\u001b[m\u001b[m \u001b[31mstrawberry_1157.jpeg\u001b[m\u001b[m \u001b[31mstrawberry_1189.jpeg\u001b[m\u001b[m\r\n"
- ]
- }
- ],
- "source": [
- "!ls imgs/imagenet"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 13,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Input image shape: (1, 224, 224, 3)\n",
- "Downloading data from https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json\n",
- "Predicted: [[('n07745940', 'strawberry', 0.98483676), ('n07836838', 'chocolate_sauce', 0.0073711565), ('n07614500', 'ice_cream', 0.0030998574), ('n04332243', 'strainer', 0.0025101686), ('n04476259', 'tray', 0.00060175249)]]\n"
- ]
- }
- ],
- "source": [
- "from keras.preprocessing import image\n",
- "import numpy as np\n",
- "\n",
- "img_path = os.path.join(IMAGENET_FOLDER, 'strawberry_1157.jpeg')\n",
- "img = image.load_img(img_path, target_size=(224, 224))\n",
- "x = image.img_to_array(img)\n",
- "x = np.expand_dims(x, axis=0)\n",
- "x = preprocess_input(x)\n",
- "print('Input image shape:', x.shape)\n",
- "\n",
- "preds = vgg16.predict(x)\n",
- "print('Predicted:', decode_predictions(preds))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Input image shape: (1, 224, 224, 3)\n",
- "Predicted: [[('n07747607', 'orange', 0.87526792), ('n07749582', 'lemon', 0.03620464), ('n07717556', 'butternut_squash', 0.021843448), ('n03937543', 'pill_bottle', 0.0126132), ('n03942813', 'ping-pong_ball', 0.0054204506)]]\n"
- ]
- }
- ],
- "source": [
- "img_path = os.path.join(IMAGENET_FOLDER, 'apricot_696.jpeg')\n",
- "img = image.load_img(img_path, target_size=(224, 224))\n",
- "x = image.img_to_array(img)\n",
- "x = np.expand_dims(x, axis=0)\n",
- "x = preprocess_input(x)\n",
- "print('Input image shape:', x.shape)\n",
- "\n",
- "preds = vgg16.predict(x)\n",
- "print('Predicted:', decode_predictions(preds))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 15,
- "metadata": {
- "collapsed": false,
- "deletable": true,
- "editable": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Input image shape: (1, 224, 224, 3)\n",
- "Predicted: [[('n07718472', 'cucumber', 0.29338178), ('n07716358', 'zucchini', 0.2383192), ('n04596742', 'wok', 0.042132568), ('n07716906', 'spaghetti_squash', 0.038422), ('n07711569', 'mashed_potato', 0.036552209)]]\n"
- ]
- }
- ],
- "source": [
- "img_path = os.path.join(IMAGENET_FOLDER, 'apricot_565.jpeg')\n",
- "img = image.load_img(img_path, target_size=(224, 224))\n",
- "x = image.img_to_array(img)\n",
- "x = np.expand_dims(x, axis=0)\n",
- "x = preprocess_input(x)\n",
- "print('Input image shape:', x.shape)\n",
- "\n",
- "preds = vgg16.predict(x)\n",
- "print('Predicted:', decode_predictions(preds))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "deletable": true,
- "editable": true,
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Hands On:\n",
- "\n",
- "### Try to do the same with VGG19 Model"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true,
- "deletable": true,
- "editable": true
- },
- "outputs": [],
- "source": [
- "# from keras.applications import VGG19"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Residual Networks"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## ResNet 50"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- ""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "## from keras.applications import ..."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 0
-}
diff --git a/2.5 HyperParameter Tuning.ipynb b/2.5 HyperParameter Tuning.ipynb
deleted file mode 100644
index 9a52493..0000000
--- a/2.5 HyperParameter Tuning.ipynb
+++ /dev/null
@@ -1,268 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# HyperParameter Tuning"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### `keras.wrappers.scikit_learn`\n",
- "\n",
- "Example adapted from: [https://github.com/fchollet/keras/blob/master/examples/mnist_sklearn_wrapper.py]()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Problem: \n",
- "Builds simple CNN models on MNIST and uses sklearn's GridSearchCV to find best model"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "np.random.seed(1337) # for reproducibility"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "from keras.datasets import mnist\n",
- "from keras.models import Sequential\n",
- "from keras.layers import Dense, Dropout, Activation, Flatten\n",
- "from keras.layers import Conv2D, MaxPooling2D\n",
- "from keras.utils import np_utils\n",
- "from keras.wrappers.scikit_learn import KerasClassifier\n",
- "from keras import backend as K"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "from sklearn.model_selection import GridSearchCV"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Data Preparation"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "nb_classes = 10\n",
- "\n",
- "# input image dimensions\n",
- "img_rows, img_cols = 28, 28"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "# load training data and do basic data normalization\n",
- "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
- "\n",
- "if K.image_dim_ordering() == 'th':\n",
- " X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)\n",
- " X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)\n",
- " input_shape = (1, img_rows, img_cols)\n",
- "else:\n",
- " X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)\n",
- " X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\n",
- " input_shape = (img_rows, img_cols, 1)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "X_train = X_train.astype('float32')\n",
- "X_test = X_test.astype('float32')\n",
- "X_train /= 255\n",
- "X_test /= 255\n",
- "\n",
- "# convert class vectors to binary class matrices\n",
- "y_train = np_utils.to_categorical(y_train, nb_classes)\n",
- "y_test = np_utils.to_categorical(y_test, nb_classes)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Build Model"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "def make_model(dense_layer_sizes, nb_filters, nb_conv, nb_pool):\n",
- " '''Creates model comprised of 2 convolutional layers followed by dense layers\n",
- "\n",
- " dense_layer_sizes: List of layer sizes. This list has one number for each layer\n",
- " nb_filters: Number of convolutional filters in each convolutional layer\n",
- " nb_conv: Convolutional kernel size\n",
- " nb_pool: Size of pooling area for max pooling\n",
- " '''\n",
- "\n",
- " model = Sequential()\n",
- "\n",
- " model.add(Conv2D(nb_filters, (nb_conv, nb_conv),\n",
- " padding='valid', input_shape=input_shape))\n",
- " model.add(Activation('relu'))\n",
- " model.add(Conv2D(nb_filters, (nb_conv, nb_conv)))\n",
- " model.add(Activation('relu'))\n",
- " model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))\n",
- " model.add(Dropout(0.25))\n",
- "\n",
- " model.add(Flatten())\n",
- " for layer_size in dense_layer_sizes:\n",
- " model.add(Dense(layer_size))\n",
- " model.add(Activation('relu'))\n",
- " model.add(Dropout(0.5))\n",
- " model.add(Dense(nb_classes))\n",
- " model.add(Activation('softmax'))\n",
- "\n",
- " model.compile(loss='categorical_crossentropy',\n",
- " optimizer='adadelta',\n",
- " metrics=['accuracy'])\n",
- "\n",
- " return model"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "dense_size_candidates = [[32], [64], [32, 32], [64, 64]]\n",
- "my_classifier = KerasClassifier(make_model, batch_size=32)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## GridSearch HyperParameters"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false,
- "scrolled": false
- },
- "outputs": [],
- "source": [
- "validator = GridSearchCV(my_classifier,\n",
- " param_grid={'dense_layer_sizes': dense_size_candidates,\n",
- " # nb_epoch is avail for tuning even when not\n",
- " # an argument to model building function\n",
- " 'nb_epoch': [3, 6],\n",
- " 'nb_filters': [8],\n",
- " 'nb_conv': [3],\n",
- " 'nb_pool': [2]},\n",
- " scoring='neg_log_loss',\n",
- " n_jobs=1)\n",
- "validator.fit(X_train, y_train)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "print('The parameters of the best model are: ')\n",
- "print(validator.best_params_)\n",
- "\n",
- "# validator.best_estimator_ returns sklearn-wrapped version of best model.\n",
- "# validator.best_estimator_.model returns the (unwrapped) keras model\n",
- "best_model = validator.best_estimator_.model\n",
- "metric_names = best_model.metrics_names\n",
- "metric_values = best_model.evaluate(X_test, y_test)\n",
- "for metric, value in zip(metric_names, metric_values):\n",
- " print(metric, ': ', value)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "Python 3",
- "language": "python",
- "name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.5.2"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/3. Convolutional Neural Networks.ipynb b/3. Convolutional Neural Networks.ipynb
new file mode 100644
index 0000000..2f63b95
--- /dev/null
+++ b/3. Convolutional Neural Networks.ipynb
@@ -0,0 +1,1681 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Convolution Nets for MNIST"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### References:\n",
+ "\n",
+ "Some of the images and the content I used came from this great couple of blog posts \\[1\\] [https://adeshpande3.github.io/adeshpande3.github.io/]() and \\[2\\] the terrific book, [\"Neural Networks and Deep Learning\"](http://neuralnetworksanddeeplearning.com/) by Michael Nielsen. (**Strongly recommend**) "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A convolutional neural network (CNN, or ConvNet) is a type of **feed-forward** artificial neural network in which the connectivity pattern between its neurons is inspired by the organization of the animal visual cortex."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "> source: https://flickrcode.files.wordpress.com/2014/10/conv-net2.png"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Structure of a CNN\n",
+ "\n",
+ "> A more detailed overview of what CNNs do would be that you take the image, pass it through a series of convolutional, nonlinear, pooling (downsampling), and fully connected layers, and get an output. As we said earlier, the output can be a single class or a probability of classes that best describes the image. \n",
+ "\n",
+ "source: [1]\n",
+ "\n",
+ "## Convolutional Layer\n",
+ "\n",
+ "The first layer in a CNN is always a **Convolutional Layer**.\n",
+ "\n",
+ "\n",
+ "\n",
+ "**Reference**: [http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html](http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Typical CNN Structure"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A traditional **convolutional neural network** architecture, there are other layers that are interspersed between these conv layers.\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ " After some ReLU layers, it is customary to apply a **pooling layer** (aka *downsampling layer*).\n",
+ " \n",
+ " Example of a MaxPooling filter\n",
+ " \n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Other options for pooling layers are average pooling and L2-norm pooling. \n",
+ "\n",
+ "This kind of layer serves two main purposes: reduce the amount of parameters; controlling overfitting. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "\n",
+ "# CNN in Keras"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "**Keras** has an extensive support for Convolutional Layers:\n",
+ "\n",
+ "- 1D Convolutional Layers;\n",
+ "- 2D Convolutional Layers;\n",
+ "- 3D Convolutional Layers;\n",
+ "- Depthwise Convolution;\n",
+ "- Transpose Convolution;\n",
+ "- ....\n",
+ "\n",
+ "The corresponding `keras` package is `keras.layers.convolutional`.\n",
+ "\n",
+ "Take a look at the [Convolutional Layers](https://keras.io/layers/convolutional/) documentation to know more about Conv Layers that are missing in this notebook."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Convolution1D\n",
+ "\n",
+ "```python\n",
+ "from keras.layers.convolutional import Conv1D\n",
+ "\n",
+ "Conv1D(filters, kernel_size, strides=1, padding='valid', \n",
+ " dilation_rate=1, activation=None, use_bias=True, \n",
+ " kernel_initializer='glorot_uniform', bias_initializer='zeros', \n",
+ " kernel_regularizer=None, bias_regularizer=None, \n",
+ " activity_regularizer=None, kernel_constraint=None, \n",
+ " bias_constraint=None)\n",
+ "```\n",
+ "\n",
+ "#### Arguments:\n",
+ "\n",
+ "\n",
+ "- filters: Integer, the dimensionality of the output space\n",
+ " (i.e. the number output of filters in the convolution).
\n",
+ "- kernel_size: An integer or tuple/list of a single integer,\n",
+ " specifying the length of the 1D convolution window.
\n",
+ "- strides: An integer or tuple/list of a single integer,\n",
+ " specifying the stride length of the convolution.\n",
+ " Specifying any stride value != 1 is incompatible with specifying\n",
+ " any
dilation_rate
value != 1. \n",
+ "- padding: One of
\"valid\"
, \"causal\"
or \"same\"
(case-insensitive).\n",
+ " \"causal\"
results in causal (dilated) convolutions, e.g. output[t]\n",
+ " does not depend on input[t+1:]. Useful when modeling temporal data\n",
+ " where the model should not violate the temporal order.\n",
+ " See WaveNet: A Generative Model for Raw Audio, section 2.1. \n",
+ "- dilation_rate: an integer or tuple/list of a single integer, specifying\n",
+ " the dilation rate to use for dilated convolution.\n",
+ " Currently, specifying any
dilation_rate
value != 1 is\n",
+ " incompatible with specifying any strides
value != 1. \n",
+ "- activation: Activation function to use\n",
+ " (see activations).\n",
+ " If you don't specify anything, no activation is applied\n",
+ " (ie. \"linear\" activation:
a(x) = x
). \n",
+ "- use_bias: Boolean, whether the layer uses a bias vector.
\n",
+ "- kernel_initializer: Initializer for the
kernel
weights matrix\n",
+ " (see initializers). \n",
+ "- bias_initializer: Initializer for the bias vector\n",
+ " (see initializers).
\n",
+ "- kernel_regularizer: Regularizer function applied to\n",
+ " the
kernel
weights matrix\n",
+ " (see regularizer). \n",
+ "- bias_regularizer: Regularizer function applied to the bias vector\n",
+ " (see regularizer).
\n",
+ "- activity_regularizer: Regularizer function applied to\n",
+ " the output of the layer (its \"activation\").\n",
+ " (see regularizer).
\n",
+ "- kernel_constraint: Constraint function applied to the kernel matrix\n",
+ " (see constraints).
\n",
+ "- bias_constraint: Constraint function applied to the bias vector\n",
+ " (see constraints).
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ">Convolution operator for filtering neighborhoods of **one-dimensional inputs**. When using this layer as the first layer in a model, either provide the keyword argument `input_dim` (int, e.g. 128 for sequences of 128-dimensional vectors), or `input_shape` (tuple of integers, e.g. (10, 128) for sequences of 10 vectors of 128-dimensional vectors)."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Example\n",
+ "\n",
+ "```python\n",
+ "\n",
+ "# apply a convolution 1d of length 3 to a sequence with 10 timesteps,\n",
+ "# with 64 output filters\n",
+ "model = Sequential()\n",
+ "model.add(Conv1D(64, 3, padding='same', input_shape=(10, 32)))\n",
+ "# now model.output_shape == (None, 10, 64)\n",
+ "\n",
+ "# add a new conv1d on top\n",
+ "model.add(Conv1D(32, 3, padding='same'))\n",
+ "# now model.output_shape == (None, 10, 32)\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Convolution2D\n",
+ "\n",
+ "```python\n",
+ "from keras.layers.convolutional import Conv2D\n",
+ "\n",
+ "Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', \n",
+ " data_format=None, dilation_rate=(1, 1), activation=None, \n",
+ " use_bias=True, kernel_initializer='glorot_uniform', \n",
+ " bias_initializer='zeros', kernel_regularizer=None, \n",
+ " bias_regularizer=None, activity_regularizer=None, \n",
+ " kernel_constraint=None, bias_constraint=None)\n",
+ "```\n",
+ "\n",
+ "#### Arguments:\n",
+ "\n",
+ "\n",
+ "- filters: Integer, the dimensionality of the output space\n",
+ " (i.e. the number output of filters in the convolution).
\n",
+ "- kernel_size: An integer or tuple/list of 2 integers, specifying the\n",
+ " width and height of the 2D convolution window.\n",
+ " Can be a single integer to specify the same value for\n",
+ " all spatial dimensions.
\n",
+ "- strides: An integer or tuple/list of 2 integers,\n",
+ " specifying the strides of the convolution along the width and height.\n",
+ " Can be a single integer to specify the same value for\n",
+ " all spatial dimensions.\n",
+ " Specifying any stride value != 1 is incompatible with specifying\n",
+ " any
dilation_rate
value != 1. \n",
+ "- padding: one of
\"valid\"
or \"same\"
(case-insensitive). \n",
+ "- data_format: A string,\n",
+ " one of
channels_last
(default) or channels_first
.\n",
+ " The ordering of the dimensions in the inputs.\n",
+ " channels_last
corresponds to inputs with shape\n",
+ " (batch, height, width, channels)
while channels_first
\n",
+ " corresponds to inputs with shape\n",
+ " (batch, channels, height, width)
.\n",
+ " It defaults to the image_data_format
value found in your\n",
+ " Keras config file at ~/.keras/keras.json
.\n",
+ " If you never set it, then it will be \"channels_last\". \n",
+ "- dilation_rate: an integer or tuple/list of 2 integers, specifying\n",
+ " the dilation rate to use for dilated convolution.\n",
+ " Can be a single integer to specify the same value for\n",
+ " all spatial dimensions.\n",
+ " Currently, specifying any
dilation_rate
value != 1 is\n",
+ " incompatible with specifying any stride value != 1. \n",
+ "- activation: Activation function to use\n",
+ " (see activations).\n",
+ " If you don't specify anything, no activation is applied\n",
+ " (ie. \"linear\" activation:
a(x) = x
). \n",
+ "- use_bias: Boolean, whether the layer uses a bias vector.
\n",
+ "- kernel_initializer: Initializer for the
kernel
weights matrix\n",
+ " (see initializers). \n",
+ "- bias_initializer: Initializer for the bias vector\n",
+ " (see initializers).
\n",
+ "- kernel_regularizer: Regularizer function applied to\n",
+ " the
kernel
weights matrix\n",
+ " (see regularizer). \n",
+ "- bias_regularizer: Regularizer function applied to the bias vector\n",
+ " (see regularizer).
\n",
+ "- activity_regularizer: Regularizer function applied to\n",
+ " the output of the layer (its \"activation\").\n",
+ " (see regularizer).
\n",
+ "- kernel_constraint: Constraint function applied to the kernel matrix\n",
+ " (see constraints).
\n",
+ "- bias_constraint: Constraint function applied to the bias vector\n",
+ " (see constraints).
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Example\n",
+ "Assuming \n",
+ "``keras.backend.image_data_format == \"channels_last\"``\n",
+ "```python\n",
+ "\n",
+ "# apply a 3x3 convolution with 64 output filters on a 256x256 image:\n",
+ "model = Sequential()\n",
+ "model.add(Conv2D(64, (3, 3), padding='same', \n",
+ " input_shape=(3, 256, 256)))\n",
+ "# now model.output_shape == (None, 256, 256, 64)\n",
+ "\n",
+ "# add a 3x3 convolution on top, with 32 output filters:\n",
+ "model.add(Conv2D(32, (3, 3), padding='same'))\n",
+ "# now model.output_shape == (None, 256, 256, 32)\n",
+ "\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Dimensions of Conv Filters in Keras\n",
+ "\n",
+ "The complex structure of ConvNets *may* lead to a representation that is challenging to understand.\n",
+ "\n",
+ "Of course, the dimensions vary according to the dimension of the Convolutional filters (e.g. 1D, 2D)\n",
+ "\n",
+ "### Convolution1D\n",
+ "\n",
+ "**Input Shape**:\n",
+ "\n",
+ "**3D** tensor with shape: (`batch_size`, `steps`, `input_dim`).\n",
+ "\n",
+ "**Output Shape**:\n",
+ "\n",
+ "**3D** tensor with shape: (`batch_size`, `new_steps`, `filters`).\n",
+ "\n",
+ "### Convolution2D\n",
+ "\n",
+ "**Input Shape**:\n",
+ "\n",
+ "**4D** tensor with shape: \n",
+ "\n",
+ "- (`batch_size`, `channels`, `rows`, `cols`) if `image_data_format='channels_first'`\n",
+ "- (`batch_size`, `rows`, `cols`, `channels`) if `image_data_format='channels_last'`\n",
+ "\n",
+ "**Output Shape**:\n",
+ "\n",
+ "**4D** tensor with shape:\n",
+ "\n",
+ "- (`batch_size`, `filters`, `new_rows`, `new_cols`) \n",
+ "if `image_data_format='channels_first'`\n",
+ "- (`batch_size`, `new_rows`, `new_cols`, `filters`) if `image_data_format='channels_last'`\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "Deep Learning models can take quite a bit of time to run, particularly if GPU isn't used. \n",
+ "\n",
+ "In the interest of time, you could sample a subset of observations (e.g. $1000$) that are a particular number of your choice (e.g. $6$) and $1000$ observations that aren't that particular number (i.e. $\\neq 6$). \n",
+ "\n",
+ "We will build a model using that and see how it performs on the test dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Using TensorFlow backend.\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Import the required libraries\n",
+ "import numpy as np\n",
+ "np.random.seed(1338)\n",
+ "\n",
+ "from keras.datasets import mnist"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from keras.models import Sequential\n",
+ "from keras.layers.core import Dense, Dropout, Activation, Flatten"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from keras.layers.convolutional import Conv2D\n",
+ "from keras.layers.pooling import MaxPooling2D"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "from keras.utils import np_utils\n",
+ "from keras.optimizers import SGD"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "## Loading Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "-"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "#Load the training and testing data\n",
+ "(X_train, y_train), (X_test, y_test) = mnist.load_data()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "X_test_orig = X_test"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "## Data Preparation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Very Important: \n",
+ "When dealing with images & convolutions, it is paramount to handle `image_data_format` properly"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras import backend as K"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "img_rows, img_cols = 28, 28\n",
+ "\n",
+ "if K.image_data_format() == 'channels_first':\n",
+ " shape_ord = (1, img_rows, img_cols)\n",
+ "else: # channel_last\n",
+ " shape_ord = (img_rows, img_cols, 1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Preprocess and Normalise Data"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "-"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "X_train = X_train.reshape((X_train.shape[0],) + shape_ord)\n",
+ "X_test = X_test.reshape((X_test.shape[0],) + shape_ord)\n",
+ "\n",
+ "X_train = X_train.astype('float32')\n",
+ "X_test = X_test.astype('float32')\n",
+ "\n",
+ "X_train /= 255\n",
+ "X_test /= 255"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "np.random.seed(1338) # for reproducibilty!!\n",
+ "\n",
+ "# Test data\n",
+ "X_test = X_test.copy()\n",
+ "Y = y_test.copy()\n",
+ "\n",
+ "# Converting the output to binary classification(Six=1,Not Six=0)\n",
+ "Y_test = Y == 6\n",
+ "Y_test = Y_test.astype(int)\n",
+ "\n",
+ "# Selecting the 5918 examples where the output is 6\n",
+ "X_six = X_train[y_train == 6].copy()\n",
+ "Y_six = y_train[y_train == 6].copy()\n",
+ "\n",
+ "# Selecting the examples where the output is not 6\n",
+ "X_not_six = X_train[y_train != 6].copy()\n",
+ "Y_not_six = y_train[y_train != 6].copy()\n",
+ "\n",
+ "# Selecting 6000 random examples from the data that \n",
+ "# only contains the data where the output is not 6\n",
+ "random_rows = np.random.randint(0,X_six.shape[0],6000)\n",
+ "X_not_six = X_not_six[random_rows]\n",
+ "Y_not_six = Y_not_six[random_rows]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Appending the data with output as 6 and data with output as <> 6\n",
+ "X_train = np.append(X_six,X_not_six)\n",
+ "\n",
+ "# Reshaping the appended data to appropraite form\n",
+ "X_train = X_train.reshape((X_six.shape[0] + X_not_six.shape[0],) + shape_ord)\n",
+ "\n",
+ "# Appending the labels and converting the labels to \n",
+ "# binary classification(Six=1,Not Six=0)\n",
+ "Y_labels = np.append(Y_six,Y_not_six)\n",
+ "Y_train = Y_labels == 6 \n",
+ "Y_train = Y_train.astype(int)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(11918, 28, 28, 1) (11918,) (10000, 28, 28, 1) (10000,)\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(X_train.shape, Y_labels.shape, X_test.shape, Y_test.shape)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Converting the classes to its binary categorical form\n",
+ "nb_classes = 2\n",
+ "Y_train = np_utils.to_categorical(Y_train, nb_classes)\n",
+ "Y_test = np_utils.to_categorical(Y_test, nb_classes)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# A simple CNN"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# -- Initializing the values for the convolution neural network\n",
+ "\n",
+ "nb_epoch = 2 # kept very low! Please increase if you have GPU\n",
+ "\n",
+ "batch_size = 64\n",
+ "# number of convolutional filters to use\n",
+ "nb_filters = 32\n",
+ "# size of pooling area for max pooling\n",
+ "nb_pool = 2\n",
+ "# convolution kernel size\n",
+ "nb_conv = 3\n",
+ "\n",
+ "# Vanilla SGD\n",
+ "sgd = SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "#### Step 1: Model Definition"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "model = Sequential()\n",
+ "\n",
+ "model.add(Conv2D(nb_filters, (nb_conv, nb_conv), padding='valid', \n",
+ " input_shape=shape_ord)) # note: the very first layer **must** always specify the input_shape\n",
+ "model.add(Activation('relu'))\n",
+ "\n",
+ "model.add(Flatten())\n",
+ "model.add(Dense(nb_classes))\n",
+ "model.add(Activation('softmax'))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "#### Step 2: Compile"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "model.compile(loss='categorical_crossentropy',\n",
+ " optimizer=sgd,\n",
+ " metrics=['accuracy'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "#### Step 3: Fit"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 11918 samples, validate on 10000 samples\n",
+ "Epoch 1/2\n",
+ "11918/11918 [==============================] - 8s - loss: 0.2321 - acc: 0.9491 - val_loss: 0.1276 - val_acc: 0.9616\n",
+ "Epoch 2/2\n",
+ "11918/11918 [==============================] - 1s - loss: 0.1065 - acc: 0.9666 - val_loss: 0.0933 - val_acc: 0.9685\n"
+ ]
+ }
+ ],
+ "source": [
+ "hist = model.fit(X_train, Y_train, batch_size=batch_size, \n",
+ " epochs=nb_epoch, verbose=1, \n",
+ " validation_data=(X_test, Y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 18,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "image/png": "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\nMcYT/x9iLAkO3Wk5eQAAAABJRU5ErkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "%matplotlib inline\n",
+ "\n",
+ "plt.figure()\n",
+ "plt.xlabel('Epochs')\n",
+ "plt.ylabel('Loss')\n",
+ "plt.plot(hist.history['loss'])\n",
+ "plt.plot(hist.history['val_loss'])\n",
+ "plt.legend(['Training', 'Validation'])\n",
+ "\n",
+ "plt.figure()\n",
+ "plt.xlabel('Epochs')\n",
+ "plt.ylabel('Accuracy')\n",
+ "plt.plot(hist.history['acc'])\n",
+ "plt.plot(hist.history['val_acc'])\n",
+ "plt.legend(['Training', 'Validation'], loc='lower right')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "### Step 4: Evaluate"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Available Metrics in Model: ['loss', 'acc']\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('Available Metrics in Model: {}'.format(model.metrics_names))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test Loss: 0.0933376350194\n",
+ "Test Accuracy: 0.9685\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Evaluating the model on the test data \n",
+ "loss, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
+ "print('Test Loss:', loss)\n",
+ "print('Test Accuracy:', accuracy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "### Let's plot our model Predictions!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6IAAABYCAYAAADvGUplAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmcTfX/wPHXnX2zjd1YZhhjLFkaREqoSCEqla8l0Upp\n1aqkVZsQKpX6tYgiJCUlosigEDPWmbHvWSbGmLlzf3+875lxxwyz3eXc+34+Hh5z59xz7nw+zrln\n+bw/n/fHYrPZUEoppZRSSimlXMXP3QVQSimllFJKKeVb9EFUKaWUUkoppZRLOf1BNDQ09IDFYrEV\n919oaOgBZ5fNGbS+3l1nX6sv6DGt9dX6mrnOvlZf0GNa66v19cX6mrXOvlbf/CzOHiNqsVhsJfkb\nFosFm81mcUKRnErrW6xtTVdnX6sv6DFdjO20vibga99hX6sv6DFdjO20viag9S3Wtqars6/VNz/t\nmquUUkoppZRSyqX0QVQppZRSSimllEu55UF04cKFNGrUiNjYWMaOHeuOIrjUkCFDqFatGs2aNXN3\nUVzG1/ax1te7+Vp9wffq7Ev11WuSd+9f8L366jHt/ftY6+ulbDabU//Jn8iTnZ1tq1+/vm3Hjh22\nzMxMW/PmzW2bNm2y5Wffzunlc3Z9bTab7bfffrOtXbvW1rRp0/Pe88b6evM+9rX6FlRnra9317eo\ndfa1+pq1ziW9Jpm1vgXV2Zv3r9ZX6H2WnqPNWmdfq2/+fy6PiCYmJhIbG0v9+vUJCgri9ttvZ968\nea4uhkt17NiRyMhIdxfDZXxtH2t9tb7extfq7Gv11WuSd+9fX6sv6DHt7ftY6+u99XX5g+jevXup\nU6dO7u+1a9dm7969ri6GciJf28daX62vt/G1OvtafX2Nr+1fX6uvL/K1faz19d76arIipZRSSiml\nlFIu5fIH0aioKHbv3p37+549e4iKinJ1MZQT+do+1vpqfb2Nr9XZ1+rra3xt//pafX2Rr+1jra8X\n19fVg3CzsrJsMTExtpSUlNwBuBs3bvSaAbj562tITU31mUH03ryPfa2+BdVZ6+vd9S1qnX2tvmat\nc0mvSWatb0F19ub9q/XNo/dZeo42Y519rb75/wU45en2AgICApg0aRLdunXDarUyZMgQmjZtWuC6\n1/r1tbm4eEX2c843lqKu269fP5YuXcqRI0eoXbs2Y8aMYejQoeet5y319YZ97Gv1haLXWevr3fWF\n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\nrkJggg==\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "slice = 15\n",
+ "predicted = model.predict(X_test[:slice]).argmax(-1)\n",
+ "\n",
+ "plt.figure(figsize=(16,8))\n",
+ "for i in range(slice):\n",
+ " plt.subplot(1, slice, i+1)\n",
+ " plt.imshow(X_test_orig[i], interpolation='nearest')\n",
+ " plt.text(0, 0, predicted[i], color='black', \n",
+ " bbox=dict(facecolor='white', alpha=1))\n",
+ " plt.axis('off')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Adding more Dense Layers"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "model = Sequential()\n",
+ "model.add(Conv2D(nb_filters, (nb_conv, nb_conv),\n",
+ " padding='valid', input_shape=shape_ord))\n",
+ "model.add(Activation('relu'))\n",
+ "\n",
+ "model.add(Flatten())\n",
+ "model.add(Dense(128))\n",
+ "model.add(Activation('relu'))\n",
+ "\n",
+ "model.add(Dense(nb_classes))\n",
+ "model.add(Activation('softmax'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 11918 samples, validate on 10000 samples\n",
+ "Epoch 1/2\n",
+ "11918/11918 [==============================] - 2s - loss: 0.1922 - acc: 0.9503 - val_loss: 0.0864 - val_acc: 0.9721\n",
+ "Epoch 2/2\n",
+ "11918/11918 [==============================] - 1s - loss: 0.0902 - acc: 0.9705 - val_loss: 0.0898 - val_acc: 0.9676\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.compile(loss='categorical_crossentropy',\n",
+ " optimizer='sgd',\n",
+ " metrics=['accuracy'])\n",
+ "\n",
+ "model.fit(X_train, Y_train, batch_size=batch_size, \n",
+ " epochs=nb_epoch,verbose=1,\n",
+ " validation_data=(X_test, Y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test score: 0.0898462146357\n",
+ "Test accuracy: 0.9676\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Evaluating the model on the test data \n",
+ "score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
+ "print('Test score:', score)\n",
+ "print('Test accuracy:', accuracy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Adding Dropout"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "model = Sequential()\n",
+ "\n",
+ "model.add(Conv2D(nb_filters, (nb_conv, nb_conv),\n",
+ " padding='valid',\n",
+ " input_shape=shape_ord))\n",
+ "model.add(Activation('relu'))\n",
+ "\n",
+ "model.add(Flatten())\n",
+ "model.add(Dense(128))\n",
+ "model.add(Activation('relu'))\n",
+ "model.add(Dropout(0.5))\n",
+ "model.add(Dense(nb_classes))\n",
+ "model.add(Activation('softmax'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 27,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 11918 samples, validate on 10000 samples\n",
+ "Epoch 1/2\n",
+ "11918/11918 [==============================] - 1s - loss: 0.2394 - acc: 0.9330 - val_loss: 0.1882 - val_acc: 0.9355\n",
+ "Epoch 2/2\n",
+ "11918/11918 [==============================] - 1s - loss: 0.1038 - acc: 0.9654 - val_loss: 0.0900 - val_acc: 0.9679\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 27,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.compile(loss='categorical_crossentropy',\n",
+ " optimizer='sgd',\n",
+ " metrics=['accuracy'])\n",
+ "\n",
+ "model.fit(X_train, Y_train, batch_size=batch_size, \n",
+ " epochs=nb_epoch,verbose=1,\n",
+ " validation_data=(X_test, Y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test score: 0.0900323278204\n",
+ "Test accuracy: 0.9679\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Evaluating the model on the test data \n",
+ "score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
+ "print('Test score:', score)\n",
+ "print('Test accuracy:', accuracy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Adding more Convolution Layers"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "model = Sequential()\n",
+ "model.add(Conv2D(nb_filters, (nb_conv, nb_conv),\n",
+ " padding='valid', input_shape=shape_ord))\n",
+ "model.add(Activation('relu'))\n",
+ "model.add(Conv2D(nb_filters, (nb_conv, nb_conv)))\n",
+ "model.add(Activation('relu'))\n",
+ "model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))\n",
+ "model.add(Dropout(0.25))\n",
+ " \n",
+ "model.add(Flatten())\n",
+ "model.add(Dense(128))\n",
+ "model.add(Activation('relu'))\n",
+ "model.add(Dropout(0.5))\n",
+ "model.add(Dense(nb_classes))\n",
+ "model.add(Activation('softmax'))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 30,
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 11918 samples, validate on 10000 samples\n",
+ "Epoch 1/2\n",
+ "11918/11918 [==============================] - 2s - loss: 0.3680 - acc: 0.8722 - val_loss: 0.1699 - val_acc: 0.9457\n",
+ "Epoch 2/2\n",
+ "11918/11918 [==============================] - 2s - loss: 0.1380 - acc: 0.9508 - val_loss: 0.0600 - val_acc: 0.9793\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 30,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "model.compile(loss='categorical_crossentropy',\n",
+ " optimizer='sgd',\n",
+ " metrics=['accuracy'])\n",
+ "\n",
+ "model.fit(X_train, Y_train, batch_size=batch_size, \n",
+ " epochs=nb_epoch,verbose=1,\n",
+ " validation_data=(X_test, Y_test))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 31,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Test score: 0.0600312609494\n",
+ "Test accuracy: 0.9793\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Evaluating the model on the test data \n",
+ "score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
+ "print('Test score:', score)\n",
+ "print('Test accuracy:', accuracy)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Exercise\n",
+ "\n",
+ "The above code has been written as a function. \n",
+ "\n",
+ "Change some of the **hyperparameters** and see what happens. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "skip"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Function for constructing the convolution neural network\n",
+ "# Feel free to add parameters, if you want\n",
+ "\n",
+ "def build_model():\n",
+ " \"\"\"\"\"\"\n",
+ " model = Sequential()\n",
+ " model.add(Conv2D(nb_filters, (nb_conv, nb_conv), \n",
+ " padding='valid',\n",
+ " input_shape=shape_ord))\n",
+ " model.add(Activation('relu'))\n",
+ " model.add(Conv2D(nb_filters, (nb_conv, nb_conv)))\n",
+ " model.add(Activation('relu'))\n",
+ " model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool)))\n",
+ " model.add(Dropout(0.25))\n",
+ " \n",
+ " model.add(Flatten())\n",
+ " model.add(Dense(128))\n",
+ " model.add(Activation('relu'))\n",
+ " model.add(Dropout(0.5))\n",
+ " model.add(Dense(nb_classes))\n",
+ " model.add(Activation('softmax'))\n",
+ " \n",
+ " model.compile(loss='categorical_crossentropy',\n",
+ " optimizer='sgd',\n",
+ " metrics=['accuracy'])\n",
+ "\n",
+ " model.fit(X_train, Y_train, batch_size=batch_size, \n",
+ " epochs=nb_epoch,verbose=1,\n",
+ " validation_data=(X_test, Y_test))\n",
+ " \n",
+ "\n",
+ " #Evaluating the model on the test data \n",
+ " score, accuracy = model.evaluate(X_test, Y_test, verbose=0)\n",
+ " print('Test score:', score)\n",
+ " print('Test accuracy:', accuracy)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 11918 samples, validate on 10000 samples\n",
+ "Epoch 1/2\n",
+ "11918/11918 [==============================] - 2s - loss: 0.3752 - acc: 0.8672 - val_loss: 0.1512 - val_acc: 0.9505\n",
+ "Epoch 2/2\n",
+ "11918/11918 [==============================] - 2s - loss: 0.1384 - acc: 0.9528 - val_loss: 0.0672 - val_acc: 0.9775\n",
+ "Test score: 0.0671689324878\n",
+ "Test accuracy: 0.9775\n",
+ "5.98 s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Timing how long it takes to build the model and test it.\n",
+ "%timeit -n1 -r1 build_model()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Understanding Convolutional Layers Structure\n",
+ "\n",
+ "In this exercise we want to build a (_quite shallow_) network which contains two \n",
+ "[Convolution, Convolution, MaxPooling] stages, and two Dense layers.\n",
+ "\n",
+ "To test a different optimizer, we will use [AdaDelta](http://keras.io/optimizers/), which is a bit more complex than the simple Vanilla SGD with momentum."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "from keras.optimizers import Adadelta"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 36,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "input_shape = shape_ord\n",
+ "nb_classes = 10\n",
+ "\n",
+ "## [conv@32x3x3+relu]x2 --> MaxPool@2x2 --> DropOut@0.25 -->\n",
+ "## [conv@64x3x3+relu]x2 --> MaxPool@2x2 --> DropOut@0.25 -->\n",
+ "## Flatten--> FC@512+relu --> DropOut@0.5 --> FC@nb_classes+SoftMax\n",
+ "## NOTE: each couple of Conv filters must have `border_mode=\"same\"` and `\"valid\"`, respectively"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 40,
+ "metadata": {
+ "collapsed": true
+ },
+ "outputs": [],
+ "source": [
+ "# %load solutions/sol31.py"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Understanding layer shapes\n",
+ "\n",
+ "An important feature of Keras layers is that each of them has an `input_shape` attribute, which you can use to visualize the shape of the input tensor, and an `output_shape` attribute, for inspecting the shape of the output tensor.\n",
+ "\n",
+ "As we can see, the input shape of the first convolutional layer corresponds to the `input_shape` attribute (which must be specified by the user). \n",
+ "\n",
+ "In this case, it is a `28x28` image with three color channels. \n",
+ "\n",
+ "Since this convolutional layer has the `padding` set to `same`, its output width and height will remain the same, and the number of output channel will be equal to the number of filters learned by the layer, 16. \n",
+ "\n",
+ "The following convolutional layer, instead, have the default `padding`, and therefore reduce width and height by $(k-1)$, where $k$ is the size of the kernel. \n",
+ "\n",
+ "`MaxPooling` layers, instead, reduce width and height of the input tensor, but keep the same number of channels. \n",
+ "\n",
+ "`Activation` layers, of course, don't change the shape."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Layer 0 \t conv2d_12 \t\t (None, 28, 28, 1) \t (None, 28, 28, 32)\n",
+ "Layer 1 \t activation_21 \t\t (None, 28, 28, 32) \t (None, 28, 28, 32)\n",
+ "Layer 2 \t conv2d_13 \t\t (None, 28, 28, 32) \t (None, 26, 26, 32)\n",
+ "Layer 3 \t activation_22 \t\t (None, 26, 26, 32) \t (None, 26, 26, 32)\n",
+ "Layer 4 \t max_pooling2d_5 \t\t (None, 26, 26, 32) \t (None, 13, 13, 32)\n",
+ "Layer 5 \t dropout_6 \t\t (None, 13, 13, 32) \t (None, 13, 13, 32)\n",
+ "Layer 6 \t conv2d_14 \t\t (None, 13, 13, 32) \t (None, 13, 13, 64)\n",
+ "Layer 7 \t activation_23 \t\t (None, 13, 13, 64) \t (None, 13, 13, 64)\n",
+ "Layer 8 \t conv2d_15 \t\t (None, 13, 13, 64) \t (None, 11, 11, 64)\n",
+ "Layer 9 \t activation_24 \t\t (None, 11, 11, 64) \t (None, 11, 11, 64)\n",
+ "Layer 10 \t max_pooling2d_6 \t\t (None, 11, 11, 64) \t (None, 5, 5, 64)\n",
+ "Layer 11 \t dropout_7 \t\t (None, 5, 5, 64) \t (None, 5, 5, 64)\n",
+ "Layer 12 \t flatten_6 \t\t (None, 5, 5, 64) \t (None, 1600)\n",
+ "Layer 13 \t dense_10 \t\t (None, 1600) \t (None, 512)\n",
+ "Layer 14 \t activation_25 \t\t (None, 512) \t (None, 512)\n",
+ "Layer 15 \t dropout_8 \t\t (None, 512) \t (None, 512)\n",
+ "Layer 16 \t dense_11 \t\t (None, 512) \t (None, 10)\n",
+ "Layer 17 \t activation_26 \t\t (None, 10) \t (None, 10)\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i, layer in enumerate(model.layers):\n",
+ " print (\"Layer\", i, \"\\t\", layer.name, \"\\t\\t\", layer.input_shape, \"\\t\", layer.output_shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Understanding weights shape\n",
+ "\n",
+ "In the same way, we can visualize the shape of the weights learned by each layer. \n",
+ "\n",
+ "In particular, Keras lets you inspect weights by using the `get_weights` method of a layer object. \n",
+ "\n",
+ "This will return a list with two elements, the first one being the **weight tensor** and the second one being the **bias vector**.\n",
+ "\n",
+ "In particular:\n",
+ "\n",
+ "- **MaxPooling layer** don't have any weight tensor, since they don't have learnable parameters. \n",
+ "\n",
+ "\n",
+ "- **Convolutional layers**, instead, learn a $(n_o, n_i, k, k)$ weight tensor, where $k$ is the size of the kernel, $n_i$ is the number of channels of the input tensor, and $n_o$ is the number of filters to be learned. \n",
+ "\n",
+ "For each of the $n_o$ filters, a bias is also learned. \n",
+ "\n",
+ "\n",
+ "- **Dense layers** learn a $(n_i, n_o)$ weight tensor, where $n_o$ is the output size and $n_i$ is the input size of the layer. Each of the $n_o$ neurons also has a bias."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Layer 0 \t conv2d_12 \t\t (3, 3, 1, 32) \t (32,)\n",
+ "Layer 2 \t conv2d_13 \t\t (3, 3, 32, 32) \t (32,)\n",
+ "Layer 6 \t conv2d_14 \t\t (3, 3, 32, 64) \t (64,)\n",
+ "Layer 8 \t conv2d_15 \t\t (3, 3, 64, 64) \t (64,)\n",
+ "Layer 13 \t dense_10 \t\t (1600, 512) \t (512,)\n",
+ "Layer 16 \t dense_11 \t\t (512, 10) \t (10,)\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i, layer in enumerate(model.layers):\n",
+ " if len(layer.get_weights()) > 0:\n",
+ " W, b = layer.get_weights()\n",
+ " print(\"Layer\", i, \"\\t\", layer.name, \"\\t\\t\", W.shape, \"\\t\", b.shape)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "# Batch Normalisation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "_A little while ago, you might have read about batch normalization being the next coolest thing since ReLu’s. Things have since moved on, but it’s worth mentioning because it has been adopted in most networks today._\n",
+ "\n",
+ "> Central to BatchNorm is the _Covariate Shift_. Formally, covariate shift is defined as a change in the distribution of a function’s domain. Informally, it’s when your inputs change on you, and your algorithm can’t deal with it.\n",
+ ">\n",
+ "> IDEA (in short): Normalize the activations of the previous layer at each batch, i.e. applies a transformation that maintains the mean activation close to 0 and the activation standard deviation close to 1.\n",
+ "\n",
+ "\n",
+ "\n",
+ "**Suggested Readings**:\n",
+ "\n",
+ "* [Paper: Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift](https://arxiv.org/abs/1502.03167)\n",
+ "* [Alex Smola's Article on Covariate Shift](http://blog.smola.org/post/4110255196/real-simple-covariate-shift-correction)\n",
+ "* [Understanding the backward pass through Batch Normalization Layer](http://kratzert.github.io/2016/02/12/understanding-the-gradient-flow-through-the-batch-normalization-layer.html)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "## How to BatchNorm in Keras"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "```python\n",
+ "from keras.layers.normalization import BatchNormalization\n",
+ "\n",
+ "BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, \n",
+ " beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros',\n",
+ " moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None,\n",
+ " beta_constraint=None, gamma_constraint=None)\n",
+ "```\n",
+ "\n",
+ "#### Arguments\n",
+ "\n",
+ "\n",
+ "- axis: Integer, the axis that should be normalized\n",
+ " (typically the features axis).\n",
+ " For instance, after a
Conv2D
layer with\n",
+ " data_format=\"channels_first\"
,\n",
+ " set axis=1
in BatchNormalization
. \n",
+ "- momentum: Momentum for the moving average.
\n",
+ "- epsilon: Small float added to variance to avoid dividing by zero.
\n",
+ "- center: If True, add offset of
beta
to normalized tensor.\n",
+ " If False, beta
is ignored. \n",
+ "- scale: If True, multiply by
gamma
.\n",
+ " If False, gamma
is not used.\n",
+ " When the next layer is linear (also e.g. nn.relu
),\n",
+ " this can be disabled since the scaling\n",
+ " will be done by the next layer. \n",
+ "- beta_initializer: Initializer for the beta weight.
\n",
+ "- gamma_initializer: Initializer for the gamma weight.
\n",
+ "- moving_mean_initializer: Initializer for the moving mean.
\n",
+ "- moving_variance_initializer: Initializer for the moving variance.
\n",
+ "- beta_regularizer: Optional regularizer for the beta weight.
\n",
+ "- gamma_regularizer: Optional regularizer for the gamma weight.
\n",
+ "- beta_constraint: Optional constraint for the beta weight.
\n",
+ "- gamma_constraint: Optional constraint for the gamma weight.
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Excercise"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "collapsed": true,
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# Try to add a new BatchNormalization layer to the Model \n",
+ "# (after the Dropout layer) - before or after the ReLU Activation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Self-Normalising Neural Networks\n",
+ "\n",
+ "_(excerpt from [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515) paper's abstract)_\n",
+ "\n",
+ "> [...] We introduce self-normalizing neural networks (SNNs) to enable high-level abstract representations. While batch normalization requires explicit normalization, neuron activations of SNNs automatically converge towards zero mean and unit variance. The activation function of SNNs are \"scaled exponential linear units\" (SELUs), which induce self-normalizing properties."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Scaled Exponential Linear Unit \n",
+ "\n",
+ "```python \n",
+ "def selu(x):\n",
+ " with ops.name_scope('elu') as scope:\n",
+ " alpha = 1.6732632423543772848170429916717\n",
+ " scale = 1.0507009873554804934193349852946\n",
+ " return scale*tf.where(x>=0.0, x, alpha*tf.nn.elu(x))\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "- Keras supports `selu` activation since version `2.0.6`.\n",
+ "\n",
+ "- To implement _Self-Normalising Networks_ the Keras way, it is no different from:\n",
+ "\n",
+ "```python\n",
+ "\n",
+ "x = Dense(..., activation='selu')\n",
+ "...\n",
+ "x = Conv2D(..., activation='selu')\n",
+ "```"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "#### Further details and Suggested Readings:\n",
+ "\n",
+ "- [Keras SeLU activation](https://keras.io/activations/#selu) \n",
+ "- [Self-Normalising Network Original GitHub repo](https://github.com/bioinf-jku/SNNs)\n",
+ "- [Keras SeLU Tutorial](https://github.com/bigsnarfdude/SELU_Keras_Tutorial) for further experimentation on SELU using Keras"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "\n",
+ "## Addendum:\n",
+ "\n",
+ "* [CNN on CIFAR10](3.1 CNN on CIFAR10.ipynb)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python [default]",
+ "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.5.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/3.1 AutoEncoders and Embeddings.ipynb b/3.1 AutoEncoders and Embeddings.ipynb
deleted file mode 100644
index a14b895..0000000
--- a/3.1 AutoEncoders and Embeddings.ipynb
+++ /dev/null
@@ -1,2250 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Unsupervised learning"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### AutoEncoders "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "An autoencoder, is an artificial neural network used for learning efficient codings. \n",
- "\n",
- "The aim of an autoencoder is to learn a representation (encoding) for a set of data, typically for the purpose of dimensionality reduction. "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "collapsed": false
- },
- "source": [
- ""
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Unsupervised learning is a type of machine learning algorithm used to draw inferences from datasets consisting of input data without labeled responses. The most common unsupervised learning method is cluster analysis, which is used for exploratory data analysis to find hidden patterns or grouping in data."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": false,
- "scrolled": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Train on 60000 samples, validate on 10000 samples\n",
- "Epoch 1/50\n",
- "60000/60000 [==============================] - 20s - loss: 0.3832 - val_loss: 0.2730\n",
- "Epoch 2/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.2660 - val_loss: 0.2557\n",
- "Epoch 3/50\n",
- "60000/60000 [==============================] - 18s - loss: 0.2455 - val_loss: 0.2331\n",
- "Epoch 4/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.2254 - val_loss: 0.2152\n",
- "Epoch 5/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.2099 - val_loss: 0.2018\n",
- "Epoch 6/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1982 - val_loss: 0.1917\n",
- "Epoch 7/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1893 - val_loss: 0.1840\n",
- "Epoch 8/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1824 - val_loss: 0.1778\n",
- "Epoch 9/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1766 - val_loss: 0.1725\n",
- "Epoch 10/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1715 - val_loss: 0.1676\n",
- "Epoch 11/50\n",
- "60000/60000 [==============================] - 18s - loss: 0.1669 - val_loss: 0.1632\n",
- "Epoch 12/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1626 - val_loss: 0.1593\n",
- "Epoch 13/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1587 - val_loss: 0.1554\n",
- "Epoch 14/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1551 - val_loss: 0.1520\n",
- "Epoch 15/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1519 - val_loss: 0.1489\n",
- "Epoch 16/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1489 - val_loss: 0.1461\n",
- "Epoch 17/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1461 - val_loss: 0.1435\n",
- "Epoch 18/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1435 - val_loss: 0.1408\n",
- "Epoch 19/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1410 - val_loss: 0.1385\n",
- "Epoch 20/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1387 - val_loss: 0.1362\n",
- "Epoch 21/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1365 - val_loss: 0.1340\n",
- "Epoch 22/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1344 - val_loss: 0.1320\n",
- "Epoch 23/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1324 - val_loss: 0.1301\n",
- "Epoch 24/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1305 - val_loss: 0.1282\n",
- "Epoch 25/50\n",
- "60000/60000 [==============================] - 18s - loss: 0.1287 - val_loss: 0.1265\n",
- "Epoch 26/50\n",
- "60000/60000 [==============================] - 18s - loss: 0.1270 - val_loss: 0.1248\n",
- "Epoch 27/50\n",
- "60000/60000 [==============================] - 18s - loss: 0.1254 - val_loss: 0.1232\n",
- "Epoch 28/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1238 - val_loss: 0.1217\n",
- "Epoch 29/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1224 - val_loss: 0.1203\n",
- "Epoch 30/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1210 - val_loss: 0.1189\n",
- "Epoch 31/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1197 - val_loss: 0.1176\n",
- "Epoch 32/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1184 - val_loss: 0.1163\n",
- "Epoch 33/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1173 - val_loss: 0.1152\n",
- "Epoch 34/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1161 - val_loss: 0.1141\n",
- "Epoch 35/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1151 - val_loss: 0.1131\n",
- "Epoch 36/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1141 - val_loss: 0.1122\n",
- "Epoch 37/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1132 - val_loss: 0.1112\n",
- "Epoch 38/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1123 - val_loss: 0.1104\n",
- "Epoch 39/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1115 - val_loss: 0.1095\n",
- "Epoch 40/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1107 - val_loss: 0.1088\n",
- "Epoch 41/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1100 - val_loss: 0.1081\n",
- "Epoch 42/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1093 - val_loss: 0.1074\n",
- "Epoch 43/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1087 - val_loss: 0.1068\n",
- "Epoch 44/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1081 - val_loss: 0.1062\n",
- "Epoch 45/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1075 - val_loss: 0.1057\n",
- "Epoch 46/50\n",
- "60000/60000 [==============================] - 19s - loss: 0.1070 - val_loss: 0.1052\n",
- "Epoch 47/50\n",
- "60000/60000 [==============================] - 20s - loss: 0.1065 - val_loss: 0.1047\n",
- "Epoch 48/50\n",
- "60000/60000 [==============================] - 17s - loss: 0.1061 - val_loss: 0.1043\n",
- "Epoch 49/50\n",
- "60000/60000 [==============================] - 29s - loss: 0.1056 - val_loss: 0.1039\n",
- "Epoch 50/50\n",
- "60000/60000 [==============================] - 21s - loss: 0.1052 - val_loss: 0.1034\n"
- ]
- },
- {
- "data": {
- "text/plain": [
- ""
- ]
- },
- "execution_count": 4,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# based on: https://blog.keras.io/building-autoencoders-in-keras.html\n",
- "\n",
- "encoding_dim = 32 \n",
- "input_img = Input(shape=(784,))\n",
- "encoded = Dense(encoding_dim, activation='relu')(input_img)\n",
- "decoded = Dense(784, activation='sigmoid')(encoded)\n",
- "autoencoder = Model(input=input_img, output=decoded)\n",
- "encoder = Model(input=input_img, output=encoded)\n",
- "\n",
- "encoded_input = Input(shape=(encoding_dim,))\n",
- "decoder_layer = autoencoder.layers[-1]\n",
- "decoder = Model(input=encoded_input, output=decoder_layer(encoded_input))\n",
- "\n",
- "autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')\n",
- "\n",
- "(x_train, _), (x_test, _) = mnist.load_data()\n",
- "\n",
- "x_train = x_train.astype('float32') / 255.\n",
- "x_test = x_test.astype('float32') / 255.\n",
- "x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))\n",
- "x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))\n",
- "\n",
- "#note: x_train, x_train :) \n",
- "autoencoder.fit(x_train, x_train,\n",
- " nb_epoch=50,\n",
- " batch_size=256,\n",
- " shuffle=True,\n",
- " validation_data=(x_test, x_test))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Testing the Autoencoder "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false,
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABGoAAADmCAYAAACNimO2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvdd3W1l2PFzIOefIILWkTjP2+Nl/vx88y1625zetwEyA\nyDkDJPE96KutfSFSotQERYmn1rpLarVIgbi455xdu3aVbb1ew8DAwMDAwMDAwMDAwMDAwMDg28P+\nrV+AgYGBgYGBgYGBgYGBgYGBgcF7GKLGwMDAwMDAwMDAwMDAwMDA4JHAEDUGBgYGBgYGBgYGBgYG\nBgYGjwSGqDEwMDAwMDAwMDAwMDAwMDB4JDBEjYGBgYGBgYGBgYGBgYGBgcEjgfNT/9Nms5lIqG+I\n9Xptu4/vY+7jt4O5hz8GzH38/mHu4Y8Bcx+/f5h7+GPA3MfvH+Ye/hgw9/H7x2330ChqDAwMDAwM\nDAwMDAwMDAwMDB4JDFFjYGBgYGBgYGBgYGBgYGBg8EhgiBoDAwMDAwMDAwMDAwMDAwODRwJD1BgY\nGBgYGBgYGBgYGBgYGBg8EhiixsDAwMDAwMDAwMDAwMDAwOCRwBA1BgYGBgYGBgYGBgYGBgYGBo8E\nhqgxMDAwMDAwMDAwMDAwMDAweCRwfusXYPDjw+FwwOfzyWWz2eSy2+1wOp1wOBxwOp3weDxwu93w\neDyw2z/wiFdXV5jP55jP55jNZri8vMRqtcLl5SWWyyUWiwXm8zmWy+U3/EkNDAwMDAwMDAwMDAwM\nDP4cDFFjsHXY7XaEQiEkEgkkEgk4HA7Y7XbYbDa4XC54PB54vV54vV6Ew2GEw2GEQiE4nR8+nqvV\nCr1eD91uF71eD9PpFLPZDNPpFOPxGP1+H+v12hA1BgYGBgYGBgYGBgYGBt81DFFjsHU4HA4Eg0Gk\n02mUy2W4XC7Y7XbY7XZ4PB4Eg0EEAgGEQiGkUim53G63fI/5fI5qtYqLiwtcXFyg3+9jOBxiOByi\n0+lgvV5jPp9jNBp9w5/UwMDAwMDAwMDAwMDAwODPwRA1BlsBlTIejwfhcBilUgl7e3vY29uDy+US\nVY3H40EgEEAwGLQQNel02kLUzGYz+P1+BAIBBAIB9Ho99Pt99Pt9eL1erFYri7JmvV7j+vr6G74D\nBp+DHn+z2WwyGuf1emG327FcLuXimNvl5aW5r1uEzWaTX91uN9xuN1wuF1wuF5xOp5Cs19fXci0W\nC7l4f/gMGhgYGBgYGBh879Dno00Lh9vAsxAvh8Mh5ym73S61Ci/+9+afGzxdGKLGYCvw+/1CuGSz\nWZTLZblcLpfFn4ZjTxx9oo+NLvSoykkmk3A4HIhEIqKo8Xq9mM/nGAwG6HQ6uLq6wuXlpSkWHzk4\n+kYCIJ/Po1gsolAowOl0otPpoNvtotvtYjgcYjQaYTgcmk1rS9CHDofDgWg0ing8jng8bhlJ9Hg8\nWCwW4g3VarXQarXQbDYxGo2EULu6uvrWP5KBgYGBgYGBwZ8Gz0c8IzmdTvHYvA3r9VpqksvLS/j9\nfkQiEYTDYXg8HmlE6oYk/5uXOfM+bRiixmAr8Pl8yOVyeP78Ofb29qQALxaLcDgcnzQT3jQSBt77\n3AQCATgcDoRCIYzHY4zHY4xGI7hcLvT7fTQaDfh8PiwWC1kcDVHzeGGz2SxEXalUwl/+8hf8/vvv\n8Hg8OD09xdnZGU5PT9FoNLBerzGZTLBarb71S/9hwUOI0+lELBZDqVRCqVRCLpdDOp1GOp1GIBDA\nZDLBdDrFZDLB4eEh3r17JwcN/fwZGBgYGBgYGHzvsNlsUqu4XC5RHWv1/ybW67WlsRUKhaSBHQgE\nMJvNxG+TgSkMTZlOp7i+vjZn3icOQ9QY3BtIvgBAMBhELpfDixcv8MsvvyCXyyGbzSKbzd7KPmtS\nhYWelhpy9Al4PwrFYhEAarUaTk9P4fP5AADX19fGWPiRQxM1gUAAhUIBv/32G/793/8dPp8P//zn\nP+H3+3F9fY2rqytMJhO02+1v/bJ/WGjy1OVyIRqNolAo4NWrV9jb2xNFXCQSwWAwwHA4xGAwgNfr\nxWKxQLvdxmg0wnq9xuXl5bf+cZ4ENqXYgFVqve1/V8OQ4o8D+jPBX7VCVX82zD3789AjEMTmWWbz\nz74FNp/Zb/16DAweK/Szon+vCRqGoHBc/zZcX18LGWOz2RAOh5HJZLCzs4NoNCoN59FohMlkInUN\nz1Kr1Qqz2WyrP6/B44YhagzuBTabDdFoFJFIBJFIBPv7+/jpp59QLpeRyWQQiUTg9Xo/OiywCKcs\nkKwzSRaHwyEMttfrtUR3u91urNdrhEIhxGIxpNNp5PN5SYeaz+dGMviIwXvo9/sRDofh9/vhdrul\nqODnYT6fY7VaGYXUlsFukdvtljHEdDqNQqGATCaDcDgsY4u8bwAQi8WQSCSQSqUwnU7R7/dxeXmJ\n+Xz+jX+iHxc8MDqdTvj9fkSjUUSjUYRCIbRaLbTbbbTbbSwWi3v9d7V3EbuIev3mes4Ze4OHhS4g\nAoEAYrEYotEogsGgZXx0Op1KciL3WnO/7gY9/mC32xEOh+Xs43K5RFm4Wq3kPZ7NZrKH8fnYNuj9\nxhFj+o3ZbDbLOeuxEEkGBo8B2l9z86KPIi+/3y+/vw1XV1eijplOp0gkEsjlcsjn8wiFQhYFzWKx\nkP9ut9s4OTnByckJhsPhA74DBo8NhqgxuBfYbDZEIhHpuu/t7eHZs2col8tIp9Pw+/23EjU8NCwW\nC2GWx+OxpShg4UiPDBaUjP6Ox+PIZDKiuKBnjcHjhS74SdRos9rLy0vZuJbLpfgOGWwHJGpcLhe8\nXi8ikQhSqRSKxSIymQyCwaAQaS6XC36/X0akSNSMx2NcXl5iMpl86x/nhwaJa5/Ph2QyiXK5jJ2d\nHeRyObx+/Rpv3rzBaDS6d6IGeE8G0Pydsm5elGgbgvzbwOPxIBQKSdd2d3cXOzs7yGazltTEdruN\nTqcjsvr1ev2RL5zB7eB4qNPplOevXC7D5/NJQTaZTMRjrdvtCin2EEEHJGgY2uDz+RAIBOD3++Fw\nOOScpc3fDQwM3hM13N+4lrL24H+HQiF5nkjW3Ibr62tRyUynUwSDQSQSCSQSCfj9fmly6Gu1WqFa\nrcJms6Hf7+Ps7OwB3wGDxwZD1BjcC6ioKZfL+O233yy+NKlUSsy3bpLfrlYrzOdzjMdjdLtdMZG1\n2WxSjIRCIQAQFQ0PIC6XS4iadDqNbreLxWKBwWDwSSd2g28PKmp8Pp9FUaOJGipqlsul8TzZMjiK\nponRVCqFQqGAZDIpXlIk2FwuF3w+n4WoGQwGmEwm6PV63/rH+aFBoiYYDCKdTuOnn37C77//jp9+\n+glOpxOj0QjHx8db+bdJBsTjcazXaylKWRzy2TXF38PD7XYjFAohkUigXC7j999/x1//+lfs7+/j\n7du3ePPmDbxeL5xOJ66urjAejwHAkDRfAE1ou1wuJJNJ7O/v47fffkM4HMZgMMBgMEC/38fFxQUc\nDgdWq5UQIg81FqoNT71eL0KhEKLRKJxOJ2w2myh+bhrTMjB4qnC5XAgEAojH40gkEkgmk0ilUkgm\nk4jFYojH44jFYhay5i5EDS+Px4NgMIhgMAiPx2MZUdWJmYeHh+j1elvbxw2+HxiixuCrwQML1S2x\nWAzZbBa7u7solUpIJpPibM6IOZIyZJd5yJ9OpxiPxzK2tEnURCIRLBYLMRWm8kIrAAKBAEKhEHw+\nn0h8DR4vtDJDK2oA4PLyErPZDKPRCL1eD+PxGIvFwnTq7xnaX8Hr9UrSE8cIE4mEPFMaJEFJ2nDc\nwuPxyLNpsD3wMBmNRpFIJMScMJfLIR6PS+f8vmGz2YSoSSaTsNvtFuPDfr+Pfr9v/MEeEPoZJnFX\nLpfx7Nkz8ZYqlUpYLBZCoNlsNsznc3Q6HSHGDW6Hfo951uH18uVLCU0IBALodrtyBhmNRvB4PACw\ndeWKLvicTifC4bCMokciERmPBN6TrfR90yNZhqh5j833knsbx+559lwsFnKOpXrRvIePE3pckQ0p\nNpz0r5FIBIlEQhIvqX6Jx+MWe4dgMCj+NHf1qJnNZhKa4vV65ax0U8R3v98XFbPB04Yhagy+Gna7\nXTYvv9+PeDyOZDKJdDqNRCKBYDAIl8slqhlGzTUaDdRqNdRqNfR6PcsixrGn0WhkGX2KxWJYLpdy\nAKH6gow0F1+XyyVqG0PUPG5setT4fD44nU4ZpxiPx+h0OqjX6xiPx5jNZkZVc8/ggdPhcCAYDCKb\nzWJnZwc7OzvY3d1FPB6H02m2iccGt9stXb94PC7dOe1LsQ2QqAmHw0gmk/D5fBLFPpvNUKlUcH19\njdFoZJ7VB4Aeb3E4HGIA/uLFCzx//lySRex2OyKRCAqFgqhper0eKpWK7J9mBOZ28D1yOBwIBAIo\nFovY39/H3t4eSqUSisWiBCVQCcqibL1eYz6fy2jgNkkxvkav14tcLidreSQSQSgUQjAYlHPUYrGQ\nhti2X9f3Bu1D5Pf7LcW69ujq9Xq4uLhAtVqVsTajTnuc0Cq4QCBgITE53qRHnDj+RPVLMBi0jDrR\nM/NzDRGSfaxV+Dp0nWJqFYNPwZzADb4aLLS56MViMSSTSWQyGcTjcemuU+5LJc3FxQVev36N169f\no16vi78BDzP8FYCMWyQSCbhcLkQiEeRyOXkNVM5Q4ut2u+F0Ok1H/zuAVtSEQiFR1KzXayyXS1HT\nNJtNIfnMYfJ+oQ8OJGqeP3+OV69eoVAoIBaLGaLmEYI+MZRi07uLxcU2oRU14XBY/k2at49GI9Rq\nta2+BoMP0H4pJGpevnyJ/f19xONxIWrC4bB4Ss1mM5yfn8Pn8xlFzR2gzxgkan777Tf87W9/QywW\nk4JPj+uOx2M4nU5cX1/LuYbK4m2+RhI12WwWr169wl//+ldEo1ExPR2NRqKm8vv94pljisUP0MSc\n3+9HKpXCzs4OisWiFOt+vx+VSgV2ux3D4VDGfQ1J8/iwGZQQjUYlhTabzSKdTiOTySCTycDv91sM\nhLXihgb+vPgZ+Rw4bsh6Rat7DAw+hwc7gevoV/1B/VxkILs8uttz268GDwutiOD8M/0qIpGI/L3L\ny0tMp1OZ3T4/P8ebN2/w3//936hUKqK2oQSXHVo9Yz0ej1EoFNDv9zGbzUSKau7994VNSTH9h/S4\nBseexuMx+v0+Op3ON37VPw70OqwVcR6PB4lEAoVCAfv7+3j16pUUH58javShlgcYdhw3I4EfIjr6\nKYDE2kMravhv87lNJBKyFq9WK/T7fVSr1a2MXRl8DE20ejweKUBoIsx7Y7PZpBMci8VwcXEhY8mb\ncd4GH8D3RI+/xONxFItFvHr1Cn/729+kq26324Wcod/E1dUVVquVJclyW6Bnn9vtRjgcFtL9r3/9\nq5B0DocDnU4HZ2dnCIVCcLvdWCwWN/oHPjXomkSrZvS++OzZM4vKIhAIoNfr4fT0FHa7/aNaxeDx\ngOcSn88n6+Te3h52d3dRKBRQLBZRLBbh9Xo/8tT8mmdj86yzWe9+jrQ1Rt+fx+b90b9qvmHzInh/\neC9uO6d+63vwYEQNfUR0rBmNmABIZOHmm6XHYmgoyg1Qx4J+6zfyKWIzJYZyPm0oyTnoarWKSqWC\narWKg4MDnJ+fo9/vYz6fyz3cnJPWCRb5fP4jzwzOd5II6vf7aLVaGAwGJpr7kYLFPNVRyWRSJNqh\nUAjX19fodrtoNBpyHw3uD3a7XQ6Y9HTioZOH0Vwuh0gkYolL/xS0X0oqlRLlk8vlkphaPfpIrwyD\nL4O+D1wbKcfnmOlDYLVayZiqHkFlfClT+RwOhyHmtgySrXyGOeLCrjC7vptnqVarJalg+sxl8AEk\nX+x2u6xtqVRKUi0TiQTcbjcuLy8xHo8lUvfs7AxnZ2c4PT3FyckJ2u22pKFtEx6PR3xzcrkcCoUC\nEokEAoEArq+vxeutVqvh7OwM7XYbk8kE8/n8yY8+ORwOS21CP59YLIZ0Oo1SqYRSqYR8Pi9jLz6f\nD81mE4FAQJ414/PzeEEiUytCC4UCyuWy1BWsKbTS5WtIGl2b6iSnL6lV2+02hsPhVpIbfxTo5uCm\nB5H2D9INSZ5LgPdkGX1SJ5OJEOq89H38lngwosbpdCIYDMoCyJnPRCIBAHKY5weZh4d+v49er4de\nr4fJZGL5wPMDbBbHb4PNbt4mUcOirN/vo1KpSGxsrVZDvV4XdQwJuk2SjgePbDaLcrksRpnBYFCI\nIZvNhqurKwtRMxwOMZ/PzWfiEYKFBeOfk8kk8vk8dnZ2cHV1heVyiW63i2azicFgYDapewa9aJhk\nwAQDxtuXy2Vks1lEIhHpKN6FqPH7/XI/r66uxJxYF4eTyQTj8Vg2P4MvBztCLM5pdviQpoOaqOFc\nv04B0+OnpiO4XWiiJhaLIRqNismlHoWjTwrPU7oI4PnJ3KcP2FQJRqNRlEol7O3tYX9/H7u7u0LU\nzGYzDAYDdLtdaUQdHBxIaku3231QoqZYLGJnZ0eImmAwKGPE1WoVp6enqFQqQtToz8BTBb1oSHTl\n83kUCgXk83lkMhkkk0kkk0nE43EZf2GzKRAIyJoH4EkTXo8ZuqmsiZqdnR0RDnDfukl98SXQwSkc\ne6Tp/l2fM5Lpxpj/ZuhxNtafVA2yvqCJuvYZ0krvq6srtNtttNttdDod8UidTCaYzWZYLBYPmtR3\nGx5UUcP8+Gw2K1KzQqEAAOJTwvEXFu40nqVsjYyXJmnMB/nb4KYHhZJ33hcSKOfn53j9+jX+/ve/\nYzAYCIvJA8xNEZE8eBQKBezu7iKXy1mYb3a8qKjp9XpGUfPI4XA44PF4xNcolUoJUUMljVbUGKLm\nfkFFDZNhOJ/NiwfSaDR658MKiZpoNIrlcinS8UAggNFoJJfD4cDV1ZVRSf0JaKJmU1HzEEQNjeFn\nsxmGwyFisRiur6/lfpMg4IGJX/OUi8BtQn8W4vG4RVFDktVms8k4aa/XQ71el4aGTtIz98gKnQ5D\nouaXX37BTz/9JIEJVNQMBgPUajUcHx/jzZs3+OOPP/DmzRvLKPe2oceynj17JgrkQCCAwWCAXq+H\nk5MTvHv3Dufn52i32xiPx0ZRhQ9ETTweRy6Xw/Pnz/HTTz9ZDLm5vul9MRwOi6LG4XDg+vra+I48\nUmhFDZtVVNRsesb82TFANqp1g4q/3rUu0Wu0wc2gSTMVpBz99Pv9yGQycq7liHgsFpOELhIw5+fn\nOD8/R6VSQafTQa/Xs5xdvjVJAzwgUaPZfhbdvACI1IhzebzC4bDITinV5d/V2fTbfjP1HBuLDV7c\niPnanwq4GDFWu1qtWjrxjC1st9s4PDxEtVpFp9PBdDoVVdSn3i/OWqfTaYuaRit3uKDqeXASfQaP\nDyT2fD6fHH5ozNftdjGZTNBqtdBsNs0mtQU4nU5Jf3n58iWSyaQlepKJal/iMeJ2u6VDRcVOLBZD\nKpWSBLfRaIRms4mLiwsA79dTPb5q8Glo/wl2cqmECgaDAIDJZIJ+v4/BYCBKxW1Az4Hr55lKDu3Z\nYdbh7YD3wOVyIRQKIZ1OY2dnx6KG0wUjR596vR5qtRqazaalW/uUi/SboGOZ6WnBJmM2m5WUQrvd\njtlsJr4vJycnqNVqspdtGxwxdDgcCIfDSKVSKJVK2NnZQSwWg81mw2g0QqfTQaPRwMXFBS4uLuQc\ntk1z48cO7dXm8/mQSCSE5Nrd3UWpVEI2m0UikYDH45FzrUYgEJCv49o7HA4xHA4/Uogb3A+0/wjV\nExxr2Rw54qTGJlGqv55nHdYQen9jY4Lfi2cWfXbRv/L3jG2fzWZSB00mE0yn0zuTtp1OB7VaDePx\n+H7fwO8MvEf0ROW99nq9ktIVDoclhYtEDdXGbGAw3Ut7m15eXsJut4vKqt/vy/NLck1zDLx4f6fT\nqTQet/mMPxhR4/V6kUwmsbOzg5cvX0qUcyKRkI6PJmm4uMXjcWSzWYxGI8xmM4vfgWYpt33Y1wsA\nYw15zWYzGbV5SpseR454/zwej4yuOJ1Okf0Nh0Ocn5+j0WjIPbzLrCYPoUySYnKBibT7fsHCjlJT\nHXG4Wq0wGo3QarVMN2FL0BG+r169QjQatRBmXq/3i1Oe2NGnYSnXQxpCc42uVCpwOp2yjmqi2+DT\n4GGC9yqRSMioi9/vF8kuzbcnk8nWuvibKXuadN0cfbopMMDgz0F39F0uF6LRKHK5nKgoIpHIR35F\nm0QN19fVamWKyBuwmUioiVGeQ/geT6dTtFotnJ6e4vT0FO12G9Pp9EFeI59BNkIzmQyKxSJKpZJ4\nprTbbTQaDdTrddRqNYv/21O+9zotLRAISLLTzz//LEpTpundliTq8/mQSqWwv7+P1WqFi4sL1Go1\nSwP3IdRUTwmb6WYcV4tGo1gsFnL+0N4js9kMwMcNd1136vQz7luscUiycPKDyW6bl06t1Zf+f3et\nEcfjMer1Okaj0TbfzkcPqvCZdEnvqGg0ahnd59mDyV6BQED8GGmk7/P5LOdbhtYEAgEkk0n5rJBg\n00SNHuNnGi0TabdtOvygippEIiFEDbPqQ6GQZZZ902mZcYea1eSv4/FYOrbbPuyToCFBRHNcAOj3\n+8K8PsQs8mMBF7HVaoXJZILlcimdJZvNJu/HfD6XxCftSfO5DzU79alUCtlsFrFYzBA13zk2FTWa\nqLm8vBSixnjUbAdU1JRKJfz888/w+/2WuEkW4F8CKt98Pp/FGHy1WknXYTqdIhAICBk3Ho/lIGRG\noT4P3fXhAYWHFL/fL94j1WpVvCe20TTQnUgqfPShSCtqOOpm1un7B+8D1VUkanK5HKLR6J2ImtFo\n9KTOK18CEjU+n09U3SwIYrGYrJU2m02ImpOTE5ycnGA0Gj0IUQN8SKOiv0omk0GpVEK5XLaQtyRp\nqKZiMfuUQaKGo9iaqNG+FkxGu42oSafTePbsGYD355vFYiFJlSYF6v6h9x+/349EIiFhI5PJRBQR\ng8FA6hB6w/DS6hcaafPP+P1pqzAajWR/1aSNVguPRiPLiBNtPDaVPV9CjPP8RJLpqYJEjR5NzOfz\nyOVySKfTSKVSSKfTMu7Liz5Sm+fbTaVpMBiUEAx9zxaLheWe6s/VxcUFHA6HWHtse3z4wYgaHirI\navEwB3wcs60jvHW3FrDGdfOBoSxJkzxfYgZ1kz/Ker22fD1v3Hw+x2g0gtvtxvX1tXQlrq6untwD\nxdEn+lLQOLhWq4nKRi+Gd1HS6GKRRQlNp/WmqZlx7dKtR6rM5vj44HQ6xc8kFotZ0moWi4XItDud\nDsbjsSkk7gHcsBg1mk6nxSdMy0C/5HnRX0NJKs29gQ+jGdpE7/r6Wsj15XKJVquFq6srjMdj86ze\nAC3x9ng8MgaayWSQyWQQi8UQCARgt9tlxPTs7AytVmurKlN9cNJKLJKuuog1JM39Y7OjHIlEJJmG\na+om2Xp9fY3ZbIZ+v49GoyH+JGZ9tYKfWb63oVBIOvb0/yEhvVgsMB6P0el00Gw2hQSh4nubr4+v\nUXeY8/m8jGYlEgk5r7ZaLbnn9GDYTNh8imDSUyAQQDweRyqVQi6XQ6lUgt/vh8vlsvgu3vReeb1e\nJBIJrFYrOfOywGORPZ/PLQky5mz6deBeQj803jcSk+VyWXwqqSabzWYWk+fVaiVjK/1+H+12G/V6\n3VKraKXVarVCp9ORZ0crhEejkRTuw+HQQtow+VITQLRkMPf+Y+izjh5Jczgcomjk+adYLKJcLqNY\nLApJk06nReXI88dtITXAh7QorgGb94XPslbU9Pt9uTweD2azmUzVaAHJNu7vgxE13DAODw9FasiL\nUc78IVlY8CJDpv9Muzuzc8eH7fr6Wv4/D4y3Qb+p+sG6vr62fFj4kK9WKwQCAekSswBZLpdPWqJG\nskof/DYXqs/N6tpsNokMDofDKJVKSKfTlqhgLrpUWpEc4kWjYi1HM3g88Hq9YnhYLpelOzmfz2UD\nHAwGGI1GZizmnuD3+z+Klo3H4xbjPBLTd4HuEurNkEaK3AT5e871J5NJPHv2TFQAb9++FWm+eVY/\nBruGHG9hfPr+/j52dnYQiURwfX2N4XCIVquF8/NzHB4eol6vYzgcbk1yz9lwji4/ZDS4wQdVIokE\n7pf0l2LaE/DhfMOm0nA4RLvdRr/fx3Q6Neurgi4SNEmTyWQQj8clFeby8tIy+n50dIRGoyHhCNv0\nKqTSh6aoJBZKpRJ++uknlEolBINBSfkaDAZoNpvodruyp+qwjqcMj8eDaDQqJGcmkxF/J002fwoM\nSUmlUvJ3g8EgMpkMut2upH4NBgMp7ieTiey5Zt+7G7SKPhKJiKKCv/KqVqu4vLzEcDj8qFFAZY3N\nZkO9Xse7d+8AAI1GQ8jV5XJpqT+vr6+lruj3+5YxJ+0/Q68SJgXp9OJNssDgY+izDsUZVLRRPUzP\nGZ5lk8mkeM+QB+Bky+bomfaXoQI8FAohEAhYGv3cWxnTzrMs1VvkJ+bzObrdrnwmNEm3jXPXgxE1\ns9kMzWYTh4eHWC6Xlrgs7VdwfX0t3TlKOnmR2OHcGeXgfr9fiB4y13yz7xIvq+VwWrqviSEAQjiE\nQiFhyjl7OBqNnvxhlUlP/KDyfdVF3adAooZd43K5LN407HBw82SKxSbTyQfHEDWPEzcRNS6XSzY9\ndil4qDQd3z+PQCCAQqEgSRb7+/tC1GiS5ksVNXq+W8uGWShyk2P3N5VKweVyiULu+voa7XZ7iz/5\n9w0qV2hmWigU8OLFC/z222/SYVqv1x8RNZTobqMIZ8oQjUsfMnHK4D20ookETTgcRiQSka7iprx7\nk6jp9Xoizzd4D65TuliIx+PIZDIWQpJddnrSHB4eotFoiEJpm11zqhe9Xi+CwSDy+TxevHiBX375\nRVL8gsGg3G8SNZtx7Kaz/16ZoVNFM5kMwuGwxWPrLkQNU0hpqJ7NZvH8+XMxbq5Wq6jX62g2m6Ly\n2LanxY8GrbaIRCIol8v4+eefsbu7K0mViUQCADAcDlGv1y3kDgt4WjXQbmM4HOLw8NDiJcNxOI/H\nAwCiAuaQM2ZiAAAgAElEQVTzvWnBwbpT//mmisOQNJ8Gz418hqiS0YqZVCqFWCxmsU2hqTDvFWt4\nCid43zRp4/f7kc1mRU3DdOLpdCqEjFbc0AeMJI3X68VqtbI0lKkO35Y34IMqaprNJtbrNfr9vqUT\nRAkpf0iSMcFg0HIQ4RgMb6q+STqJabVaiVu/1+v9ZFyeJhNINHCEhv8Go/f4oJE55b83Go3Qbre/\n2NvhRwOLNb25fcniRFMnzgqzy0GiRsfn6YjYTUUNiTazMD4+kKihXJVGfVpRQ6LGJALdD/x+P/L5\nPH755Rf89ttv0iGmpPtrFTX6YMJ7xRlgEjQ6ppky8fV6jUwmg3a7jbdv35rxmFugjbdZULx48QL/\n8i//AgBClA2HQzSbTVQqFRwdHVnuyTagiRpdwJr19mFAokarT9lZ1OOHukC4iajh3zF4D03UUFGT\nSCSEqKGiZrVaodvt4uTkBP/4xz9wdnYmRM22Rp4IEjU0Oc7n83j58iX+7d/+DdlsVhqcPB9x1K3T\n6RiV6gZowJzP57Gzs/ORogb4fEwzG8Ls/GezWSncj4+PcXh4iEAgAJfLJWO+vV7PEGVfgM2UJxI1\nv//+O169emWpEafTKer1ulgkaLCuAyAkZrVahdvtlkbhbDYT0o0qDR2OcJOPKnHb7w0+D33WiUaj\nyOfzKJfL2NnZsainuMdR5QJ8eEY1eTadTjEYDETRphO4wuEwnE6nNLpI1AwGA7nnPp/PEppAkYAe\nk6I6juT3ZDLZWuPxwZgFvnm9Xk8MmqiU4abCMSL62OiUC+2+z0s7OdPYlmMvOvb3c0QN33gtmVqt\nVsLiZTIZIXy4YLCjrE2jzMP5Hl/yPvABpcEsN83nz5+jXC4jkUjIQ6NVT2TNa7UaTk5O0Gw2xZfB\nbIKPB3qDtdvtluc4HA7LM7Xpwm+6fn8OWg1Ih3ztsaBJ5bt092gKrhMVuPFpWSkPrZtu+1yHuamy\n2E8mkygWi5hMJvL9TUrGe5DUzGQylkLC6/ViMBiIl9PR0RGq1Sp6vZ4oGu+TqNa+GFynORbCfZgF\nrMH24XK5LL4a/ExsKgDYeOJ4sB59Mevqx/B4PGIWzCSf3d1dOYd4PB4Jseh2u2g2m7i4uBC/n4cg\nQEjSBYNBi29OIBAQI1sanVLRwddozKMh5xC73S7kSi6XQ6FQQDweh9/vF5N77Smjx1f03qpVG9qf\njemKmUxG1BaTyQSdTkf8UwBYin4DK/h+Op1OOb9Eo1G8ePEC5XIZqVRK1GP0ibm4uBA/Jtog6M88\n32vWbgAsagt6ywAfEoHYvNc1nrlnfw42m80yVcN7SzFGLpdDNptFLpcTtZQmPBlgo5uEJEHZtGfD\ndzgcWpK44vG4JEj5/X40Gg25gsEgcrkcLi8vZbScz7xOcGOKNUep1us1JpMJGo2GZYLkvj4nD0bU\nkEhZr9dYLBYWd2YeKOhRs+lNw/hBHQOqL45PaZlTMBiUOTd2dG+CXoQ1YbRarfDixQu8ePFCzPno\nV0PCgJsiVTxPfeb3a+BwOOD3+8UUjzLUn376CblcTmLXdDF/dXUlpsWHh4cyI04VhpEaPi7ouU8+\nr+yA6IX2Sz2NDG4GC2qOi24e6DcVgsDnDx4s9jiXy/Eajtiwk+HxeISEi0ajSCaTSKVSFt8MAGKE\nmU6nUS6XxeRytVoZoub/BxVIpVIJe3t7yGazCIVCcDqdmEwmuLi4wNHREQ4PD3F+fi5qwm08N5tJ\nG+FwWD5XHo9HRkIMtg+OWySTSfFwo/Rbg2cuGt6ORiMsFguzpt4CPm80Jt3d3cXu7i52dnaEjFwu\nl0KS0kC41+tJ0bBt6PS3eDyOSCQi6YlMoKLCu1qtymXM+d9DG99TMZXNZpHP5yV2naP1LO5YpPOM\nwjPMTQp6kjQkguhdw3G5arUqqjfWEQYfQ5NfLpfLosJ+9uyZEDVer1fOIaPRCCcnJ6hWq2g2m/Jc\n3vSZZ6MdwEcKVNaCVBlvKvTN+vnnYbPZEA6HxVsonU7LSHwikRADd3qDBYNBeL1eAO+VUazTNQHT\narVQq9WEmGYzkfU8n+FMJiNEdygUQrVaxcnJCU5PTyXinSSh9sQFPgg7PB4PkskkfD4fIpEIJpMJ\nWq0WfD6fnGHv8xz2YEQNPUU4O0ZWm+oUzUDp/6cvzg7z0rNqVFlwDlfPbd+FqCFZxBQpbRxcLBYR\nCAQAwKKm4QeGclJD1Hw5mAIUi8XE0ZtEDbtYlDHqcYvBYPARUTMej83G98jA8Rcd40u5figUEhUF\nFzd9AWZT/FqwY8BEEBI1NBv9UkWNTnSjlJ5mmvogy650PB6XjgMl5vrf1AfZcrks8excvw2shePe\n3p54KGii5o8//sDBwQFarRb6/f5WDpRaAnyTokaPpPLvG2wPVK0xwS0cDkuhrkE/jMFgIB4l9AE0\n+Bjsku7u7uLly5coFosoFosolUpizjufz4WwZmEwnU7FsHLb0EbH8Xgc4XBYiBoAkv5WqVTkqlar\novh5ymNPt422kaihjYJObxqPx+J5SLUiw0p8Pp+lttA+Kuv1GqFQSFTEq9UK1WrVMiZKmwBzxrkd\nmqjZ29vDr7/+inK5jEKhgGQyCY/Hg3a7LZ/509NTC1HD+7YJkjGbyibWobf9P4P7AYmaQqGAly9f\nolAoIJPJCGGjldg6Xpv3k2lbOj67Uqng8PAQh4eHqNVqllEorXIZjUZiEh+LxVCpVHBwcIDXr18j\nlUqJBQeFIVwzAMjeSeEIE1RbrRZOTk7g9XplRO4+z0EPRtRo1crXgt4HZLm0dIqSVHaNdDF4V0UN\nF2c+2IPBQKT4JHMAiJJmOByi1+thOBwayf5Xgh2icDgsrt40B4tEIrL58bPD8bZOp4NGoyFGbTQR\nNovp4wI3WpofUm7o8/lESg5AuhZm5OnrsBnbGgqFZBNhjCHNRt1u90eRo5umd3oU7erqCq1WCxcX\nF3IQ0qknuluhO1yTyQRerxexWAzL5dLin8EZ4Ww2i2fPnskzPpvNYLfbZYN9SmMamhChdD6VSsmM\ndjQaFQUq56FZiI1GI0yn060U4ZzN1koakn58PRyNozJWP8dP5f49FHRzI5FIiKmiBke5R6OR+Bd1\nOp2tfUZ+BPB9pRKQnd1IJGIZj9DxvDxv8vN+X9CHfD1qE4/HkU6nkc/npVgNhUJwu90SOVytVnF4\neIhKpYJWq4XBYID5fH5vr+17Bo1iOYIdCoUQjUYRDofl77ApwdFSjoyRqEmlUmKxoGO86ctGsoYq\nUo/Hg+FwiEwmg3w+j0ajYRnL2JYK8nuDHh1jU4DJXEw329/fRzablTE17oXNZhNHR0eWzzzXupvq\nMn3O+ZL/Z/Dl4H2l2IL1QDabFYUUz6jJZBLRaFSIGZfLJWdL+sG2Wi00m020Wi2L0XO1WsXR0RGO\njo5Qr9cttb2G3++X8xLJ2F6vJ2bftAogcc/zMglappvSI3e5XMoIOMch72JE/iX4rtxvtYnler2W\nB5ELKDseVO/QKOiuHjUkguiPsxl3SRXNcDi0dFSMrPTroY0RKePlg6HnfinjZuQhXfR11Kh5/x8f\nOIbDefBwOCydKHaVeAjadmLGjwwebnjASafT2Nvbw/Pnz7GzsyMJW0yFuYm81klOJEUnkwmm06ll\nEyQxwGJFJz+RfGPRHo/Hkc/nMZ/P5bnmOhuNRlEsFi2jcTabDc1mUw6y4/HY8vp+ZNhsNuniMJmA\nXSaOgAKQcRadkDabzbbWLXe73YhEIkilUshms8hms6Ls4V7LuMrhcChFzH0XrwbvQUIhEokgFovJ\nnqm781SAdDodnJ2d4d27d7i4uMBgMDANpTtCrzc8d9LzhyrCbe1XmninMjISiYhfFY02C4WCqMaZ\nrHpwcID/9//+Hy4uLtDr9cz9VuD5nrYIbFxoL5LVaoXz83OcnJzg5OQE3W7XUvAzlZSm/PTX4DgU\nSRvucwAQDodRLBYlNrparaJSqYjdAr//j77HfQraNJiEKX1+dnd3USwWJVzE6/VivV5jNpuh1+vh\n4uICx8fHqNfrkmhnIui/PfQ6xrF43lftAZbJZGQ0n+dA1vY6YKTdbovvVr1el9Gm2Wwm46jkBW4j\nP/kZ0wQriRW9Z/I1+P1+SSzl17IBfZNH1TbwXRE1AD4y6mFBoYsM/j+OMt01npvkjM/nQywWE6KG\nhyCyelTSkKh5SDO5Hw2cGSZRQ2KMBR0AeWBoRs3xi1arhU6ng8FgYHF0N3g84ALNmVA+X06n00K8\n8uD71A8rXwsSNVqSub+/j7/85S8oFAoy80tXexKhgFVVQ1XhYrEQx/xut4uzszMcHBzg8PAQ1WpV\nSHEeiLiGulwuSfCaz+fIZrMYDAaWKGC+1mg0KnGb3CzX6zXcbjcajYYYMOrX+CPDbrdLFHcsFrMQ\nNUzLYoOCRA0jIrc51uByuSSJYW9vD7lcDuFwWMbVmL5HokbPhJvn+f7BYpM+UDzcElxXF4sFOp0O\nzs/P8e7dO9RqNQyHQ1O43wGbSsNNomabqjFdsNpsNoRCIWQyGVEVkKgpl8tS+DidTsxmMzQaDRwc\nHOAf//iHrBGmWP0APfa0SdRcXl7K2lqpVPDPf/4T//jHP9BoNOTr7Xa7mJzyyufzWK/X0nQkQaPD\nRzjmsV6vZaxiuVyi0+lYwkie8rOpgyf8fj+SySTy+TxKpRJ2d3dlPIaGz5qoqdVqODo6skQmm/H5\nxwHeV4Yj8Jl59uyZEDWxWExsLmi2zWs4HKLRaKDZbKJareLs7Aynp6dCdJJgZWNxMpl8kkDfHOWm\ngtlms2GxWKDb7QKABBul02mLBYtWzn1qWuc+8V0RNXpDZCf+NnxN0c5xKZ/Ph0QiIfO/mqhhjBcV\nNY1GwxAFXwjNPjIKjxLUYDAomx0XYxaQk8kE3W4XtVoN9XrdQtQYPE5oRY0marjAbY5NmMLu66Dl\nwuwA7Ozs4Ndff0U6nRZTdm4yhB53ok/XfD4XA9J6vY56vS6mtezMb3oJES6XC7PZTGb76Y0xnU7l\ngMVNkr45elaf349+NSRvnoLSiocZds5J0qRSKcRiMRn75PtLRY1WHW0DbrdbiJr9/X3pfjkcDksU\nplbUbBayBn8eemyQJoYkarSihhdVTufn5zg4OJCRRFO4fxo3eTxpfzw9kqlJlc2v+dLP/WZqEK9w\nOIxMJoO9vT3s7e0JUVMqlURFabfbMZvN0Gq1cHR0hNevX//Zt+GHA/dIjmGTMGFnnEkyfGZev36N\nv//976hWqxYz9Vwuh1arJQ3a9Xotxv3stAOwjD/QOJVKkfl8jlarhePjY1H/P2WSBrAW0IFAAMlk\nEqVSSVTB+Xwe6XQaNptNCFNdE5yenkqwi/EMfRzQhAa9CguFAp49eyZrWbFYRDAYlK/hs8CmYb/f\nR71ex+npKU5OTkTZfXp6ajmH3nW91a9J+99os3ia7mezWczn8498+Pg6+eu2fYy+K6JmG9BMWTAY\nRCaTwf7+viwO8XgcLpcLy+VSmNvz83NcXFyg3++LiZw5kN4dJGU4e7q7uysPrS4CtFlzr9fDycmJ\ndPUrlYqkxBg8XvDgQjKOCjV2sBizXqlUUKvVMBgMzD39CuhDvjZN5KUVNBq6IzEcDtFsNmX+t9vt\nypw+Rw0nk8knC3Dt9cVRRcqS5/O5xN+StOHmFwqFkMvlcH19LZ0NKnp0x/FHXmM5+hSNRpHNZpFM\nJhEOh+HxeLBeryXelRJf+htsAywSuS/S7D2fz4s/AIvDbreLSqUi0nPtu2Dw58E1lBfVcZyl14oa\n7S9FAnwymch4nEmn/DrQE5FkNptzjKXXgRSz2UzSQO8Kkuw6MMPr9cLr9aJYLAoxk8/nkUqlJP2N\nozOXl5cSwX2TearBe2hiTRMpV1dXGI1GaDQaqFQqso7xLKJVVSQHAIj6PpPJYDqdiqqVIJmnmyHc\nP7Ua66mvlTabDV6vVwgvqsf29vawu7srwSL0FOE55ezsDG/fvkWr1bKM2z719/OxgAo2r9eLVCqF\nXC6HcrksXkMcodb71mKxEINoPerEq9lsSnDM5+619sfhmcbpdEoTo1arAQAymQz++te/Yr1ey9ob\nj8dFtbgJ7q38PvSy2tZIrCFqFLOmiZpff/0V2WwWsVgMLpdLig46S3P+l0SNUQLcHeFw2CLhLRQK\nKBaLEpFIWf1iscBoNBJPmpOTExweHsrCbIiax4/NLhaJGp3yU6/XcXx8bIiaPwk9K7tpvH6buZmW\nezcaDRwfH0u3gmaZ7MRrg77bNiKq3ygFJ1ETjUaFhOFhTL/mcDgsUlMAkjDFNBt+3x8ZHH3iwZ9G\noSRqptMpWq0Wzs/P0Wg0xORyW6+Fnx1GvJOoiUajQtRo1QZN/EajkSWe0uyLfx68DzQR5sVobrfb\nLX/3JqKGRSdjZw2+DHz/SXiTpAmHw5YxP5Kp9NK7K+hNxYujOcFgUHyhaKLKP+e4E9dpEjVm//w0\nbvKVuLq6EgLg5OREziKacCbBOZ1OAQDz+VzUq9wbOXqsU1/0+ByfTU3WGGLhPTwej4SK6JGn3d1d\nGVFbLpdotVo4ODjAwcGBnFWazaaloWPwOOByuSSEgMEIJGoYSkCjXioWJ5MJarUajo+PcXx8LGNP\nzWZTVLskaj51xtg0p9ZNS44F1+t1AJD1lYS52+1GKBRCNpuVUBv9fS8vL8WEmCmo4/FYyML75gOe\nPFGjRwZI1Ozt7eGXX34ReaRW1JCoqdVqFkWNOZDeHaFQCKVSCb/++iuePXsm5mypVEq6SlTUsMtf\nqVRE9vb27VvxwDCHkscNrajRRI3dbrd0sY6OjgxRcw/YlHXqcafbFDUcXanX6zg4OMD//d//4Y8/\n/pCOgZYTsyABbpb2k1DhRsWuBX2JKGnma+VrCoVC8Pl8SCaTWK/XqNVqODw8FNPAy8vLHz7KVHvU\nbBI1ACTp6ezsDM1mU7xptgEdY7upqGGHjOZ73BePjo4sSh+j3LgfcHxUGwhTTaPj0fl86MQ2ragx\nKVxfD55JGDShk/VIgF1eXkrqUrVa/SL/Asbd059K3+NEIiGJmIyrpdqNyV56FMcoam7HTYoam80m\nZxESNTcpagAIGTefzzEYDBAMBlEoFCzjvXp/vImsuYmkeerPJb0MWdBTUUOihmeP5XKJdruNw8ND\n/Nd//Rfevn0rjSStFnzK7+VjAgluJlhSUbO3t/eRJw3v73g8Rr1ex7t37/A///M/aLfbQnxPJhNL\nQizw6Xu9qTD3er1wOp3iRRMIBGTMnP5HLpdLyBqmXWrSB4AQNe12WwKFjKJmiyBzFgwGxQ+AMWF0\nhF6v15YYr06ng+FwKAlT5kD6eehNMRAIIB6Pi5ImFoshHo8jFArJ36F5cKfTQbVaxcnJicjeer2e\nhbk0eFzQMkOaRDNWVEcML5dL9Pt9MeXudruyEBv8OWweSAnKr3lI5DgnfWho0lar1aQA+ZIuvD5w\n2mw26TDT/DSZTCKXy2E+n1uiqHVsI0kbnRL1qeS+7xmbvhQcEUwkEpbIR3aaWq0Wzs7OJOJ1W6Qm\n90UenOPxOKLRKEKhkKzlJPn4DDcaDfT7fUkxMbg/sDMZiUTEO4/PiMZyuZSktm63axl5Mvg0tAdh\np9MRgnK5XIpvHtejeDwuzyuLSCpE/X6/JDXdFSxmIpHIR1c4HJYoabfbLWu3bmSdnZ2hWq2i2+1i\nsVhs8V36vsHniGsZSTfgYxPnTXBf08bt8/lc4np1gsxNX8sxtclkgtlstvXksO8N2suQ+w2TYCeT\niXjS9Pt9KZBrtZr41Zha4PFBCyH0aFswGLSEWmw2GOiVyLFO+vfpkexPecZs+nz5fD65eA5NJBJS\nnySTSWSzWSHCSczz4vfls8qR74uLC5ycnIjCeVvP85Mnaig1T6VSKBQK0sXU5nzaZJPO0lTSGHwe\n+qFhtGgoFLIcOqmy0J2G8XgshYn2PzAxzo8bDodDuu7RaFQWwWKxiHg8LhJWEp/dbhftdhuDwQCz\n2cxsuFvEer0WT5rFYoFGoyFKtZOTE/F+uo94ZRqaDgYDeDwexONx6YxEIhH5jDyUc/5jBQtAHmZY\n5OlCYj6fS+f87OxMOjjb2oO8Xq+MYOXzeSSTSQSDQbhcLhmrYRd6MBjIczydTsWIz+B+QFUiJeTB\nYPDW54YKJ87293q9L/JKecpg4+Di4gJer1c6/DQw1ca9Ho9HZPua+GbEbDKZRLlcvvO/zSLG7/dL\nF5e/9/l8koRJdeFqtRL5fqVSwcHBAU5OTtButzGbzbb4Ln2/0B5gVHDzrK+N3FOplKTYfW5voieN\nDiJhJLfG1dWVmPQPBgOMx2MpQo2vyseqwc10UDYFOOZHskt7hBo8PmwqUYjbPuv8c63E4dmRqmoq\nXnTSIb+WZArThHlxPeX4MK9gMIhkMol4PI5AIPARIa9JWz22SDWNHvnW3nz3rZB78kQNTYMKhcJH\nRA03X83wMXmDapqnvLjeFTq3ng8NDYUjkYglIlGzqptEDecTNWtp3v/HBxI17I6kUilks1kUCgXx\nJlksFhgMBuj3+0LU8LkyRM32oA899KU5OTnBH3/8gdPTU3S7XfT7fQsZ+rXPGJWIw+EQNpsN8Xgc\nnU4H/X4fo9FIfGy8Xu89/5TfDzSJrUcEI5GIpSDn4YDr4babBSRZGaWZSCQQDAbhdrtl7yN5pIka\nFpFmXb5f8LNBdQUL900wrpbGi4aouTtoElyv1yVtKZ1OYzabweVyWRSKfP85mqnTKZPJJBaLxRcp\nW0gCUZWh/5sNLp6PaNZOtWK1WsXBwQHOz8/R6XQMUfMJcF3LZrNC1NDDzev1ioKw0+nA7/d/lqjR\nZx2SC5sFJAAxSR2Px+j3+5KKaPwtP0AX5+FwWMZUAIgaaTgcClHDpgDrNIPHiU2y5jYiQ//ZJmmn\nm1kkrzfPjdoHil6IJL21/xdrTZ69OFFDNY32r9Lj+Zs+OpqoYbrptjiBJ0nU6BtARq1YLKJUKknn\nkHNsi8UC8/lcFojxeGw5JJsF9vMgW042c1PSy7EHjjyx2z8cDtFut1GtVlGpVIQkMxvb4wYPL6FQ\nSGbrSdbY7XZRpdGgtt/vi4rDbLrbxfX1NWazGfr9vnRjj4+P8e7dO1QqFZGb3seoBImayWQiY1aD\nwQCj0QjT6VSKT52MAVjlsh6PB6vV6lY5+vcOPUPN7mwgEEA4HJaDw/X1tRir0wBv26MsHo8HkUhE\n/MOYLrTZ4RyPx/IcD4fDrb6mp4q7KGr47FCSXa1WDVHzheAoEfD+/aQStNPp4OrqShSALOxJ2OgO\nrE74AfCRD8lt2Cxe9Fiohm4ajsdjSzRxrVb74rSppwZNeOrniKlDHIugYfpmYqIejdLG+DR4JtFG\n6L2NSsTFYmGJeNd/96lC1whs4HL/43vHzz7fO34dR2D0s/eU38vHhE0TbT0mynun7xXPQlrdxjAS\nr9crpuvBYFCCJ/S/RXWa3W4XYoZes/w9vb04ekgzfhI4+vvp18+z8Xw+R7vdlrRaNs62WZs+OaJm\nUxKVTqdRKBSwu7srRI3f78d6vUav10Oz2USj0cDBwQGOj48lGszMfd8dTqdTvClyuRxevnyJXC4n\nJA0POZz9Y/Fer9fFD4gzvUZt8fjhdDpFYkyvDTLZmyaXNKo1CqntQRMcl5eXaDabkppwfHyM09NT\nMUa/7/jeTXJl0z1fdyz4K6WupVJJEt9sNptshD8atAE0VYfsFk2nU0lGGwwGmM/nD/KMbHav6BcE\nQJ5fNi3Murx93FZg6sPker3GeDwWlcXFxQX6/b4p3O8Iqh4Yv3x6egqn04npdCqFI7u0OkKbRboe\nDWRhwuYSx1xuw2KxkL9nt9uRSqXEM1GvmZq01cQ3R0FM/PqnwfNlvV6Xe5ZIJKQuoGeFbiRSUaV9\n1NjRf/XqFQqFgsQMs9nI5gIvl8sl5tMMJmk2mwiFQkJ8a6P+pwgW5+l0WiYb2MBl4+/q6kqMhvv9\nvowFs4DWvnrmOfj2oPrE5XKh3W6j0+nIpRUvwIczB/1iAUi6JEed9LrLNExC74P8zOiLpLo+a2lC\nXK+zJH30Z4uvm4EOb9++RaPReBArlCdJ1LBrGQgEhKjZ29tDuVwW+eJ6vUa/38fp6Snevn0rRput\nVgvj8dhEwX0BnE4n4vE49vb28PPPP2Nvbw+5XE6US7pbTul2o9FAo9EQQ0QWaUZN8/hBHyKaCPOQ\n63a7ZUGbzWbS/dN+KIasuT/clPREoubNmzf4z//8T4k8ZEH3Z31pPvd6bnpdWhLL9IdYLIZisYjJ\nZALgPWHRbDa38rq+JW6KVKeSCIDIvWnU+1BF901EDcl0TbRSfv6UC4xt4yZFjR590rPzlGRrRY0x\nl70bSILw/SRJ02g0xEuPxT2LeI7KpNNpSTBhob5arSxjgZ9KYxoOh/L3nE4nXr58CYfDgUQiYVHV\nbI7QaKJm2+v39w56pvX7fTQaDUQiESQSCaxWqxs9UjgSMZ/PhZzx+XyIRCKi+tjf30c+n0coFBL1\nBzvw2qSYRA3XSSaZMt6dBM9TXUd16lM6nbaM2rJmIxnGZ2UymcDhcGAwGIiik2SneQ4eB6i8Xa/X\nCAQCFqKGxAZVaCRLSFT7/X4kk8mPjIH1eKiuFzaVOZujpFodp0dJKRQgdMIbzeX7/T7Oz89xdnYm\nxu21Wg2NRgPT6VRUQtuqXZ4sUUPDxk1Fjf4AkKj53//9XzFqI1FjJHZ3BxU1+/v7+Nd//VdkMhlZ\niDnPy4hEmiHyIdCKGvNefx+gooYHIW0YTVKG6QdaUWM21vvDbaTIarUSouY//uM/MJlMpMjbpqHh\nTaZyNxE26/Uabrcb8XgcxWJRNst2u/3Dmg7fFKnu9XqxXC7lZ280Gg+uqKGKg+MetylqWNwabA+3\nKWqAD0TNarWyKGpqtZqssQafB9fA5XIpjYR6vS7dfBIzVIoyOYRjUbFYDF6vV1Sj9GFrNBq4uLj4\npMuBynsAACAASURBVHcMzZ9rtZqMViWTyY+edUrwacS/SdSYM9KnQaKmXq8jFouhUChguVxaiJrL\ny0tEIhEhapbLpYWgS6fTctHbkiQC/RNZtOmx1nA4LGqAarWKRCIhih1N7j1VbCpqPB6PRVHDBiDP\njsvlEk6nE81mUxobrCMMOf04QEXNYrGAz+cTkqbb7VoaECRLqFjz+/0Wvxli81yr6/Cbzrw3ec3o\ncXONmxQ10+lUhAOHh4d4/fo1/vjjD1HSUMnIrzFEzT1Bm4Ylk0nEYjEZzaBslVKnbreLVquFer0u\nZkHG7PRuIIPpcrksPiXpdBqxWEze780Ug2aziWq1iuPjY4s5nikEvh9ogz2tprHb7bi8vMRkMpGY\n+9FoZFJi7gGMQo/FYjJj7/P5bnTbpzHfaDTaahGn587ZhWSnkg77N/ls6E6GXnd/1DVAR1NyHeSa\ntxn9yotfd1+Hg01ljyZadXcT+NAlY5FIU0yD+wPVVSS9+VxnMhnE43FpcmzGmnKEZjweYzweyxy+\nweex6S3DzzXTZWazGcbjsSTPMMabXjH1eh2BQEAK7uVyiWaziVarhWaz+cnikd+r2+3C7/djOp1K\n0U4i/erqSuK4aWJZq9UwGAzE383gdtAzjV5fVGuTaGaM73q9RiaTwbNnz+Q916kxPM8yQtrr9WK1\nWqHX68lnYzQaSWAGk2uAD4a5OmmWRSa9h54iqHLweDwyErOpsuB/c4RstVrB6/UimUyi2+3KRWUa\nm1AcKdOjaHrd1IrEzdpON1Fo6k/1BNX9psl4O0h4rNdrTCYTNBoNHB0dwW63IxaLIRaLScKlHi3V\naphNr5jbfL90sjAvHa+tcZvf4Wq1wnw+F5Kd/qjVahVHR0eoVCpoNpviqflQI3ZPkqjhITSVSolp\nGD8QnEnTi3m/3xdVhzn03A1Op1OkwmTIN8dg7Ha7EGOU+NfrdZydneHg4ACVSgXdbtew498Z9Lw3\nTb9YXC6XS4xGI7TbbTSbTQwGA0PU3AOcTqccYIrFopii08eCeEgVoJYzJ5NJpFIpWQOoCtCkA39d\nLBbo9XqoVCo4PDxEvV7HaDT6IQ9DN5E0jCHlAYOkp9/vh9frFcLkpoPln4GWF9PUMZVKyWeJxYYm\nasy+uB2Q7KaKhiRNLpdDKpWyqFG12SYJAh42TXTt10MrI0gU872dTCbo9/vw+/1oNBo4Pj5GLBYT\nHzbeDxbtw+Hwk2oJft/5fA6Px2NRN1JpvFgsxDz4+PgYb968ER8i8/zdDcvlEuPxGA6Hw5K+xEKe\nzYN8Pg+73Y5oNIr5fC6elrRNoEEp1U/svNdqNdTrddRqNeTzeZTLZazXa0QiEVlb3W63KHPK5bLl\ns/KUQZXD5igM/x8JFo7EOJ1ORKNRUXYyFbHRaMjZkk33+Xwu39flcsmzzPWSASbL5dJyPuJZloaz\nJGz1+mrW2NvB8w0AGSO12WwYDocWby82IrSRN0cNNZHG95vWI1opw/u06U2z6T/zKeg02maziZOT\nE7kajQbq9bo0QB5yvO7JETXaUZrqDrq7c0Z5OBx+xNCORiOL27jBp8HOQTweF6KG6iVGGNrtdjmg\nDIdDdDodSTA4ODhAs9k00u3vEA6HQzojoVBI7je7RptEjbm/fx6aqCmXy0ilUggEAh+56hMPQdZQ\nskxSnGQtOyjsfmzOGLMgOT8/x8HBAXq9HobD4Q95GCJxtmmyPRwOJdXA5/NJx4ljSCzk7mtcTXct\nXS6XHJ5oaEp1JPC+2GGhaoia7YBFYygUsqhp8vk8ksmk3I9NRQ0LDhYdptv7ddDPFt9fjkRtdm11\nIbdp8MxC8HOdV921j0QilgQ8Hcfd7XZxcXGBo6MjvH79GsPhUGJhDT4PEjVXV1fo9XoYj8fiscVn\njg2EWCyG3d1dXF5eWpK9dMHP+8KRw6OjI7x79w4HBwd48eIFrq+vRY3I78vmRSaTEaKIPmRPGdqj\njefFzZFpJm1xlIzPFq9arSYKiHa7LUTpeDwWI1qPx2MxiuWYIy/9nHLcihcVdUyHo7eQwc3QZPNs\nNkO9XsdwOMT5+bkY/Hq9Xjm3lkolZLNZ8YkKh8MfNSH0/qZT2HQiVCAQEJXcZoz3p7BcLmU0koIB\nPs/8HJGo0STUtvGkiBoytlpRQ+KAsjYuuLVaTSROo9FIpOim83879GKq4115uGTEq9vtlkV4M8WA\nfgy1Wg29Xu/JO+F/L9D3nnOmnOn3er0W9dRgMBA5OMdazHP15+B0OhEMBpFMJlEoFBCPx4Wo0djG\n+3zbPLDb7UYoFEIikUA+n0c2m0U8HkcoFILX6/1oJpgbnybzaNb2I48/8udiQcYRCx5cOaobi8WQ\nSCSQTqeFwP7SsaPNeFk9r81i0+PxCKkWi8UQDofl67keU/ljzIS3A3ZyaSDM0UF9P1jE65EndnpZ\nwBh8PbT6kIq3bSEQCMh+ScUxFXVcDzleVavVUK1WcX5+LsWLef4+D479Au/XsX6/LyPY3W5XEmjY\niY/FYh/tUQAs4zRU39Mc+ODgAG/fvsWbN2/gcDgQi8UkOIPnYu7ViURCzkONRuOjJLendiYiscn1\ni8Sljt8GIGRLKBQCYFXjatPveDyO4XAoI7paZaEDLbjf0nNEP0tsOPPi96Mai0QPE9dM4tTH4P2h\ncmkwGACAZZw7k8lIOMFkMpH9LhqNytrLzwbPPYvFwjLOxqZGLBbDer0WX7dPvSZab5AIarfbqNVq\nODs7w/HxMY6Pj3FycoLT01MZI/4WCqonQdToA6lOpEkmk4hEIlJIUnJfrVZxeHiIi4sLDAYD8+Dd\nETzwM8M+mUyiVCphb28PmUxGMuz1/SBRwxhaGk9RvfQUN6zvEbrj5PP5xJ+G89nr9Vruca/XQ6vV\nQqvVwnA4NKNt9wAS0FRBcHZ+k6jZBvRzr2eL/X4/stksSqUS9vf3USgUEIvFZIRGQ8tbKWvVs8g/\nKjRBxZ99Pp9jOp1Kweb1ehGNRlEsFjEejwEAvV4PvV7vi5KgSKLy0qoAkqvscj1//lySbG56zfpX\ng/uHNiHlvdLpiATHcriuUu5vCvfvC/TayGaz2N3dRTqdRiAQAADxdtC+NP1+/6O0RIPPQycrDYdD\nVKtVvH79GgCQyWSQTqeRyWTkeQOsjYjr62sZTR2NRmg0GqhUKpar0WhgPB6LMr/ZbMq91Gssmxh6\nHNjn80kx+JRUUvQwabfbOD09xXq9RjAYFCXpp0BTWSp44/E4ACAYDEozgaNPLpdLxhP1yBML/00v\nPCoyeM8mk4koK7TCglYZvMyZ9vPQz+J4PEaz2cR6vcZoNBI/KCpjSIxSNUriRjee2KQEIIbE2tSb\n2Dxz8RzV7/dRrVZxdnaG8/NzVCoV1Ot19Pt9qUe/1Vr7JIga4EMnkS7TnL+nosZms4mBMJlxzv/q\nuUWzId4OnVwSDAaRSqUsRA3HHfRDww46i3h2aLVZl8Hjhy7SOapBoobjLbzHNOlutVqyQZr7/Ofg\ncDhkXUun0xal4Lahn3tKWfkZyGazKJfL2N/fF0XNp4gadoj18/+jk7VMNtg0E16tVkJ8+nw+lEol\n2Gw2hEIh1Go18UMgefM56O/FwycVNB6PR/7c5/NhZ2dHiJpPvfc/8n35ltiMa9eeDZv753w+l0KB\no6SGqPm+4PP5kEgkUC6Xsbe3J0SNzWazmHAeHh5aDIQfUn7/I4Ad9OvrawyHQ1QqFUmjfP78uahg\n+IzxmdPnfybxtVotnJ6e4ujoSIxGGZnO8VUSNaFQSFTmVNYwrjuRSEjKlM/nk/PQUyNqptMpWq0W\nzs7O4HA4kE6nRVX4OfAe+Xw+xONxeL1eiV7nxWYSVUtaGaXJsU2PGt3Q2FTh8H73ej0cHx8DgGk+\n3hGbRsO0umg2m0Ko6fFe/n1tAK33Qxpzc2LmU0pfPc7a6/Vwfn7+0dVoNISQ/dbJtE+CqOGhhw8d\nFTUkajYVNefn53j37p0YCa9WK3MgvQO4CFIuqBU19KXY7AqSqCFTrSObzWHz+8BmUUFFDaWLVEjQ\nMJqHl1arZZ6rewIVNSRqAoEAfD7fgyhq9L2n8S2lx1TUPHv2TNQ0t6k0dLeEh+kfnaTZlOBqRQ07\nRiRPbDYbgsEgstksTk5OxFC23+/f6d9yOBzSpeQcN+X+2ryPh93bSDW+3h/5vnxr3FVRo331mJBm\nFDXfH1hYbhI1AKR4OTw8xOHhIVqtlhA1Bl8GFlpMc6pWq3L+pC/Nzs6ORVEDwELWTCYTdDod8VB7\n/fo1Xr9+jUqlYin+6bvYaDTEb2O5XFr8p5xOp/i20TAewJMiaYCPFTVc8yKRyJ2/B31KqCzeDFHg\n39n8d2/6/U3fG4BFhUObDDYeAQj5Z/B56GeRabA3eRLddl827+lkMhHCO51OS8P/pq8j6bJcLtHt\ndnF2doY//vgDp6enoqbpdDqWlKlviSdB1Hg8Hike8vk8crmcjD25XC5xXGesGy8d3WfwadDki/P0\nxWIR2WxW3mc65NNQlhfjuE9OTiThZTgcmoPmdwamk9AkT0ew66QM+j0Zp/z7hY5W1uOFDwF2MOih\nQW+TZDKJ58+fI5vNShy30+mUzVdLSXWs5uHhoSS+zedzkfj/6MTA9fW1yOmPj4/lAGOz2RCJRLBa\nreByuRCNRpHL5WTN/RJFjZ7TJ2nG32ulDVO5NhVZ6/Xa4qvA8UVTNN4vqJDjKCMVcjQH50WSptVq\noVKpoNVqYTQaPblC73sDVRX0hcpms8jn8ygUCsjlcjIyrA2JOZphmlj3g9VqhclkIs3F09NTObOE\nQiEEAgFLIiw9bk5OTnB0dITj42Ocnp6i2Wx+ZDCqlTdnZ2cfRU9zL9NejuVyGbPZDO12GwAwm81+\n+D2PWK/XGI/HqNfronDiOCc9fkKhkKjygY/PPJrI3ubZhyQ6zzFsUnU6HRmj8fv9Fg83g0/jaxo/\nmpjz+/2ydmazWaRSKYTD4RsbTTQM7vf76HQ6ePfuHY6OjnB6eireqKxRHsvz9ySIGs4tcjHM5/Ny\nI9mRIkvOh63X64m79GO5WY8ZLBpSqZSMO2hCjDI24IM53mg0EuOmo6MjHBwcSFfQHES+H3DBjMVi\nyGQyMuLCjj99FGjqZsxHfyzwuScJnslk5Eqn00in03Lg1QccbRLHA+35+bkcgEnUPBVDcXZh6/U6\nnE6nFGQ2mw2r1UrW0GAwCOA9QZZMJu98EOShVvsJbSbXaOLG4/HcaEY9n88lipaG4IaouV84nU5J\nTcxms4jFYhaihiQn40QbjQbOzs7QbDYNUfMdgGOIbG7k83kharLZrPhT6cQTKg2fAmn9ELi8vMR0\nOpX3kub7i8UCiUQCsVjMQphxVOLw8BAHBwfSWGy325IWpAtOjvKwIUWlMb1oeEUiEWQyGezs7Iji\nRhM2TwH0JqnX61itVkI+X1xcIJvNolAoyMUwEgBiZ8EU2U0/kvsGfU610oMq8m63Kz6bHo8H7XZb\nyHSD+4fNZpPJjUQigb29PZTLZRQKBbHa2AytAN6nirbbbZyfn1tMg8/OztDtdiUJ7jHZnTwpoqZY\nLGJ3dxeFQkEIBLp9U6aoI7m5OJvO/93Ah2ZnZ0eImkQigXA4bGG8darLxcWFEDXv3r0TB/WnUJj9\nSGBKAhltraihj8JgMJA4SnN/fxyQMNjd3cXu7i5KpRKKxSLy+byl8Nf+VDSIIxnearVwcnKCf/7z\nnzg9PUW9Xken05Gu4lMYtaGiplarWSJj3W437Ha7KJbY7U0mk1+8P7HQ0/Pdm6lPTJzhtYnZbIZe\nr4eLiws0Gg25hwb3BypqSNREo1ELUaOfn8FggGazaYia7wgkauiVmMvlLEQNn8vNaFptamnw50Ci\nhuuXw+HAYrFAv9+XhlMmk7EY/C4WC2kq0h6BZ1beE03UXF9fSxx4KBSScfB4PC5rbSQSQTablVGN\n+XyOdrv9ybGPHxGj0Ug8QxqNhqhz0+k0fv75Z0l14hgw9631ei2NB20svA2whmHDw+12S2IbvYnm\n87m8jruqXQ2+HBwFT6VSKJfL2N3dRblclmkOEng3ETWtVgvHx8f4448/UKlUZNyJI+ePSU0D/KBE\nDR9gXtFoFJlMRm5mJpMRlcfl5SWGw6FEQnc6HYkMNrg7qKhJJpMol8solUpIJpNioqahTZtPT09R\nrValM6HNogy+DzCKORAIIBaLSYIBi3NtGE3ptrm/3y84QkMSplAooFgsolgsCklTKpWQzWZv/R70\nZGHiG6NnOSNMUu8pFZzX19eYzWZCZtOfxG63Y7lcIplMiskwlTCb5uyf+/70wNmMO6eCg8l8gDXK\nm6D8XyefPIYZ7h8BmjjzeDwIh8OSBBSLxeD3+y2KGt7L8XiMXq+HZrOJXq+H6XRqiPBHDnpPcewl\nlUpZvEpIHtALg9G1HAU1z9ufB9ctkl88f9IolslNTI/hfnVycoJqtSrpTjyzbhZ2NMWfzWbwer1o\nNptoNBpIpVJwOp3i2cgQAI6H1+t1UfcAT8MPbL1eCxE5Ho8lpplmvdwLqV7ZTPHd9ORjDahNaW8a\nkfpS6JFyfv/1eg2Px4NYLIZUKiXK8V6vB7fbfW/vkYHV3JlJeYVCAXt7e9jZ2bGo+fW9otrt+voa\nk8kE3W4X1WoVx8fHaDQaaDabEhz0GPHDEjU0YPT7/cjn85I8sru7i2QyCa/Xi6urK4xGIzSbTZyc\nnODk5AStVgvT6fRb/wjfHShDI7uZz+dvjeIdj8eo1Wp49+6dpGuNRiMTNfkdg90FelzQjI+HDO2s\nb6Tb3zdcLhdSqZSMN5VKJZRKJRQKBSQSCYRCIRlzvA0s+JlYMxqN0O/3JWJ4Op0+KZKGYDGwXq+l\nqzqdTtFoNCTKlSa/PIDeNdmLo1W8dDHv9XqRzWali6wNhzcPm/qZfgqGzw8FHkIdDgcCgYCoLfL5\nPCKRiBA1Wk0zm83E+4sdXVPIP37QUPb/Y+9LextZkmsPSXHfd0pq9X7n3pkxDMOA//8fsAEDhj1v\n+vaqlfu+UyLfh8bJjkoVKUqiukkqDlCgFi7FysrMiBMnIkjGpVIpRKNRHBwcGLKg2+0a5TEbW/R6\nPZMOqtgcmEZI4pmEQb1eNylo/HutVkOz2TSqx2U2q1wnqSJvNBq4uroyBdvn87mjwUkmkzGqEQaS\nn5NdTDUMlUXAd9/i69evmM1maDQajtSnQCBgatfIZiVMx6eCKZVKOdJ7N6m44eex42kikVha403x\nOJDgZFfZ169f4+3bt3j//j1evHiBbDZr0p3kGHMOMq2OBaArlQra7fattuzbhr0kauQmyMKLJycn\nePv2Ld68eWOcSRYRrlQq+Pr1K759+2byTRX3h0x9Oj4+NgVEbTBq8Oeffxr5aLfbNXIzNfx3D4wu\nUGnBCAbwI83F7uaj2E2QqHn//j1+//13FAoF5HI55HI5pNNpxGKxOyNJJGoYvex2u6bNZbfbNffK\ncwJVRrw28/nc1DmIxWKmZgLTYCQpug6ur69Rr9fRaDRQr9cd1zcej+P9+/d4//49rq+vkc/nAcAQ\nQvZ5ym4IOpc3A9k9jURNoVDA4eGhGWufz2ci9dPp9BZRo4XadwMMJpKooWLq4ODAKOs6nQ7q9boh\naqTK8LmtjU8N1t66ubkxKrV6vW7mnB2RZ8rUXevffD6/le6fSCSQTqdNfRwSNQwcx+NxRCIRo9bg\n+e37Oiu/H4karnPT6RSNRgNfvnxxFBMOBAImJTiVSjkUM4lEwqRgAzAqC2mbbgqSqGGQQ4mazYOF\nvguFAorFoiFq3r17h0KhcKsuDR9lYMMmatwUxtuGvSRqyKZSVkqihjlsZKlJ1FSrVXz79g2np6do\nt9sYjUa/+ivsHHjNs9msyRGkdN4G201+/vwZnz9/xng8/qUFZiXz+hCm/TlsoqtAmSllqaFQyFHc\nTRbio8z4OV+vXwm5gbl1hlr2d4lwOIxCoYD379/j3//9301XN3bJYDRwFWQ6HEkaVuLvdruP/6I7\nCBI1dMKGwyEajQaA7wYKC4/KjiSsA7UOptMpyuWyOWazmflfOp1Gv9/HYrEwEvJQKIRUKuV6nrK7\nic7lzUCS3SRqmPok5y0j+7aihgSnYvvB+RWPx42iJhKJwOfzGUVNu91GtVpFvV43SkOtefE0oKJm\nk7W2JMkiFTWRSASlUsmoRtlxz+PxIJ1OI5FIIBKJIBgMPsv1lSqkm5sb0+il1Wq5PjcYDCKbzZqC\nspKoyeVypl5MNBp1kClun2n/bLd/vstPODg4cBA17HKp2Aw4folEwjQGevXqlSFrkskkfD6fqVUk\nQeKv3++j3W4boobFvrc94LQ3d5Fs08biwS9fvsSbN2/w5s0b5PN5hMNhU9iUrdNqtZrp9NTtdk0N\nAMXTgYW4WOzpIQa/7Szwb4BzEZVSSHvyyv+xdWI0GkUoFFr7HPr9Pnq9Hvr9Pmaz2bNVBEkZ97KO\nT7VaDa1WC4PBQCOCPxH2fCCJnc/nHYYpx5DSXXYHsnO6Y7EYfvvtN/zlL39BsVg0RqWtplpF9rDT\n08ePH/Hhwwf8+eefqFarWpR2CWjsU+3Jn3u93r0UNQxE2NEjWTNoNBqZwpZuUSaSCbFYzFG/Qeui\nPA6MrFPWzai6m9HZ7/fRaDRMe3TtTrlbsOsQpVIphEIhU4+q3W6jXC7jy5cvuLq6QqfTUbt0h3F9\nfW06yx4cHDiKFbPZBguIp9NplEolvHr1ytRo2eb6Gb8S9Oe63a4pKkybfj6fI5lMmuAG8CNVCvjh\nL1DBNhqNjLpiNBqZYtD0CyKRiFE23kfJqngcWJ/I7/ebmjRv377Fb7/9hpOTE5MKTluVkP5ht9vF\n5eWlKblxdXXlqK+37T7b3txpJGpYZCibzeLly5f461//ipcvXyKfzyMUCjkcx3a7baTgTL+hgap4\nPJY5alRgcAI+hNGkSgNwKlokWWO3o7XVPSw27fV6TWQrn8+7RpFt8DMZnX5uucQSNDp5DTOZjIn0\nuxE1z7X+yFPDjvgsIyel5F4af4lEwrTAPDw8hN/vN3NUvk8wGDRtt/P5PAKBgKPVM+tsrAJz/f/8\n80/853/+J6rVKmq1mhqjS0AVBeeOvNbryrhpkI7H41trlF3cmfug/TwWcAwGg8Z4JUmgRM3jwIgs\nnYtwOOxQS3EOzmYz4/TVajV0Oh0lOHcMdupTMpk0qgrulyRqyuWyqqV2HCRXuU4ydaNQKOD6+tq0\n7Zad3l6/fo3Ly0vTOUr3xtugEqrb7WI6nd4qICuJGtqoMvjA8aBqp9VqOTr/Xl9fG8UOCdVUKmX2\nXsXTgyqoSCSCbDaL4+NjvHv3Dn/88Yep28fGJSTq7PTsTqeDy8tLfPjwAR8/fnQQNdtO0gB7RtTQ\n+SdRc3Jygj/++AOFQsEYPpKBrdVqJv+Xiprn6Gg/FZa1ySN5wnz8h0wUOvq2qoawiRo351E6O6lU\nyhSdPjw8XPmdJCkUDAYxm83QarVMytwuTPxNg5tgNpt1tOam5JDzjYoaNTqfDm6EDWEraqTxl8vl\n8Ne//hV//PEHfvvtN1N4j+2h5Xvw77IwnySH7kqfoqLm06dP+K//+i/TzUSNUXdQUcP5JNe3+2BZ\nhxI3omZZdzbusSw2zJo6isdBFqNcpahhoVPKt9ml8rntObsMt2LCLJI6nU4dRA3JOJ1juwsqaqhY\nLJVKuLq6QrFYNDZoIpEwnTMPDw/R6XQMiVCr1X71V9hK0J+bTqcYDAYA4CBqSNLE43Ez17j/yWLP\ng8EA9XodV1dXuLy8NMd0OjXNEliegR0SFT8HMqUsm83i6OgIb9++xe+//27UTYFAwFG7SGZc3Nzc\noNPp4OLiAh8+fMCnT59QrVbR7/eNfbPte+feEDVsdZhMJlEsFk1BW9mKm9F9ykq/ffuGq6sr42Tr\nRvhzEIlEUCgU8O7dOwSDQVO75D7Xfzwem4N1T7gASxUNUzI4mSVI3hwcHCCdTuPFixfmnlkFuciz\n/WK/34fX6zWyyX2PcPIa+3w+47TFYjFTP4MLJ8dmOp2aWkRukXrF4yA7hTQaDdzc3MDn8yEcDjsI\nyoODAySTSRwfH+OPP/5wzLlMJoN3797h9evXODk5MUSMTdQQJAtsNdsycI6zMCCL2vJ8FcshDY+n\nfv9lZI58rv08nc+Ph9frdXTOk8an3HNGoxFarRbK5TIuLi7QbDa1rt4OQLYYzmQyph5JPB43ahrg\nh2Kq3W4bkmY0GukaucNgMJG2T6vVQqVSwdnZmUklZUHpZDKJUqlk6lB1Oh1T9FSqBBTOejY2WP+O\nhHY+n7+V9mu32mZwit0UpfJfdll0C0LxXGjnUGGveBz8fr8hMFmLiEoajhHHhLYJ68+yNMXXr19x\nenqKs7MzVCoVdDqdnQpu7DxRwwkTjUZxdHRkigv95S9/weHhoaNWBtvvVatVnJ6e4sOHDzg/P0er\n1dJI7hNgWUQ9lUrh3bt38Hq9ePv2rSnsfB9DhMUTZacLvodUysRiMROhtIuISUInGo2a1reJRGLl\nZ8vJTbJoOp3C7/ej2Wyi0Wg8C6KGDgWjFax0z5SZTbZAVKyGLIx+enqK2WwGn8+HWCzmkOj6fD7k\ncjm8e/cOoVDI4ZDHYjEUi0Vks1lTCI8EjZtizS7Ad9emR6Oz2+3i/PwcjUYDo9FoZzbL5wS3ItME\nlTf9ft+ob9SJfDzs2m3SIZDEGOvTnJ+f4+zsDI1Gw3SQUWwv/H6/ScUolUooFApIJpOm3gXX0Nls\nZgpfsuU6OwwpdhdUmDOVqVqtIhKJIBAIIJFIoFgsmmDX0dERgsGg6T51fn6O4XBoAh16L9wNBq/Y\nPY3KQ3biAmC6brFjLQkZpvZOp1McHR2Zg6ont7QnkjSTycSoX3VNfjxYV4gpaFwzZaoT4MyuGI/H\nqFaruLi4wMXFBT5+/IivX7+iWq06fMZdwU4TNVJyH4lEcHR0hL/+9a/429/+hsPDQ0PUUE46+c2V\nYAAAIABJREFUm83Q6/VQq9VwdnaGP//806RjKFGzeSxLfUqlUnj79i2y2axZOO8bLW42m6jX66jV\naiZ/l2NM5jsQCBgWNp/PmyJiBFMHWE1cFkRd57sBMCoR1mlggeF9h8/nM+lOjAyyEDMjwZtugahY\nDpuoIUlpKyMODg4MEVMsFh1zzu/3m8J5TGlyI2pI0ripaVYZJpPJBO12G5VKBRcXF8bBVGwnlqWw\nMf1qMBhgMBgsjWgq7gemb5Polmsoo4SyKOnl5SXOzs7Q7XaVqNkB0CEvlUo4OTm5RdTIbqTsdiPr\nJqpzvvugnUuiBvgeZC6VShiNRvB4PIjH40Z1RUI2kUig0+nA4/GYe0SxGlJlbBM1gFNNQ/KF6jYW\ndZ/NZqYeX6FQMIobN6JGduPTObs5BAIBxGIxo6RhGRMGg2XxaKqaSNR8/PgR//jHP3B+fo6LiwtU\nq1V0u11Hd81dwM4TNXQmYrEYSqUS3r9/j7///e+mewmLHcq87kqlgvPzc3z58sVEBXdp0LYVnCQ0\nOGQFdgnmjB4fHz/4s6rVKiqVCsrlsimmyHFmukYgEDDtTUul0lpFgvk97K5SyxzRTCaDXC5nahy1\n2+212+XuMphWE4/HkclkTItmuYnZKRLPueDyU4NETa1WQzQaNYWd2YkM+OEIsiDefdKWJCRJI/OB\n7XnC9YD3gJR7n56eKlGzo2AqIwsTKzYDKb+nMtHr9Trk3KzFwLl0dXVlouy6pm43AoGASc0/OTlB\nPp9HIpEwHUuYMsE6JsPhEP1+39imti310PVb8Wsxn88N2TqdTpFOp/Hq1Sv0ej1jv7LG3+npKQqF\nArLZrCFquA7omK8GHfZutwufz2cIbapdZKfgcDhsFPehUAjhcBixWAyz2cykKWYyGYc4wC6BwOBF\nt9tFv9/HeDzWAMYjwGvNWl4ky5gdYdcc5TgwdbRSqeDz58/4n//5H1OLttls7qTNstNEjcwfjEaj\nJs2FBA0L8bEN99XVFb59+4azszPU63UMh0OMx2NlPjcAmVpWr9cRDAbN4reOQuW+4OS9ublBNBo1\nE/T6+trRrYakEMkTO11j2XehE8K0JhrD9sL77ds3nJ+fo1qtot1uP5vW02wlmclkUCwWkUqlEIlE\n4PP5jFMxm81MdzVW1GdUQzewzeLm5gbD4RDNZhOhUAilUgm9Xs+QlzRIbJWTncL0EDBnnmQcD7aZ\n5VGr1QzBenV1haurK9MJQ7F90HH5ufD7/YjFYiYFl84a8ENWb+9JJL91rLYfJGpKpRJevHiBXC6H\naDQKj8djnAumaXDtBpzKX+lcUl1xV00pxXaB6W2sK0V13OfPn01jCx7RaBTFYhFv3741XUbZvc8O\njiicoMJlNBrB7/ebLr/lctl0XXPzTw4ODhCJRIwdKxXGhCRnWICfwf8///wTX79+NT6m4v6Q610s\nFkM+n8fLly/x8uVLZLPZW2UsAGA6nZq6NFdXV6hUKqjVamg0GrfUVLuGnSVqGB1m8T2bqGHqi8fj\nwWg0QrVaxefPn/Hp0ydD1AwGA80l3CBI1DQaDUQiESwWCxMh3DRI1Pj9fkOg0GGUtWe4GEuVi725\n2WPPjbDT6aDT6WA4HJrDTpFjlXgSNcwj3ndwM0un0ygWi0in00aOyJaJlJ3SUW82m0bKrUTNZnF9\nfY3hcIhWqwWfz4dGo4Fer2eKbS+rGbSJdY9GCyX7k8nERJfOzs7M0Wg0HMRNq9V6FmmCu4y71krF\n5iCLJqbTacRiMVMA3yZqZB0ELVq5G5C1SF68eIFsNotIJAKv14vpdIp+v49Wq2XWbtoakpyRxTN9\nPp8h7FSlultgE4rr62tD1LDt8/HxMfx+P1KplKkb9/btW2Pf9no9NJvNpR1PFd/BTomcP5KoISF2\ncHBwyz9hCjiDjlTo2+9Nm4s2LomaDx8+4PLyEq1WayfVG78aJGhk/dB8Pm+6bzH1yQaJGnbvIlHT\nbDZ3vpbezhI1wI86GeFw2Mj9SdTI3LXhcGiImg8fPuDq6soQNbvSR33bwUWRE4VFnCORyJN8HuvQ\nxGIxV/mvlCjaSgK3VCb5WqoT2u22IWC63S663e6t7hqycw2JmueiqKFT4aaomU6nGA6HhuxqtVqG\nqNGuBZsH71nguxHYbDYdRA03vqcA1TTs7MXaJe12G1++fMH//u//4v/+7/9Mdz2q1ehk6Nq7fVg1\nJrpfPg2Yi28raphCKDvnSUWNjsdugMWEWaOG6cJU1DA1n/U0WPeONoxUkLPYNABHcVTF9oOKGioy\nGo0GLi4uTDoHSZrFYoFoNIpCoWC6CPX7fVQqFfh8Ptzc3NzqvKj4ASpquD5KoobFaN3abLM+WCgU\nAuBUtMm1lvXCmIYqiZp6vW7WaMX9QZ+NtRapqDk5OTGNYmywBm21WsXl5SXK5bJR1Mj7YBexU0SN\ndLpZFDOfz6NQKOD9+/c4PDxEPB43Khrm+bIt18XFhWnHPRwOVS66YXS7XVxcXCAejxuio9/vI5vN\nmufcZVAwUuT1eo0qKhAI3JqYJF64YckaNVJdI0Fjl4aurJ1iEzXMZ6TDOxgMTN6pBLtPdbtd9Hq9\nnasmfh9I8ktGf2XeqNfrNRsY2yIyJYzXfJcXzG0FyTEabrJgerfbRSQSMYdsWb8JI288HhtCTqpl\nGo0GPn36hG/fvqFcLpsoMZUAJHgUvx5ybrsVEeY9IiO4Ooc3A15nRnej0aiZp7I9t0wvlLW+NKq+\nG5BdvWjTyGLtVE3d3NyYtO1cLue4J6gS57rNlGK+TrEbkDYQlbBXV1cIh8Mm+DUej+H1ehGPx1Es\nFtHv93F5eWkK3ko1leI2ZG0vj8eDdruNq6srxGIxQ+JIpZos4M6/AT8KuVMpTh+CY3Z1dYWLiwt8\n+vTJ1MwcjUaqdLwHpP3BJjCsC/T777/j+PjYFF6Xton04TgeX758wcePH3F1dYVOp7MXa+POETWM\nKLBrydu3b/Hu3Tu8e/cOL168MJ1Out0uarUaarUaPn78iNPTU1xeXqLRaBinUbE5kLH+9u0bptOp\naVPdbrdRKBQA3C6GZ4OTlFJDtiqMx+OuDCpBJrXT6ZiCbDykAcvn8ZCLrlxQWeyt3+9jMBiYKCbr\nGUlIhQAf95WoAX7kjgYCAUSjUaRSKeTzebOIer1eo6pg4e52u43RaKQOxROCUlxJ1Hz58gV+vx/V\nahXJZBLJZBKpVMpsgptKSRwOh6jX67i8vESlUkG1WjW1aPizrE0k62ro/bA9kJF7mSNuF1fXebw5\nyD2RRA1ru7F7HgDHtbcPHYv9wWKxgNfrNWnFR0dHSKVSyGQyplufrAF2fn5u7F21aXcTs9kM3W4X\n1WrV1JdjW/bFYmGUNt1u13TYjEQiZm3W0g3LIcmaTqeDy8tLADDOO9UZMnjFv3Ht5XzjOHW7XXQ6\nHdNhk0IA2ju0c9S+uR9IkIVCIRwdHRnf/rfffsOLFy+M+lC245Zdttgh7ePHj/jw4QMqlQp6vd5e\njMFOETVU0gQCAUQiEZRKJfz222/4t3/7N5ycnCCbzRq2tNPp4OLiAl++fDFRXaY8ScmwYjMgUTOZ\nTAxBRkVNs9l0yAeXgW3W2SI4k8kA+FGFfRlkx5tarebI45cEzGQyQb1eN4esPWOTK7xHuKDzcFPp\nSOdzn1snSkUbiZp0Om2IGhoU19fX6Pf7aDQaStT8JNgdlqrVKg4ODjCZTFCpVJDL5ZDL5VAoFHBz\nc4NAIGA6Pz0Wo9EI9Xod3759M8W1z8/PcXV15SAxpQpAjZjtg1uxUkIqOnQebw5SvcSae25EDeCc\n4zZJo+Ox25DjR6Imm81iNpuZ4sPHx8cIh8NGKc7U/V6vh3K5/AvPXvEYTKdTkxLu9/uN7TwcDo2v\nk0gk0O/3kclkDFFDAkLhDntt7HQ6WCwW6Pf7mE6npiEGOzzFYjFHN0uq3aRiv9VqmeDT+fk5Pn36\nhM+fP+Pr169mXrJordo460MGiUjU/P3vf8d//Md/oFgsmnpedtct2W3LJmq4Ru7DGOwcURMMBhGL\nxZBKpVAsFvHy5Uu8f/8epVLJMKJ0FGu1munyVC6XTRoLoIbNprFYLExtCgDGMSeTLSO0y5xDj8dj\nikJHo1FTE4aF9pah1+uZtLZyuexQt0hiZTwem0W2Wq2a830unZoeC7lISqdCFr2URRErlQouLy9N\nMa9dlx9uM+jEAd8Ni3a7DQAmBbHVahnilAW3Q6EQAoGAQ0Uhpb/SKXQjKzmXmRN8dnaGr1+/mgjT\n1dXVL7seivuB6YwszM/IIgATvWdraBZVV1n35mCnnNl7pN1VTSO2+wWmXtC+zeVyxpEsFos4Pj42\nRWaZZgrAzFOtUbO7mM1mpglFIBBAtVpFuVzG5eUlMpmMqf8nlVVsFc2CtroWu4PrI2v40TeUQWHZ\naWs6nZpOUKxR0+/3zcFUp6urK5ydneHz58/48uULvn379iu/5s5DijBisRgKhQLevHmDv/3tb4jH\n4wgGg66dt5h2L9PQGCTcp6DSThE1zNvN5/MoFoum2wzbp/n9fni9XlPYlg4jHX464/swcNsOss8H\nBwdmYVwn9UlKEOPxuFlAVxUlHo1GaDabxhmlUzGdTm+lPtHIYb0ZLWa6PmSEQjoObC1KR65cLuP8\n/NzIQmu1mrZh/sngWADfjRRuaCSrW60W6vU64vG4IUYZXaKhws5do9HoViog8IO4Ozs7w+npKS4u\nLtBoNNDv97WI3o6BhRVzuZzpSEMV42g0MrWH2KGk0+koub1BMDo4Go1Mai5Vi8CPqO5wOMRoNNqL\nvHvFD1DhOJ/PEQ6HkcvlzHpLe4jNGqrVKmq1mgmE6Fzcbcggy2AwwOXlJf7f//t/WCwWePPmDV6/\nfm0UdqlUCkdHR2g2m/D7/camVdwN1oACvqtrzs/Pzc/ZbNaojqU9tFgsHCp8Ng5pNBqo1WragntD\nYBdZZlKw0Drve1nPi1gsFuj1eri6usLp6Sm+fPmCarW6l/Vnd4qoOTg4QDweR6FQwMnJyS2ihtHg\nxWKByWRiiBoWd9J0p58HEjVMN5JqjFVgfqjMG7Xba9uYzWaOWjEy+m8XCbbrzeg9cT/IWhUkaiQp\ntlgsTHG1b9++4fT01BRj1qjPzwGJauDH3Oh0OgiFQojFYmi1WqjVaiiXy8jlcsjn88jlciZ6R7XU\nZDIxrSfZ3axWq6Hb7QL4MZfr9bpRqZGo0XoJuwUSNdls1hTuIznOGkSMVl1cXKDdbitRsAFw72F0\nfDweG6ImGo2a/YnrLPc4LSK6XwgGg0gmk8YZl8Em2Rij2WyaaP75+TlqtZoSNTsOWayWqo3FYoFO\np4PJZIJwOIzDw0MHUTMYDEzNFNuBVbiD15nXlo+Xl5coFosolUooFotIJpOmg/B8Pjdz7fz83DQN\n4UGFqeJx8Pl8CIfDSCaTyGazSCaTiMViRvXt8/lu+Y6LxQLdbheXl5f48OGDg6jh3rgvvt3OETWJ\nRML0VLeJGllkiIoatgRmjQTFzwELCrdarXvLcuXz71LhEG4tt5c9z+1RcTfsgqJSUSMNSzp0VNSQ\nEFPH4ueBHSEGg8Gtivq1Wg1XV1coFAp48eIFXr58aVrBcsMEvqcKsij7xcWFUc5I4hX4Lg22DRcl\nanYLPp/PpFy8ePECwWDQOAAkak5PT/Hx40eN4j8BWBhRKmqSyaS5xlJRw9b2up7uD9hAIZlMOmyT\nxWKBy8tLXFxcGEXk1dUVvn79is+fPxsSR+fi7oKKmpubG6OoabfbOD09RSgUwuHhIabTqSn5cHR0\nZEoKXF1dKVGzJmi3kvTudDpGxc/UwmazaQJWqVQKNzc3+PjxI/788098/PgRo9HI1KvR9NPNgYqa\nZDJpFDWxWGxlkJ71uS4vL/HPf/7T2Kb7mAq49UQNuzz5/X5ks1njXLx69QqFQsF0BHJj27Ro5a+D\nEiH7CY7naDRCuVzGP//5T+NkkLShooat8bSw2q+B2xwkeeP3+w3pNplMjNHHjlDxeNy0fqUCh6oZ\nSq255tJZoBGj0f7dA+cwC/N1Oh2jPqzVavj69aspFl2tVtHr9dQ53BBkm17W1fN6vQ6SplKpmC6K\n/X7fOAqK3cF4PEaj0cC3b98MKZrL5TCbzeDxeBzdKmURdqY5VatVEwRpNBqGENf07f0B20azxiM7\nDLEhh8fjQSKRMAVWU6kUYrGYUd1pS+j1IO1RdoOt1+sAvte8bDQapjHN+fk56vW6Se+nravXeXMI\nBoPIZDI4OTnBmzdvUCwWTXFnFg4GnNkT3W7X1KORBbj30S7ZeqLG7/ebok/ZbNZUwH/16hUymQxi\nsZijM4JCoXg6SKfi8vIS8/kc9Xrd0XGIrQu73a5GHbYMsgAbWxuSpInFYmatDYVCpmr+cDg0qhmq\nEyUxTkUVnQwajIrdwXw+N3WN2u02er0ems0mms0mqtUqLi4ucHl5adQ0vV5Px3iDYDH+arVqSBpZ\nHJwdDVutFnq9nknxVewOxuMxarUavnz5Ao/Hg+PjY4zHY0OYswMla4jxYH2oTqeDdruNZrOJdrtt\n0rf3rR7DcwYJFwAmFYpjzoYNdGBJ1MTjcVxfXxulhxII98N8PsdoNEKr1cJsNkOr1TLFaxeLhZmD\nk8lE59sTIRQKIZvNmuZAxWIR8XjcQdIAP+qMNhoNVKtV07SCKaD7qi7cGaImmUwil8s5iJpwOIxQ\nKKREjULxEyAXzOFwiIuLCzSbTXz69MmhXiMBoFHf7cN8Pjc1LuiUU7V4cHAAn89nDtl2ngSMGwlj\ntwvel0r7zwms60Y1TaVScbRZp6KqXq8rGbdByHlCoobKNAAmN1867iyEr9d/t0Cixufzmf0R+B5N\npgMiC3bzYLobVTbT6dS8XlXj+wWmQVFZ0+/3jWPKArfxeNzUEyNRw3tBi/jfHyRJ2SZddsDkNWUg\nStXhTwMSNa9evcK7d++QzWYNISnBdfLy8tKUVri6ukK9XjeB4X3cF3eKqMlkMshkMkin08hkMsah\nYAFhOgnSkJQTSyeXQvF4cPOiZFSxO2DEbh+jDoqH4/r6Gr1eD5VKBV+/fkW5XDZFFKvVqokqaoeR\npwMdBenAHxwcGIeNtWuazaYpJqrYHXB8WTjarqnI+VWv1x1EjUy3YDRfyfD9hVTE9Ho91Go1nJ6e\nwufzoVgsms6MVL9Go1FTwF/r1dwf0p5V/BocHBwgGo0inU4jl8uZltxU1HCtm0wmaLfbuLq6wpcv\nX3B1dYVms2mCF/uKnSJq2LKLKhqv12s2OxaJms1mGA6HmEwmmE6nmrepUCgUCsUKzGYz1Go1fPz4\n0aTDsQ1pp9PBcDhUQ/aJQRvG4/Gg1+uhXC5jPp+j1Wo5apZQeaEFu3cLNzc3Jm10sVjA4/GYGjQs\nJGunPjG9SSoWlaB5Puh2u4akoV9DAhf44R+FQiGMRiMlahQ7CY/HA5/PZ9Td9O8BZ7Ftdr67vLw0\n9fL6/f7e+/c7RdSwcBYXKhYa8ng8RkkzHo8dnRFkFEI3OIVCoVAonJhOp6jX65hOp6hWq4YUkAWi\nlah5Wsg2vTROu90uLi4ujAqOaaW0bxS7A7Zflx28arUaotGosV+ZZsH5x5ojtopGbdnngU6ng7Oz\nMwwGA4zHYwQCAeRyOSSTSQDf/SOWgPD7/UrUKHYSHo8HXq/3FlFD357p9yRq2PmO9fT2Md1JYuuJ\nGtm2i4qaYDDoqEtDo4abX7/fN+yznQKlUCgUCoXiB2azGer1uul8ofj5oGoC+E6c9fv9X3xGik2C\nUWFK9BuNxi8+I8W2o9frYTQaoVKpYDabIZfL4fXr1yiVSri5uYHX60UoFDLBayVqFLsIEjWyRqKd\nLcM9kUTN6empCVooUbPFkAUuW60WyuUyyuUyzs/P8eeff+L8/NxUgp5Op3svj1IoFAqFQqFQKBS7\nDSqprq+v0e128eXLF0QiEVO35uzsDJeXl6ZuldaeU+wiJpMJWq0WLi4ukM1mkc1mkclkTPdRdqBk\n/bxOp2OUvs9BhLGzRA2LYo7HY4zHY1QqFXz8+BF//vknPn/+bEgbtpPVvvcKhUKhUCgUCoVi28Fs\ngcVigW63i69fv2IymeDLly+OTnCDwWBvWxMr9h8spn55eYlkMon5fI5gMIhMJoPRaIR6vY6zszN8\n/foVlUrFEDX72uXJxs4SNcCPnN9er4dqtYpPnz7hv//7v/GPf/zDFGYbDAZao0ahUCgUCoVCoVDs\nBObzuanT0el0MB6PcXV1Bb/fb2oasbyDNk1R7CqoqLm8vEQ0GkU4HEY6ncZiscBwOES9Xse3b99u\nKWqeS0fnrSdqptMper0eGo0GotEoAoEA5vM5+v0+BoOBOT5//ozPnz/j7OwM5XLZkRa174OoUCgU\nCoVCoVAo9gf0X0jMaO0qxb6BbbcvLy9N/VkWzj8/P8fHjx/x6dMnnJ2doV6vGwHGc8HWEzVk0+bz\nOQaDAWq1Gr58+YJMJoPJZGKOarWK8/NzNJtNzGYzZZcVCoVCoVAoFAqFQqHYQkynU7RaLXg8HozH\nY3Q6HVxcXOCf//wnms0mqtUqKpUK6vU62u22Kcj+XOBZpTbxeDy/XIoSCoXMEQ6HzREKhYzcj/3V\ne70eer0ehsPhrXaGu4jFYuHZxPtswzg+V+gY7gd0HHcfOob7AR3H3YeO4X5Ax3H3oWO4H9jlcfT7\n/Q5fPxKJmGM8HpsyJqxJS4HGvmHZGG49UfOcscsTT/EdOob7AR3H3YeO4X5Ax3H3oWO4H9Bx3H3o\nGO4HdBx3H8vG0PuzT0ShUCgUCoVCoVAoFAqFQuEOJWoUCoVCoVAoFAqFQqFQKLYEK1OfFAqFQqFQ\nKBQKhUKhUCgUPw+qqFEoFAqFQqFQKBQKhUKh2BIoUaNQKBQKhUKhUCgUCoVCsSVQokahUCgUCoVC\noVAoFAqFYkugRI1CoVAoFAqFQqFQKBQKxZZAiRqFQqFQKBQKhUKhUCgUii2BEjUKhUKhUCgUCoVC\noVAoFFsCJWoUCoVCoVAoFAqFQqFQKLYEStQoFAqFQqFQKBQKhUKhUGwJlKhRKBQKhUKhUCgUCoVC\nodgSKFGjUCgUCoVCoVAoFAqFQrElUKJGoVAoFAqFQqFQKBQKhWJLoESNQqFQKBQKhUKhUCgUCsWW\nQIkahUKhUCgUCoVCoVAoFIotgRI1CoVCoVAoFAqFQqFQKBRbAiVqFAqFQqFQKBQKhUKhUCi2BErU\nKBQKhUKhUCgUCoVCoVBsCZSoUSgUCoVCoVAoFAqFQqHYEihRo1AoFAqFQqFQKBQKhUKxJVCiRqFQ\nKBQKhUKhUCgUCoViS6BEjUKhUCgUCoVCoVAoFArFlkCJGoVCoVAoFAqFQqFQKBSKLYESNQqFQqFQ\nKBQKhUKhUCgUWwIlahQKhUKhUCgUCoVCoVAotgRK1CgUCoVCoVAoFAqFQqFQbAmUqFEoFAqFQqFQ\nKBQKhUKh2BIcrPqnx+NZ/KwTUdzGYrHwbOJ9dBx/HXQM9wM6jrsPHcP9gI7j7kPHcD+g47j70DHc\nD+g47j6WjaEqahQKhUKhUCgUCoVCoVAotgRK1CgUikfB43k8kb+J91AoFAqFQqFQKBSKfYASNQqF\n4sEgwfIYomUT76FQKBQKhUKhUCgU+4KVNWoUin2ETQgsFpqSuS3weDw6HgqFQqFQKBQKheJZQ4ka\nxS+BJEue0jG3SRmp3uDnyp+VJHg4HkqyLBYLxzi53RtuaptV/1v2XIViX7BqTigUCoXiabHM9tB1\nWKFQbApK1CieFOs40W4OPl9314a3brqMJGh42OQMCQPdZB/uBK47bm7v7faZq8Z33efruCr2DXa6\n4DqEptvrn2pOPPX7KxQKxVNjXfuVj4vFYqkto2vh84DufYpNQ4kaxS+BrZqwFS73fY+7nic3U6/X\n69hUJXRxXX5d70N2PIYYWaa2WqXCWqackveWkjWKfYJc14hlpMyyefRU56VQKBS7jPuSNHepxNX+\n2H/YynAdb8UmoESN4lGQC5PP54PX64XP54PP58PBwYF59Hq9joOECQDM53Pc3NwY4uSuYz6f3/qb\nDfk3WznDc57P5+a95vP50u+oi+0P3McJewjh5ka42E6mjFitE73S8Xs6qDHya/Er7/NlY79sTioU\nCsWuYJ11zA4ArVqDdZ/cfdhKVjeiTgaB3XwUvQ8U94USNYpHg4vUwcEB/H4//H4/gsEgQqEQgsEg\nAoGA+TvJGx4AcH19jevra9zc3BjyxO2Q/7+5uTGH2ybJn+Xr7YXz5uYGHo/HPNrvIb+f/b77iLvS\njJZ997ui+svULsveZ1k6h1tNIXUIfz5Wjec+z49tgRtJeZ8U0fuO0Trph6pMVCgU+4Z11lVJ1ix7\n/qbXQw2Q/HzIsgmrDq/Xe8tnWZYWp2OoWAdK1CgeDHtxkgRNJBJBNBpFNBpFJBJBMBg0Bwkbv9+P\nxWKB2WyG6XSK2WzmIGDsQxI6s9nM/E4SBoBjsyQZIw9J3Hg8HlxfXztec1dxuH3NP13HGXtMStqy\n91j1+yon8C5DZd/GZ1uwruJJ8TRYJ9XpKT/P/p+OtUKheK5YZ/17CpKGj7r+/hzYdqmdGWD/bbFY\n4Pr62rxmWSBjX/0JxWahRI3iTrgtUh6Px6Q1US0jiZl4PG6OaDRq1DXLiBoeJGKWkTR8znQ6NYck\ncPizPLhwkpwhdHF8WtiyULmZMU3O3uAIjpetpJLqKD7PxqpxVePmNuR15zjIcXFLW5RSX1vhJsds\nHUm44vFYh0R1U6Steo91ydVVKahun6/YHNzGyK12EXA7BVjl+I/DQ9Scep33Ez+rBpgqiH8OeJ29\nXq/xVfjIDAG7pIPcA2ezGcbjMSaTCabT6a0MgHX3TIUCUKJGsQakYybrzgSDQUPORKNRJJNJJBIJ\n8yiJGnuBWyf1STp9topmMplgPB5jPB5jNBphOBxiOBw6fubrJcFjO5J2fZx9xjLjfd1YCTNyAAAg\nAElEQVQ87Pt+lhs5w/tApsPxZ/kZNzc3mE6nZqOj4oqbnrxPeI73OTe377Tv4+8G6dTRKOH85DjZ\nx8HBgWN8OQ9pmPBxMpk46j89x+u7SayjVFvnnl42n5fl3dvEnE2oSlJ11eeu8z/F3XAjZdyiu/Z4\nuZHdWj/h/lg155bNP00NfL7YVHBo2Zqt99JmIddPv99v/JhYLOb4ORgMmoCj1+t12KqDwQC9Xg/d\nbhf9ft9hy9r26zoKccXzhhI1ipWwnW061iRp0uk0MpmMecxkMshms0gkEoasiUajjgLD0nEH4Fi4\n3OrIkEyRKhkSMqPRCL1eD61WC+12G+12G16vF9fX1xgOh47XTqfTW9F++ZnyOz+XRfO+qV7rEDa2\ncycLSzMtLhKJIBwOIxQKIRwOIxwOO95/NpthMBg4CLjRaGT+x5Q1+Zn3JWvc/vZcxh1wHyc5vzlO\nHCs+BoNBx5rQ6/UcR7/fBwCTlgjA1IF6Ttd3U1g259wIFbfn2I642zjYRIw0Vu2fbaKGY8v3XWV4\n3qeujuI2bHLAVrtxn3VTKXIftIMVhI7H3Vg255YRpcBtxdnPdsxWqasUPwfrEOgPVcvoero52P5O\nMBhEMplEPp9HPp9HLpdDNptFLpdDNBo1a67H48FgMMBgMEC/30er1UK9Xke9XsfBwQGGw6Hxd1ji\nQfdCxbpQokZxJ7hw0ZGjY80FrFQqoVAooFAoIJ/Po1AoIJVKGfY5EoncivTJY5maRUZqqYzhIRfF\ndruNarWKUCjkIGkAOBQ1s9nsloHq5rDwcZ8Wz2XRcDe4OXYP/UzpPPj9foRCIUSjUSQSCcRiMXNE\no1GH4TuZTNDtdtHpdAy5x7xfSbI9dpye60ZpR4GppgkEAmZ+k2yV6rhYLIZwOOxwDlutFprNJhqN\nBg4Ovm8ps9kMk8nEEGr7Np9+Fu5D0nAcgdtzeJlqwk2d4abSsFPfCM7Bm5sbx2etMkL1PngY7DHn\nz3anRamKk8+1U4wJmaKoWA63ObeMwCTkfLBJsadeE1ft27oe/1rY1/+hNtaq91TcD5L85noaCoWQ\nSqVQKpXw4sULHB0dmSORSJjneTweEyhutVoOfwSAUSFznwRu19NUKJZhq4ia5+o0bSPkoiWj7PF4\n3Dhv6XQa2WwW+XwemUwGqVTKOODhcBiBQMAsYoQdVeLPbmSNXadE1sDgc5cRP5KgsQsJL3Nc3Da6\nZQTSrmPVd5DXwS0StK5RIQ1UN9JNRhXsKPB8PjfOhhxj+zwV94d0OKRzF4lEkEwmkUqlHEc6nTa1\npyKRCAKBAAA45uB8Psd0OsV4PMZgMDDRIx2j+8ONPJF/X0WiyFx5e865qRaXETVyPkrD1R5Xe212\nS0sE3BV6ut8/DnKsmEZK5VskEoHf73esqVKdOB6PHSmlADRF0YKcG/YckzUr5HykwsytZhf3NXmd\nNxVokD8vI/T46EYe7Vv62zoKloe8z6awyVSoVepFxXqQczgejyOdTiOdTiOXy+H4+BjHx8c4OjpC\nNps1BwPQci8OBAJm/Y3FYshkMqjX66jVauYYDAaOVHGpdFTyRuGGJyNqHrPArRP1Vzw9uPhIFU0q\nlTILFVOe0um0ceoSiQSi0aiDqLEhFyL7kFhWr0YSNbazwnvHTpVyK+S17LyWYV1yY9vwkPm0av7e\n53u6kTV2YTU6G3QOfT6fg6hZFq187LlJcPy2eRw3CdvJCwQCiMViyOVyKBaLKBQKJo0xk8kgGo2a\nYuAHBwe35tRsNsNoNMJgMDDPWRVpVtyGGxG5LHIv54p92OumHCvbWXQjauyC37IumT0f7c+Qj/y/\nfH+bHHpOc27TkEo4dlyMx+NIJpNIJpMIh8OOiG+n0zEqRY4tx4/gPQI8L9tr2RolA1a8/2V3S7tO\nxXw+d9SqoP0hYacHPvT+X0bMLFs35HNtVbEkcPZlPrqRwhJ3fcf7BIaeQjV4175pj6ubEnofxvFn\nQO578XgcR0dHePnyJY6Pj3F4eGgOqQBnCjjHgCQN199MJoNisYhWq4WzszND7HQ6HZMN4PV6MZvN\nHPvpptTiiv3BkxA1DzXM3QwEvVl/PuyNnikrsVgMqVQK+XwexWIRuVzOobCRippQKOQw7IlVJI00\n6gHcImnkIsbzdOtEw6iWTdIsK6C4ievFx227V3+1k+wW3bfHQyo76Fjc3NzccgxXqWo2Kd/fxnF8\nCkiihvM7k8ng8PAQJycnJic7n88jHA47Oh3YXddGoxH6/T663a6rkk6xGstImmVFYmWKi53uYnfL\nk+si8MOId/tMW6kj35vjL8+P89nn85nPApzqjGUS/+cwx54KNmlH8iAWiyGdTiOfzyMWi5mx83g8\nZg4T8/ncpELJe+K5jcsqkkYSNfI6yw6XkiRl2vVoNDLrJOC816UT9lCyxiZneI6r1gzbsXfrQLMP\n4++2rrl9p3W+633IGmBza9q6e6fbnN2XcfxZsOcKiZrff/8d7969Q7FYNMErNlOgWlEiEomYfXc6\nnZq6ip1Ox6SLT6dTsyYT4/HY4dcoSaOw8dNSn2xGf9XPgHv+3jo3rt7cm4O9udsGtzTo7cgNjUDW\nqHBrue0ml1/mlNMglQbRYrFwRH55jnZ6zV1Kmk1fs+d+D7pFl9xS2FhvxnbqlqkBlhWcfsz1fo5G\njZxffr8f0WgU8Xgc2WwWxWIRR0dHODk5cRQHZ+SYCjkZNe73+4as7Xa7DkUd8KPg7HO81utg1Z5o\nr7Gy3pM8JFEju9wBP1Qv9h7sFhDh3+bzuVEI2IXX5blwzSakas6NEFo29npfPAwykMLOi/l8HoeH\nh0gkEsapAOBQuJJkm0wm8Pl8P2Vv3EYsc8Rte0OmlJGkYWQd+BEomEwm5tpOp1MzV4DbpKXbuSwj\nFOzfbXLGPl8S5fLzCTln5X4rP3/X56Ntt65L1sjxt9dcrq+EtGtlke6nnEvyXpDkgh3s3OWx+5ng\n9aNCLhQKoVAomGDVycmJySBIp9Ouvg6v9cHBgRkHqo+pvJHNFvgadoK6vr42c3RdklFxN9zsqmUE\nqE10rvr/Op+56TF7EqLGlhpKx0Cmp9hRATs67haVe8hFfOhFW5fV3seJJL+7ZIgp2WPknIZiMBg0\nLXllCzpuZMyLH41G5jl8lMqXZc5IMBh0dJ4Bvl93mTID3G5B6qai2cfx2kZIp48RPNuwkQQM8EN6\nL1s8s44C6w2tai/7mPNc9vs+gust0yVI0pRKJVMsTxYDDwQCZv0mOFdZHDqVSqHf76PT6RiyhoYG\niVUla5y4i6SRh1S3sGYYW9vL/00mEzNOXFOB1ammdnSff3Oba6zLIZ0EOvuyA5Qb0e+2p+q98HCQ\nbI1EIkgkEshkMigUCjg+PkYqlXKQq1LlRkdhMBhgNBrdqin0HHAXARIIBMw8YypDJpNBMpk0ZE00\nGsVkMjE1J3q9HmazGcbj8Z3ziP9bdU723207WpK4JOV4yP/b6ZDyvPjzOoTqNmNde/2u15H0kmst\nU/9DoZCDtObY066VgUHg4ddx2VrJ83Pzp9y+yy6O488CrxVtGJZvYD0amTUQDAZdSRq+jz1enI8A\njFo5nU6jUCjg+voak8kEvV7PUYMR0PF6DFaR7nK+2M91s4numr9u5O6qc1n1XuvgyRQ1djTN3lSW\nRQUALHWy3YxLvvcqRuy+jsFdF/6x77/svbdhktpjBnw39plHORwO0ev1EAqFjJNAEoWONR0FOtjj\n8Rjdbhe9Xg/dbte0XWZRrdlsZp4ri/TJVs5c6FKplNlI6ShS2u2m3JD30VNdLz5uw/gBy+/Vhxoy\n9/1ebvPRJmskOec232n4ktCjQsBWSMnP2Jbrv82wHWg3oubw8BBHR0cmwhQKhRwpaFzb6QRSkZNM\nJtHr9RCPxw1RQ5KGzgKwHevcNmAVSWM/T651dB45NpRj26mmMvUJuJ12Kv/Gn+VzpYMnX8dzkfcD\n/27v7yRy5Gc8F6yz3j72esgClvF43BA1R0dHSKfTZo7aYzubzTAYDNBut2/Vd3sOuMuo9/l8jsKg\nuVzOrIssJMrUJ9o1nU4HwPdUhn6/75gfbnvcuucm/2YXL5UKGq4LJHClIy/3XHa/nM/nhsSz7etl\n98K2zt9V6+d934Pjz9ptJEGZ1i/HcjAYoNvtGpIa+GHvPDYoYY+FG0Ej11hbKSVfu63j9qtgj3U0\nGkU2m0WpVMLx8bHpZEs1MYmaVeSZXGNJ1NDGov9CQo8+FFPJt8l/2AXcNcfdgkXSbpHvYSuG3Ugb\ne3weQs48Zi5unKixWUW58dmyTLfoAADXDj/S2V4WAV/FiK3LcNuDuOriywF96CC4MbO/Cva5yBuZ\neeyj0QjD4RD9ft8YBHQaZFSXz2UXmGazadr4UgLY7/cxHA4dzjg3x0AgYCL1yWQS6XTaGBaRSMSR\nimEvdvKeeUqSxu36/erFdhuMbZtAlTWFlqmd+D+SMUyrkYoam9hxI28Vd0NuWqFQCMlkEoVCAaVS\nCaVSCcViEfl83jGfbfJPvgedRM51tqjsdrvGiCRhwHWd7/NccRdJI/dGuz4GiXEefr/foSzkPLIN\nS9sY4d8k5N9p+NsEGyOFbupYKnh4HvwOUq3xnMfdxkP3DHl/cK9kof98Po9SqYRMJuMYCzrrs9kM\n/X4fjUbD1FrYhn3jV8EOGNLJYiSc6+Px8TFevnyJYrFo1BXhcBjNZhMHBweYz+cYDoeO+hWrlL3L\nzsPt77a9LIlbWUya5xUKhRyvZTBsOp0aUuEu9dsuYpXdftfr5PgHg0Gj3qZSjWoqGQjsdDomtXCx\n+K6wAfBke5wbSWPvGY8liJ4D5DwKBAJIJBLI5/M4OTkxRE0ul0MqlXIEICTcrq+0ffl8NmNhN6l2\nu41wOOxouLDqPRVOuPno9too10hJaMtxlDaLHdi3A8h32U3y/YjH8AI2NkLUyAtmXyRZKV8WJHS7\nqHwfOmWS+bedbl6EZTe63BTt1y+LaridkxxY+T6yu8Wy99vVSedG2MgbjgobSn09Hg+m0yl6vR46\nnQ5isRhubm4cypl2u412u41Op2OK7ZFdlmkt8h6ZTqfGwPf7/UilUubnVQeJGzeZ4qax7ZviNhng\ntoNPUo4GL8lAqbqRaqtVRaG39fpvGzwej1Fl+P1+pNNpFItFvHz5Ei9fvkQ+n0c8Hr/l/Nv3OOfX\nYrEwudhSJXVwcIB4PI5Go4F6vY5Go2HSLDjvnyvRti5JI/dNOg6yTTqJmoODg1vGxvX19a3OM+sY\nG4StgrHHyq7dMJ/PjcNipzKueq99nb9Pse5Kw4+fIWX7lOqn02mTsiiNUam44Pzm++7b9V+FZXOO\nadwkaTKZDPL5vKn5c3h4iHw+j2Qy6ahXwlQG2jrSvuH8s7tVrjqnu85d2qlSWSfJ20AgcCvVSRIz\nwOpUyF2HbZe52fp8lOQcbUjWZrO7myaTSUdaf7PZRKVSQTweR71eR6fTQafTcSh/nyJY+NR27S7h\nPteBz6Vin4Gqo6MjvHr1Cm/fvsWLFy+QTqcRCoVc5wt/ln9z8/04/2TjBXnIIOQyIcI+zcn7Yplq\nRR4ymCgzMCRhzf3ODjpyjOSYMI1RKvo5VjaBs2rddPufHcC+Dx5N1NgbnTTe6AxQIcGDRoJkvKQz\nwJuXtU7cHDQAK51xuUC61cSQ7QllREWqfmRbUvk+NIIle+5WV2eVGmfbsWwjkNdhPB4DgJFRyxoy\njNr1+32joOl2u+h2u7c6xsjxkJ1/6Lh7vV6EQiETDbJzsZcV1XQj8p4Cm2ROnxp3nd8mr9WyOUAH\ng2sEF9jRaOQoPm0TNdLZXKWwuy92eZ7eB3JzY949HbyXL1+aAsKxWMxEhe0IhB0xWiwWprW3NHij\n0SjS6TTK5TJisRiCwSCazSY6nY4hEn624u1XYNV8ussQ4RxhpDwWiyGRSBgnnAcAY1iw3ogkapbV\ndiJWRYdksIM/2+fH59p1MOzn28btqs/fdiwzttYZ78d8X+6Hci5HIhGk02lHFDgWiyESiZjPur6+\nNiSNTdSsk46zD7hLsSKDB1y/SqUSXrx4YVSG2WwW8Xj8ln05nU4dRM1wODRp3dIRWxYgvOt3t6ix\nTM/ieNP+CgQCDhUN1ci2KuCu67ULROoyFc1dpJhUpPh8PociqVAo4OXLl2bsk8mk6WoqFTX1eh2J\nRMJc84ODA1xfX2MwGJh7ZFO2oRIzTiwLeADL9zQeUrGfy+VMO+53796hUCggk8mY9tvyPe1D7nn2\nc/l3OQ9leQhZo5Nkqv1Zzw3LbCL5s7RLSVQHg0GjfGOJDNpK8XjcwT14PD+U/exYSnJd+qm9Xg+D\nwcAc9P3dSjYAt8k7Ny7goWO6cUWNLAIraxzwYvKQRIhN1Mgb2b44/LKLxcJBqtgOuXTouFnadS5k\n/r4dUZFEk9/vd7wPC+vyc/h62VmD5+l2rbZxAi7b7OzfuUlRUUOShhsd06Emk4njhu/3+6YQ8TLi\nDYBjEnJ8GDUkUeNG0MixshU1PwPbOKbA/Z2DZeTKJs/HrrfBaOB8PjdKi2VEzabbrD8344fOHRUa\nNlFDQ18WjHWDrD3C/G2SPzLfm5ukJHZIKgDbO282gfuQNHaEV+5HnCMkatLptENZM5/P0e12MZ/P\nMR6PzRptEzX36X5nEynS8ASc7YqlukruD5K0kYboMsJmVyDHSp7/fUm5TYCph1TG5fN5B1HDtXI2\nm5n9mXWN6LS7qSp2cVxW4a6xkbYrO2hlMhkcHh7i9evXRqnESLvtaFFRw4NRWduov+u87rpP5NpA\nm4s1VCRZ4/f7jarH4/Hg+vr6lp28qT30V+K+82rZOiv3xFgshmKxiNevX+P333/H8fGxScGPx+OO\n8SyXy440FirJm83mrSDEQ2x/2y5/bvbKOrCvzaoAIQ+/3+8o8Eui5u3bt0ilUsZfXUbU2CkydldF\n+X8pPLDVNPRxbWdf4U7E2Rk7UmkslY/FYtEo4mSdIe57XJdns5mjI1ez2US9XjcqcCrkfD6fyf6Q\n5JpbzUyOvUz5fuy4PoqokQudjNRSYiujfjZRI1NcZITIliLZ8k052aTsyVZQyAkl25XapI2c1IxQ\n8JDKjZubG7M5D4dDdDodtNtteDweM4Drbnw8v3UjAD8DPB/5yOsnnTLZAYqLkxx/HkyFIkEjuz6t\niqTLPGG+vyygKSccP0sSMjLStW70eJ/x1MTLupAbJPN1k8mkg/Wez+fGsJQ1FZ6CoOE5rfrfvtwr\n0jj3+/2mhS+jhqVSCel0GrFYzBCeMvK6jOyTDg5/l5GOYDBoapaEw2Ekk0lj7DYaDQd5u+mx/dVY\n12m3jUw7WiSVNJTjZzIZh7SXxsNwOLxFjmxSuSTHm6QcC03LujXAj5Qn7r/btNdtCg/9Dm4Ez33f\nSxJlso5GIpEwXdpoE5H4XiwWRglrF2jfd2WbG2xnnQ67DB5IlQrtVtpDdjdM2SyBDth9r+26+7W0\ngalIJXlLop3jTeW3JFLvU3thW7FKUbHsuXZQmTZkOBxGLpdDLpdDPp/Hmzdv8OrVK9P9hx2+SH7y\nOo5GI6RSKaTTaUdR6UQi4WiUQV/jvvNM2uP8XT7y533aO5fBbY+U/gLnpX2dZWCf6yZrT2UyGYcK\nkbU2pS8q/UWSn0yLkQ67fH95P85mM5MCTgKg2+0aBbnco3m+zw1udpAd1LXr9FFFwyOXy6FQKKBQ\nKBhinZ28bEWNJGoYvGDtUxkY43zudrsOcm0ymZj7QK71fOT9A2ymuPiDiBpbheJWc4JRiVgsZiaA\ndLKlGsKW1nNSXF9f3/pcmRrjpqKwJ4kdnbdlaPJ5ZNV5rpJ4mM1mjkK65XLZyBz5eXbkcJ1rKD9/\nWyCZQT5ysaOhR2WLJGok4TabzRyRJZt4sz8LcBJYi8XCROltIyQUCjkiuTaxZB/PaRPjd7TngHx0\ne9193vsh58b7Qxa+pEyRzvt0Or0lTZSLn23kPGY8l0VcNvHe2wiOQSAQQCaTMdGjd+/eoVgsmhaU\nsvYCXweslpHbpA7XadYsCQaDSKfTjghHpVJBtVpFpVK5leK669f+IVFyAI69lNGiaDRqiqlLR0K2\n5R6NRuj3+7dULW7zZhNzWKZjkRQIBALmeTK1jc6sJAvXuRbENt4L9zmnZd/5MWSNJBXsQpXxeNxE\n+GVtPQAm2EQpNx1JeZ/c9/ttO1Zdfz5KAlIGG6V9Ke1KeV+Px2PTCZMGPRsk2Ao2N/XVfQN28n+S\nWHKrWzWdTh2qKUngriJr1jmPbcF9glByrO0AYDweR6lUwsnJCV69eoXj42McHx+jUCgglUo5UgZ5\n7aR9ysBTKpUySnLav16v17HHrbse28FT+Xym2tiB6X21deX+IQk2WZ7C5/O5EpG83vI1iUTCFF9n\nOiP3MKmOWSwWJqA0GAxMQ5Rms3krHUaW+pB+6mKxMDU62+02qtUqOp2OQ3Fn1zPat/FbB/ZaLO0g\nSaaQV+Cel06nkclkDCmTSqWQTCYNuRqLxRzjwc+i78h9T95LkUgEyWTSMfYkZbiHUm3T6/UcWUAe\njzO7Rs7Vh47rgxU1NjNttw6lBD4ejztyOEnUyJvadpDkZJPMqdxEyazxPeWktVtwSaOVKTs85MJG\no4fRFHmzcHD6/T7a7bYhaWQqD4kgN9gOtBtL/qthO8HyRuMCwsiAlNJKskRKrd2k924SePsz+SjT\nKSjrlVFcwLmALzNE9n3hczNW1vm+9zFy+Pz7Oil21JKGTTKZRDabNYtqIpEwHTNkFNjN4dyEMmDd\nv+3DfWMrITKZDF69eoW///3vpsMBiRo5n9d5X8A9+hEMBjGfzxEKhZBKpTCZTEy7y2w2i2QyiUAg\ngOl0ina7bRSJ3NR29brfRdKschzdriGJGkb+CoUCisWiY+3lvKKh6rYOPjRq7ubQSueQQRgWXuTe\nIOXe69bF2Lc5uA5Bdx+yxs3mko5iKpVCPB53tH3lXsooIltH0/CkA/lU++RjSf5NfPayv7vtT7KD\nkrQ1JfEl73ESNf1+/xZRs+qaLlPO3HWdpB3JuShJU2kfjUYjR8HoVfvpqgDIts+/+8wb2xnktUsk\nEigWi3j79i3++OMPx14Vi8UcvgBTGubzuckcsImaXq/nmIMATOB5neu76jlyTi8javYRth1jk6ks\nqi9V2HIPlK8hUUOVKuvoAT/8CPox3W7XdK29uLgwB+0Wkt30G21RgtfrNfU66T+2222jqLF9leeG\nVaQ5ffJYLOYIWjHIm8/nTfBK1u7jGHC8pY1KEYAM9EtCiOuBzAJhAwzyBp1OB7Vazbz3YDBwkD7c\nb6XN9Zi98NGpTzIKyAsrVTVyA5EXTk4wm6iR6gjJctmyJw4GFRZ2O1nJmEmiRlbllxfS7/cbFk4S\nNV6vF5PJxBTGjcViGI1GaLfbqNVqxuBZxprt2uSThInczOV1pJJIXme5MK6qLbQKtvNBp15GC90K\nQkmjibLuVbnhiodhXcdJzmm5PoRCISQSCWSzWeRyOdPyMhaLmUigNCrdolDA45QBm/h+uwRZ6yQe\njyOXy+H4+Bhv3741EtFIJHKrDbcNt6idnFuSaCAoT10sFohGoyYqwmKXvV4PrVbLFN9klGkfjM51\nSBq5hkplqkxpsdU0+XweABxrsr0m2pHF+6o35LnaBpSsRZRIJMw+z9xvrsU0bNxqyCm+4yHrjczP\n57XnWHBuSXUr8P1emU6npgNjr9dzVX5s+rttO9wIUtkAQypqZECK9zlV1gziMe1pVSeXx56vTeZy\n/Lm+knCXdVOk3WY31tjFtdZtbV3XLuE42mq0YrGIFy9e4M2bN8belDXWJPhZcs2WxPpgMHDUueT+\nxqi7XdJBvqf9OascPPv/8n7bpfFcBXnP+3w+k61Bh1zOU1n/RXY85B5p+58McCwW32uj9no9Uz/P\n4/FgPB6jVquZ4/T01BzNZtNB1NDP5XnJzAwpDqBCYzKZuO7R+zJud0ESNHJ87cwWij2kLUQSlURN\nLpczNqydYSNT4ni9bYKM6yVJ7nA4fKu2EOfueDxGs9k0gTH6wvP53IwpySBJ3Mjvfd8x3lgxYWls\nSmWLNBhkJAiAo+6MfJQbh1zI5GfIBVcOBA85SG5pFDK1alk002bRJTNOMocyt2VR6HU3j22enHQI\nlt10HCNZWOshiw/vDy668Xgc2WzWFIhibQZ+JidPp9NBs9lErVZDpVIxjt+q1un7BEmsbQrLjGw7\nEriOw0fnjosuC7iVSiWjpolGoyZVhkawW7ThMWN5Fwmx7fPwIaBBSqNTdi9hXRqudcsgSZllqYX2\nZ7pdaxLhmUwG0+nUUc+BUSZKgqUjwXPYNywjaeRcyWQyKBaLODo6MvVpksmkw9gYDodmf7LTWOzP\nA5xzeB3iUu7rNGZisZhRw9FZ9Hg8JnebwRBGmtaZt24qg30a92X2gVx31lmDZBFFRhrpsMh6fXLO\nsuh/q9VCpVJBvV5Hr9dz1NbbNH71mrpMtWLDTVXjdkh7UqqT6IQva8Xt9v3tKPK64y+V5VK1zhob\nPFfaZLJDqWwHvOu20Tp2yLKx5zhzjc3lco6OaTIg6GbXywKxkqgbj8fweDyIRqPI5XKIRqMmIDwY\nDByNNWy1+ap7xSZjlt0j++joc35IkkWqKmy1EwnTfr9vFBH0I/nIcet2u6jX6wBgarz1ej2jhuDe\nyvoyjUbDEDbtdhuDwcBRBw74cW8wTY5rsiy7wbn4HGuD2b4j55ct7mBqkyRpWNCbB//GIBH3OaYd\nyTXWzqrhwdpC0s/na0jQk9CVtXM9Ho+Z+/Q1ZVDKLahJ/HRFDb+QbWzKnEGbNZMRV8lm2cb9si8q\nnyflS/ZrpONhS8FtVYiM+Elj2d6o+R0kUSNbXdoS71UD4ubcbPOEldFznqt9Q97lyK3z/Rj9l8qL\nUqmEo6MjE/nnQkoFTafTQaPRMDUvWq2WyR/dVUPkvvgZJI38n5yPqz7fjsLHYlGwGQ0AACAASURB\nVDFkMhmUSiUcHh7eainKsbXbCt93HB8SzbWNoF2/b3gNpJKmVCoZWXcqlUI0GjVdm1YRzXJ+22on\n+zPlBizXf3Za4DWm+u3m5gblchler9ex0fJzf7XD91i4zZll+6JMH2ZXCs4VmX8tDT/uPzZRI6+X\n7Qza57bq3DmHbSkypf5UuErjhQazXZj6LuzqGN+FVU7jOve3vF9k/SLKvW1bRO7NtHWGwyGazSbK\n5TJqtRp6vZ7ppAg8zbX/1eN5H7LGtl/dSBpJ1LCdK5sl2EQNP9/ts+Qjf76LrOFclB2KqKRKpVLG\nNgK+O57Aj7pEUmVgEzXLznNXcF+SRhI1iUQC+XzeEDVSuS07o8nPYr1LpkXIduxerxfRaNQ457ze\n/X4fjUYDjUYDXq/X0TSBe+s6/oLbvbHqd7c1f1fG2rYd6MSn02kcHh6iVCohlUo5/Md2u41Wq+Xw\nCemcS8KGfoPH86OeZrfbRbvdxs3NjVE/sYMXa9Mwq6Lf7zuUUbwvptOp69oh/SFZYPq5pDzZ81Ha\nPZyLJGdYGJ+HJGW431FRRfLOvsY2d+DWbYvKRztlzS48zEM2JALgsHNI2ks7etm5PAQbV9TIjU6q\nX+T/udlxQ7MNe7l52BvJMqLGzcHic90cDCpq7G5RUsbIiSalVIxWMFWDAyqNo1VYZThsmzMix0PW\njnC7Ge0N56E3J536UCjkUNQcHR2ZyUSGVBZ1oqKmXC47WM5djhr9Siy7R5cRNG73rjQs5ZhSJXB4\neHirxTqJGllQ/CHKrIdiX+4T28ghUXN4eGiImnQ6bUgaN2faXodp6Nhkt/25XOflZsyoicfjMQ4l\nq+XzdVTZsMg71xx5LrsCN2fM7Tn23ihTh+25wghTLBYzElymiLopaux1z+1c5H66yjmU5ycVNeyo\nEAwGjQE8GAyM/HtZavOyz9tHrLoXHkJCuilqpC1i14zjPKWiplwuo16vG3Jh38fhLpvLvsdXKWr4\nPnTUbUWNVEisu1e5kXX2PSFtXtqnMvKcTCYRiURuEUWSqJGKGlmHY1+xbN2RZKcMYMjW9nT+bLue\neyCdPVtRQ6ImHo879s1ut2v2v5ub750Q+T5cq9f1H+TPq/aXVcGzXRl3zkup5MxkMjg8PMSrV6+Q\ny+Uc1zkUCplgOucCFRDSfmGRZ0m4tlotxGIxTKdTk8bIIuFU/LqlDdrnawdfbB9Y+qLPwTdxI2n4\nKAsGMzCVzWZRLBZRKpVQLBaRSqWMmkaSM+xsBzgJOVkgn+NEZZt9zGYzh3KHgURZm8yuf8TgpOz0\n1+/3HSnHPKdNje9GiBp5QrJuiJRdyokSCARuVbu2v5yb2saWpdrtmmnk2vVq5AAyr5iHdBITiQSA\n7xJ9Ridk0Vr7/FbV0Hjoddwm2I6adJwkUSP/f1+SxjaSstmsKZj57t07HB8fI51OOwoIX19fo9fr\noVaroVqt4uzsDNVq1RTokmz1tl3TbcEqw3XZc+4yJqTBSdi1hmSL5mg06tjEuKlybrJ+guL+kMZC\nNBpFNpvFixcv8Pr1axSLRSQSiTtTNuX6xrojsrUvDznXbSOFclYSrMTBwYFJg5rNZo6Ir9/vN4bS\ncDjcmWJ7dxGEcu10cw7tecKCeTQg6IzTeWB0jqSNdBjojC37fLdHt/WaeyDJIzohlJ8nk0mzh97c\n3JgAh03+PAeDVGKVcWrDtn+WrbG8Z2QKYS6XM3WC7FpAzJln9FiqP0iSPpf6baucWpnaJ1OK3FRK\nABw2rluL82X3utv8l7+7BRoBGGfP5/MhEomYIppMiczn80in0/D5fEalaDsk69bt2wcS1Z5L8m/S\nh6AqTSqSpLrUzZ+ZzWZotVqOgym7k8nERPqj0ahjjOkA8l7jejkajYwP9JC5eBdZ4/a8XRhb+1rJ\nWpUMMjFNTdahYaDPbp9MhRlhq2BYO6bb7ZrUKNnlVxYIt5USNmwyTQar3ALa9mv2CatsHs6TaDTq\nKAwsa9Bks1lH7Z+DgwPM53OjZpO1f2QNKLuTqCSrpa05n89NGh2DhoFAwJC1kkfgON7c3NwSZ9jr\nhFvJhsfgwe255SIE/JDGS7UKiRHKskmY+Hy+pV/IJkDsLynzyeziUPKQ6Vc2UUPDdjKZOAoTZzIZ\nU0gomUyaRV3C/p5uMlJ5ndYZoG2fpOsSNfchaCRkccRsNos3b97g/fv3ePnyJV68eGHk9fy86XSK\nXq+HarWKb9++4fT0FJVKxWyWskAiz9+GGwlxX+xSZIK4K8LPx2WEzTpkjXwPstMsskd2nESN3Pgk\nUWMXunzsd7vrdbs2jndBqhuj0Sjy+bxpyc0uT7aakOD8lbn4Msd+MBg4Cq3J2lTSwGIbTBIPMkop\nnQ6v12vej/sDoyWz2cyQeLYBtK1wmy/yf7xGMqLEyA1b19NIoTEqFSpyP7ULmtpEzbKIn30AcOzB\nNtkqU544piRq6EjOZjNT7+guI3Sbx2+TcFtHl5E1/N9d14YphJlMBvl8Hslk0kSS5WfYqlMWEJZt\nue8zDru+Tro5tXYQUBbnXZbaLm1UN9WnfG8b8vPk73Ku2K/j/GPb2Ewmg6OjI7x8+RKFQsG0kGY6\nONVTVBa7ETW2jeb28y6O9V32jfQdSDzLaL3sOgnAjDEdwdFohKurK1xdXaFcLpsUmMlkAq/Xa9bq\nTCbjcO5Yq4u/LxYLjEYjdDods1Y/1H65D1mzK5AOPffFZDJpnHkGMKLRqKNAM20GWSeNvp6E3QWY\nHUcpIrBTZGSR2HWcb3sflUGsTSotthluASH65H6/32HnMP2wWCwil8sZlUs8HncILxh8ILlGtVOn\n0zF1iUhWS9W3TFuS4gqPx2O6bwE/ygQwwGy3f7++vjZ7BcfS5j2WEfePGe9Hd30CbqtgZBSWxgN/\npzSXF81u3WwTPfL9+Jm84aU0ifJrqmukQ8AJ6VbFWXalmkwmiEQiSKVSJtfQTruwySQ7ouJ2je6a\n0NsMnp9UN5El5v8fQ9Rw86SRlMvl8PbtW/zrv/6rqctAJ09OvG6360rUsBDpqvo0ywyo+xqtD3nd\nz8CyyMm6JI3b8+9L1sh5ysiVbMVNokYy27aihpuj/Ny7zn/Z+a7zvbdtHB8Dzis6dZKooaLJriMD\nOI10GW1ii8pGo2HSk3jIzUlGkPx+PwqFgpEeM2JJZ56qxXA47Eh147ylGoDns+tjZJMjbrVpbIOU\nxCbrHtBpBGAMShqajP7J9AZeNxlRdnMUCTcy3u70xOKlmUwGiUTCPI+BDwY3bLLmuRioNuQ1tskx\nO5K+irCRxHcsFjMGriyoKFMYadSyJSxJVqbprFJWuH2HZee1a5COrRtRw0jvOnV/bMN/1f1tk7Ru\na699feW5cX0gUfP69Wujukun0w5FgCRpbKJm1TnuG0ljkxjyWkpFDddY2eGJc0OmuXW7XZTLZXz9\n+hVfv37FZDJxBB6kglVG5AeDgSMVZjweo91ur1S13gfrkjW7AknUUGmaSqWM2kLuix7Pj86+VJku\nI2p4XzOwwAKwdlkO6Wvw8S7FnHx/Caa62YTsqtfsOtxIGkm8BYNBJJNJ02nt6OgIR0dHODw8RC6X\nc7Q4B36oGGlvci5WKhVzkKwhSS2JE8lN8Hw8nu/qVKrCGdTM5XLmf3adISpqOG95bjYh9NDamsuw\nkdQnQpIYjITy5mSklBuelM5LQ9+uT2GnF7mxc7J1t+ybzokn31d+5mw2M0QNDeFcLmei+YFAwAys\nG3MmyZ918w13ZTG1F377e3ETW2aM3wW+Nx1JOvLHx8d48eKFyT/lZOU4cuFttVqmJk2lUkG73cZw\nODQOyrI0ibvIin1cNO8L24B8zD0rC4VRrso0Di6SXIDpdEpp/kNSnzYxx3b5PuAmw7WNTjWdf9Z6\nsg1EuZmRDOXRbDZN54N2u+2INsm1WxI1bMHNTfD6+hrxeNwhPWd6lIz0c/9g4T6eG6XNuzw2wG0i\nU+5fslAvo7MkP2gYsNhhr9cz5BmNFKmWkGs0P9c+j3XOlWPEmjlU0rBejowyylo5dnrzro/bY2Gv\nq+s8X44d7xc67IxIxuNxs0cSHIPhcGj2SrlH/gyl4rbCjaRxm4ckaWhnEjaRIt/Djpjb+6is3yXP\nhXNVBsS4PssUAdZuODo6wvHxsaMtt1TTcD1gdFkWOl6mptnF+Smv8SqyYtl6K1X4DChTncF1lKmD\njN6fnp7i7OwM5+fnmM/nZgzYuZItv+06l1IJcFcR/+cOGWgiUcO6aCRoZFBAkpNuBCUVE3I9JYEi\ngxZ8jp22ct86ifK5JJLc1v9dnHN3wf6OUj3M7JVIJGIaxZycnOD4+BilUgmlUslktnDdZXo35ya7\nddH/o7qt0+k4ivvadikPO/0xk8lgPp+b+43zlQQ9D8AZWJElASQPsCoN9qHj/Siixt6wgB8GNYvU\nMfogiyoBcCVqpGEnWSm7BoyM9EmJPy+ulBzSwZfv6Xawk5OMOMmNTRJQbu0OpaLGJi9WYZsdDxnh\nWXaeDzHApaMSDodRKBRMweD379/j8PDQ5N1zLFkQiptltVpFvV5Hs9lEp9Nx5JCuimg9B6xi+92u\nwV3k1X0+Q75OOnns4MVccG6wspgbpYtyc71rHt01pnedp9u9va3zcR3IeZVKpZBOp1EsFk0rS5k+\nQ/D7ylze0WiESqWCcrmMcrlsOh+02230+/1bLQ5ltEISNfJakmhhzRrObb/fj0QigclkYvaL4XBo\nCvjxb3ae+S5hlQMho0zsQCAdRd6f3KcAoN1uo1Kp4OzsDKenp6hWq6bdsptDJtUAgFM5Q0gDVUb9\nZapNqVRCNptFIpEwJBL3UDqpbHUq60xtMrq0T7CDHG6QTiYjzDKV1FYC8H0mkwk6nY65T+r1Ovr9\n/r2Is2X7xS6Oo1vwQV5XGfSTBI2bMy2VGbLOoewUsupzOFcA57zjGiojubJew/HxMV69eoXDw0Nk\ns1nz2R7P92LsLBhdq9UcdtE+E6Z3ETTyZ6lelOkLVFdQ+SJtkk6nY/Y+Nq0g8cnaXXRCeTAQJVMm\npOpfdsOzx2Pfxuc+4HjZ6gs69yQlef2krVCr1UzQwvbj3O57O5DBz5cOtq043NTY7OMYu62v0g8n\n4cYad/T7SNLQRpUNLkhycW1j18Lz83NcXl46WqdzzG3F6DKSjbYnVYpstJFMJhEOh281RALg4AFG\no5FR9sgOpvL+2RQh/iCixv4g6XjLyKcssGNHe2TNGKlSkTVrJEniJtGVxqRN2siIBI1cuxaOLP4z\nnU4Ri8VMsT2en3yNJGrsFl9ui8GqAdkVY8dtE7S/431vQBmBikQiKBQKePfuHX777TecnJwYoiYc\nDpvxpUNPB6VWqzmIGo7DMlXPsmjyLozBJrEsuu72t3VJkGXXmuNsEzWMPHEdsNucygjgfYi3h47p\nPpE0fAyFQqa1c6FQQDqdNpugW5c6rm+sadHtdnF5eYnPnz/j8+fPaDQaRuHCAr929IDOv9yYeT78\nOwkk7gcsPJtIJLBYLHBwcIDr62t0Oh3U63WEw2GzPu8K5Jp51xyypfg2UcPrw/Hh0W63US6XTepn\nrVZDt9u9ZaDwHGxC0l7XbeNCrhMkahgBy2azxpgJBoNmDyWhzvRFSs5t2bhi+Zpjr6n2WioNXpuo\nke9Bwowpwufn56jX6xgMBnfWbyPWIfB3ZTxtFY087BRE2elDGuvy/pXKDNmFRHY54xyTNqrsiCqd\nQVuWL5UemUzGKI35eHR0ZDreyNocJGrq9Tra7TYGg8HeteMmbBJaPkpI4ozOmeyQtlgsTBop62vx\nGvJoNBpoNptoNpumFthgMDB1NKRagAffX34m13n7Hlhmtz5XeDweh/KJ+yJTEjnPJFFTqVRuETXS\nRpFYdb/w//bjQ8dm1ev2ZbyX2TtyfWVRaCpB2c3yxYsXyOVyiMViJpgIOMtuMIWXXQu/ffuGr1+/\notvtotPpoNvtGhWNHaiyrzFtT54TbRtJ1DCQKNdvuV5LYrfb7Zq6jbaohHjsuvskqU8kLThJ3PJ7\nbUWNVLzIzeeuBWzVBmxfYLf3kSlMdEJkPq88Hz5XqmnsIm28DvsGe2FzW8jk4yrI6JIkav7lX/7F\nRI6YIiHrAZGoqVarqFarZvPsdrsO5ZV9HvclIJ4Dlm1Q0qh5LKSihq3WWbRPSlZHo5FpcWfPv/vW\nUHgM9mHe2oqaYrHoIGrYfckmzmmsciyazSYuLi7w8eNH/OMf/0Cj0XAUppTkDN+Dny8j/5I8D4fD\nSKfThsiXstL5fI6DgwNTr6ZWqxnVBh1/O2KzbeO1bE6tgh05lEapJGpoHFDByXXw7OwMZ2dnDqWT\n21rsRtKsE/Gxo05SUSMNZr4nz1O2LNYOfN9xl0Owag+VZAKJGtmtRo4D56Ukai4uLkzUUaZz3+dc\ndxV3ORG22sWNpLHXG0mw2of8HDuYKFUWklCVdSw8Ho9jHaCS5u3btzg5OTEFhDOZjEkX5lxjPaJG\no2Hs2XWaK+zy3FzmdLuNt62okWvWaDQy86ZWq+H8/Bzn5+col8toNBqo1WpotVqOvc/v95u9S5I0\ntqNnNz6xO+Pt8vXfFGxSWqY+UVEjU4EBmNQ07oesoUc7clWA4D779UPGxy0Ysqn33ka4zT3bHqQS\nNJfLoVAomDTOdDrtILzttZEBRBI1Z2dn/7+972puJEmSDpKggFbUqntmZ9bu1u7h/v/PuIdd2/2m\nu9lNAUFoRU18D20e9ApmFQog2IQoNysjCUIUKiszIzw8IuTr16+edDdOb3MFOvBzOHxJf9rc3NSU\n7oODA9nZ2VE72XZ8FvFmDEFR0+12PephyzVMgxyfmKhhtgubDB7HYyjka4sLcv6nLSbsImj8vqjL\nWLdRDH4ch9+Gjc3ZxXpjE4T0EdEKW6Nm3Os3T7AkDR5z/W7B1xx1GJLJpBwfH+sE4ag/VDQgxcCY\nX1xcyNnZmeYkcoqd/bxRGzc/z+/vca7FIsBGqez/Rs1JvNbWjkLRPkR/V1dXdZNtNBpSqVQ0WhWk\njOLPcP3ud+5hMM/jydFhtL7O5/MaJchkMp6ou8iLshEKwVarJVdXV3p8//5dLi4upNFoSLfb9aR6\nBhXWgxOysrLiIeO5uC1LYnntxf2CnPRMJqOpNCxBndVxcjkNNpjA9dM4is9pFyiIzwRar9fTo1wu\nq+PAtWn85mVYIxF/s2IANRfQQpOlwSIvRY1RwJHrBLjahC8qRhn+QeupC3zfcGoFHBZb7FbkxZDk\newapG+hQM2o8FomkCYLLoBd53X6bHT68DqRyNpv11Nfa3Nz0BCF5rrMCB2skbF6uzbi6uqqd8jKZ\njJycnGgdBxSPRo0xBBhRt6HZbGqE16qMce7LBEvE8Rq7srLisesZ1WpV037h/MPe5/U6m82qOmB/\nf1/y+bzWu7SOHgLUXNctImncQIAAnbm2trbUiR8Oh6qegP3YaDQ0WIH/jVpfw2Ia4zPKX5jEB5k1\nuPwtS7rBLrUqb04zxXuBK0AzC6jb2PfmecRg/98GBVOplLYB39vbk99++0329/c1+IT12dqasHPQ\nYdPVVc/WNprWujtx6hNuJt7UXCQNfuJ1+BK2IjOnJuG5o76kH0ljf/d7vyAG10YzWXqFmwWGj63y\nPOqcw7CsswR7Xf2eMwoc7c/n87K9va2pTjs7O1IoFHRBhpMHYxPO/OXlpZydnUm1WtWUJ7/iwWGd\n+beQNYsAl3PpGvNxxpjnE6IhKI4KIwmFD8GSNxoNVQWEjcD7qSzGcejndWO0YGOUFRA7OzuSTqd1\nXvH3Re5vv9+XSqUiZ2dn8tdff8nXr1+1YFuj0dAWhnZjtOsq1ktsuK52hThXPnCvPD09ee6XdDot\n/X5fyT17f87iuPkFA1z7DadDMFkDY0FEdI9st9tqlJZKJXXMut3uK6KGz2MU+ep3/jx/QdRsb2+r\nQYO9nYmam5ubwDbhszhe04RdS0ftl2GciZWVFU9HIpA0TNRgvrkifrhvYK+EJcDxt989Ms+w+z0/\nDjuViRqMJ64HWmVDAo9o6tbWlpLZ3EDDlSbFAUomzGOxmOzs7Gjxd7St3d/fl1wup8XgmWiAE8NE\njSXV+TsuEhnnUkxxsNa1zsIGQdF6kF4IDEJBU6vVtJsoxhnrYjwe15RuF1Fj6xAxUTOOjRP2+y8S\nQNRwV14okUDUPD09qfq32Wx69kKubxiE917H7N7rGivXOcx6QMrC5UOIeP0BKGpcRA2CDVbpDd+7\n0+lobSiktvH6hs+yATIcXE8sm83K4eGhnJycyKdPn+Tz58+yt7enan9bwxGAsoeJGtg8Vjls19u3\n4s2KGixAODkMClQ2fiwZF/FlKeFbv6TrRvF7H55Eo4gaW6gtDKs36trNE956zjxp4vG4tpi0ihou\n3vf4+OjpbgIJ99nZmRZ64wLCo4zP9yBrFhEuJ8PlmFv4EZ+IiiCVBYQBEzWsqAkzpkGfPc44LoqR\nYxU1iUTCqaixTgnSVJAicXZ2Jv/85z/lX//6l0YMkC4RVMme/+ZOCraDHzs8lqjBZgqiBoqaTqej\nzqh1gudtnvL3ZsfBRntZUcPdDq6vr7XLAfahXq/naW3O8CPZR10zS9Sga9vOzo6mZaBIJhMDMF5Y\nZbAsihrAZZD7raWu17qAuYGCmolE4lUtDJEXogbEGYiaVqulNYP8xsO1P/p9v0WDXRdt8wiRl3Vt\nOByqE4k1FHMvHo8r4fLw8ODpIsLFZGOxmMcGZpJgY2NDuzodHR1JoVDQAy2gMd5Q1LiIGqtSZywK\nWTPqO1hbhA8QXf1+Xx4fH9Wm7Ha70mw2lQAYDAaeIDJSPpF+CKJmb29PVcPr6+siIp5rb9NXx1Xh\nT/L95xVw7GELoF0z0mJub2+1ox03OsC+M6ulKGbpXKYNl+9tU3ZhR7gUNZz6iTXYKmq4e+GotGp8\nPhM1W1tbks1m5eDgQP72t7/J3//+d8/ctYWMea/2U9RwLT62j8fxX0bhzTVqcEEBZsQAq5KxCpqw\n9WhGnYdIuAgQ30yQFCeTSW0bbKNUMJSR/4tUAESZIwmjPzDxuJMCOtGcnJzI8fGxynnRJYYdSFRz\nRwFhtAe2udfjkjRhz33ZxjTICXYZey7YAqlcZA8GDMYXRhF3qfCr0g+MM6bLMn68GaHoXjqdlkwm\nozm3SFXh9bbf70utVtMCbefn51IqlaRSqXgk/LzG+90HuGfw/lyHgQ0n3kAtaWMJG9v9yCqC5g2W\nzOSUCK5fge8IshodfOr1ulSrVc8exAWEXZjEKeOUp0wmI+l0WgkClvVD9Yhzs23CZ9Vg/hUIs5aG\nIcy4ECNaorNEm7tjwE7BuorxQBpaWOfQT6k4j3CNA5OXth4CyEfu8In1jNu0ctQ/k8nI8/OzbG1t\nebqLcl0SVtSwGs0qajY2NrQLJhorQF24sbHhUbHDWa1UKlKtVj0t2P2UxiLTSxf+SIQhafCTCRus\ntxhLdBREG27MGzQ4uL+/97weKW/FYlF2dnakWCxKPp/XIqTYqzgAzXU5uRMR72nvdX3maVxZBcVq\nbChqETSH7YhAhasm2ixhUmJ03uali6zhlHa2TW2aEd+vPG+soIKJbya88VqRFx8Ez4V/n0wm5fDw\nUD5//iynp6dydHQkuVxO11ZbO4rnMIsGUBuVCaOgAsZvxVSIGvzkE7SLBF983hynzUDZG2VUNB1y\nLLSyxQ3Eiy3krX753hFJ4wYvulwMbG9vT9tMHh8fS6FQ0A5PMF4eHh6k0+lIvV6XUqkkFxcX2tkE\nTkCQQ+9SVVmEiTAHRUYXHUGOxah5xc42HG1OeXp+ftbWds1mU528m5sbXXTDIGjzW6axsjndcKpR\nfI87XLCisdVqSalUki9fvsi3b9/k6upKWq2WZ/Pxi8i6/g5ygkatk2xYs7oxqE3uLMMvOGAJKkSb\nbJcnrG9wyLD3oGYCAgVhru24hiLnk2Nf5JbqIi/dGKD0semLURDjBXZe8E9+DsD3COwUdHrCWNgO\nQzAmW62W1Go1qVQq6riPq/pdVLhIGyZo2JnmQ0Q8RA2TkKhXMxwOJZFIeD4PAQqW92Mts000cKyv\nr2sNhXw+r6kfXDAa5EKv15N6vS5XV1dSqVQ0HTxMoGNREPR97DxyKRnxelajYXxF5FUAIZvNys7O\njhJpKK6OtH2uF8WKKVZaYc3m6L11VsN+71E20DwRNuwzcLAGKU/wxaAC5gYwfrbKrMD6xssALtrL\nQVtbW03Ee3/aIuvoHJvP53X8b29v9XV2zEGo4v6Bfw81D7rnQaUIJQ2D94bn52eP+r9ararajgMg\n73XvTaXrE76QyIuixrJjTNTYY9pfLoxRiv/DIM3lcpLL5TzRZz5H5N5DRgyiJjJE3eCNhzv/ZLNZ\n2d3dlcPDQzk9PZXj42Mlx0DUIIoFSe/V1ZVcXl4qUcMbaViSJshIHmfs5oHhnvbGHIaksUoBLM5Y\nlJmthmHKsnw4n5CtjiLglmmzGwWOuiNiYQuO2jbPcEra7bZcXV3Jly9f5OvXrxqV5dpPQdEpO49c\nygHXWu8XRXRFTTh/eV5UNUFRfMAvQoTIIcgOEXk1V8Kqz+w5BYHnFgcwCoWCqjigyhLxEjUgBkDU\nBLWqdH3mLI/lW+DnKI0iPgHcI9wxA/ulK/oHdVOlUlGihpW/sxZp/lXwc5IsUcNKmiCihokvdK9E\noVNOZcQanEgkXhWotJ1OcY4oUpvJZFRpjEAHngc7qdvtajALdftub299ydtFUNKEget7whbl9utc\nmsFVQ4b3VgRCMpmMbG9ve4gakKd4P1x7vp+YBMSYc/rvpIoL1/f1C5jPMqzPgOvN+w63RYZykNX1\nk6bMB+Ej/dN5GLcgsLqeSWsbPHTZjCCuV1dXZXNzU7sccsqRJWJFXgLFUCGm02mt+bW7uyvFYlEK\nhYLk83nJ5XK6vrrSnXhv4HqasJN/1d46FUUNvhxfcJchMirVaZo3pd9kxFhf/QAAIABJREFUsAO7\nubkpqVRKc4BRKDEWi+libXumczGjWWZwPxrsiCQSCcnlcrKzsyP7+/sq7d3b2/MYIVywCXL6SqUi\npVLplRMQNmo0qeoiaPOb1TG333uS8wyK/oZ5Pytb5Yr9Ii+bbafTkU6nI61WS5rNphYg9VPUuIyv\noO+wDMA1gDPHHdUQUbAd7JgMhVN3dnYm379/1yhVUAchF1zP4dfbuToqCsp1BVwkzTyB55Mrwsup\nT5xagc3/6elJBoOBKtCw/9i86GmAFRzpdFqKxaInYmzbCnP+eLlc1nnM8v6wa/QizVm7hvJ3HYek\nwT2C9GzItNl54UAZp8KwomYSJ2YRYfdwa4wzScOtr9EYA2QLz004BnD8OXoMdWMymXS25IaRj3G2\nRVQTiYT+j4McqAnF9ftqtZrOvbAkzaLDrrW2Xg2ncXJEHeOAecUd1wqFguzt7an9igLCm5ub+nqo\nc6CmsQpD3DNIhXt+fn5F1ryFbJjkfWYBdu/nmk4i4qnnxB13gpSlfoES/M/1O8P1nm+9pkFkzSKR\nqUzUMOHMNWmwBnMAzqWoQUMDrgnDCkUWiayvr0sul5NsNiu5XE729/f1QEF22Me2No7Ii/3F+wGv\ntSDF54aoEXlN1uCi2+dMoxbNWwG2FgeM0YODAzk4OFCp6dramhqbt7e3ntajXOX5vQmneQUmKCRo\nhUJBjo6O5PT0VE5OTqRYLGq9Ayul5xSzdrv9Ks/eVdTURhasQ+eKZo5D0vBjfL/PGvwiuOO8btzX\ningNItRTyGazUigUNNoEuTeTcFAGuPI87fu7fl9m8D3OqjVcc8jl2QDkOYYudphfPA7jrmV2Ptjo\nGDs5eF+X8cN7CMtO53lttY4CR1D5Jxfdxx5q67vxPor3xs+3RhH53FKplBSLRY0a5/N52draEpGX\nyDM6piDVhqNMo+rSLNscDrtn8Hgyicct0m17dK73B2MSUT9OhcF5jPrcZQWCcnd3d9Lv9z2OPDsW\nIq+V4gDSoBBsYLWcrcvIUWPbHYrTcvi+QW037J+olcBd1sKkDs87SWptlVFBWb6+XDcIx+rqqtYZ\nWl9f130Q7dKhBkgkEnJyciKHh4daWxEd8Jj0Qy0VFIhGnRsUM83n81rLa2NjQ1usc2mIMHPVL3Ax\nj+PpKrKPwzYScCm2NzY2PO9p65bgc/DTFTRx2cB+AgN+znuIDBbB5rH3JwLxNzc32iHv8fHR89zh\ncPhKsQjbFqT21taW5PN5z/rM7xGLxSSVSukBIYbtMuUKSPP8hWqr1+upahF+C4Jlfqn90xy3qRA1\nIi83F5M09qafJkkzyebCizaYPSZq0F4vHo9r9JlzItGKy9WOi7/nsoOvM6L86PL0t7/9TY6OjpSo\ngcpC5GUS9/t9abVaeiDKD6JmVATSTnqXkRyWpHGRHrxhzOJ4T3pOfgbPuM4FEzVc2X11dVUjITaF\nAxEnl4HiGo9xHdSgCMa8Aw4dO3Mcdbd5+CBqQNJ0Oh0lapDOKfLaCBl1/VxGEBte9jx4fvJnMVET\nZBzNMuy14KiNJWys9B3GAl8fPO5HUoe5JkHjZwm1ZDL5iqhBeqqrbhs6MiDKFMbRWDa4iEkR/6AA\nxsJF1CDIISIeNUgQUeMaj4gAfwEcBNh7vGa52rWKvJ57rMLAXoiILBQ1TNhgTnN3EhtxtueH/RNd\nnrhOh237HGbM52E9ZfjZKH5kI6+xXNiUHfxYLCaZTEbV3zw+CDZC5YR26dvb20qaYmw5fQ4kDYrc\nwsHkWhsPDw+eDl6s0neNzbhzdJ7Glu0FJtZsfTrbrILJmiAixY+YYYKIFa1MvNkOanaOTTKPgtb/\neRo3hssHw+NYv6AGRIe8h4cH5zqH6w2iBusk0qBubm6cZB7Wa1bNQGUO5Rs3C+LxY5Xj7e2thxAH\nUVOr1TwBZltE+D3GbmpEjYj35gZ4AFyKmkm+1LhOmn0ty+rS6bQn3xQthMGQs6KGD5ad83dfdtjF\nFE47FDV//PGHFItFyeVykkwmtRYQ7hvuroWWe6jAz0SNJU6CjnHS0/wMV7uQzDpZMynGJTQsSQPj\nFPUUoO4AUcO5nqhL41LUBH2W6/GgMbAb6iKBIwgwAl2KGpdqDW0tmQi1YzApGY7fmaixqhELjmCx\nkTSv6aV2/bBKGpeqRsSbGw1YsmZcme0oh5zHan19XaNQh4eHcnh4qB1NRF4UNSBqWFFzc3Pzqs6U\nXasjjA4U2DQNJmo4PVvkpWsN6rrV63UPUXN7ezvSPrFO7jzOt0nA39OmuVs5PduvfnVFENXHmgwi\nAASKdfhwYH10KWpwnpaoQfc37KGcAuKHeSfm7DlbstoVLLD7EHffsmRNMpl8FeFHsBGpaPl8XiP0\nSOtGsVvbah2pc0zUDIdDj/ppOBxq9J4LEfP3cl0H6wxbzEtgw2UvMElj5wLmlktR46qHx/dIEEED\nhx+vYccd5BvvyzzP3uILLKJdyrABKBA1UJpBtcbjxWskiBr8zGazaqdirWQ7F2PLNQ754HQpGyzk\noAfqvV1fX0upVPIoarjz8HvV2mVMlagR8ZI11pkNImjGcc544P0MC7shsUOD9mAgaWD8oA3cysrP\nXOCbmxvtPMQboo3+z/pC+KvACymc9Uwmo4Wctre3tQ6QjQgiAoEuQNfX18pcQmLmkvWOWuAskRbG\nWA3zvvZ1y3IP8Hfl8eaNLpFISCaT0faVqG+xsrLiaXXvV7F/1LX0i5yJjG+UzPMmyesaq9e4fa/d\njDj1rFareQqjTyPXlo0hNo65La11Pvh3bHrcGnectsKzBpch7YoeYf3jegZsVPL4ptNpvRZQ3jCp\n5fp8v0gXngNFFpyR/f192dnZ8aQuco0pqB5ZkWUDGPM4Xr8arj2HDU2kW6RSKclkMp6uT+wcQomK\nlMZer6f7Zpii+0FYxHHk78RGOtYdFKpEZFVEPHuUH7GFos/2SKVSWiQcnwdnYW1tTQtlcso4E9aY\n3/1+XxVT5+fnHtWUVaROYuvM+lgH2fz8HHtY24KdfdRzs8QOq3C4CGo6nZZUKqX7K5NvHMxFeigc\nfBFRhzKbzapaQETUMWQlDpRw1uYKsn/mDXbNs7aCS4mKdRHzAvc9FNtQJmFv5PWUW7Nb5Q4OnnO2\nGDQCEciqwPhaf9CuL8sKtuVgM1xfX8vGxoamQA0GAw3kugr6MlnG6xvuF25WwvMW4431lNPveU3g\nemNoGoQAFAgaHLVaTXmA29tbPSe7vkx7zKdO1Ii8jmD7OcthI92jHOgwr8fgoUji9va27OzseIqB\nYeEdDoeaC9xsNj1yJyymy9xBIQgchQBJg3xeS4jhWrPcmAsIW4lZUGqMdUD4PhtnEi0DQeMiOid5\nPX5y5Je7k2CO2Wg80p+QV/9Wx+6tYzAvkScLa1iisj4KOHMBYZGXFAlEZK+vr7X4K69p1qB1fW6Y\n87ISZZsXDFiDGueJiOQ8EzUu8PeAMYj1L5VKqeGHa8XOQjqdllwup9cQBioMGXSJwucwYWYVPHxs\nbm5q58N8Pi/Hx8eyu7ur6/Xm5qY6FTC6ms2mpl5wOnCQIivMfbVo4zzOHLLEK0iadDqtRA3k23D8\n4UCAnOEimza4MQmRPelrZxV+wUPMRRA1CNYhnYkNeryPtSvYqUfHGvzktRhzDs/d2dmR5+dnXSvh\nPDKBhJpQaMd9dnYmlUpFOp2OJ2VmnL10Hm2YoPN1jS0TXfw4Cj8jcMvRdy5Qah15jBunsuG+wRzs\n9XqecbCKnmw2qwqB4XCoRCvWVvggdixHqWjmGWxDcpdQjCn2QbY7sZdBuQ/yBAW1WZXDcxHvz448\nE6Qg3zhghOYLSBnHvgennQk7rtG2aPvaOICCZjAYyPr6utTrdVlbW5OnpydtjNBsNjUQBHKF7RRc\nV/gJTHBjr0QQCa9zNaCwhDTGiAlVBDDr9bp2ssQBwQZqS1mf9D39iKkRNX6svL1Rx2EbXcyx3wLl\n9z6WjQVRs7OzI8fHx6+qtsP4eX5+VgYQRE2n03lF1Czj5AsCG/4gag4ODmR3d9cTncWiCMbayuiD\niBr7eS6MIgdHfQe/98P/53XcXU6y6/Fx3g/RKaQTMlGzu7urRM3Kyoo64EzU2ALRQecddJ4fRfT8\natj10KZIcB6uXXu5GGW1WvV06QmjaBpFiNv1lu8LjnpYWIMakUVsiH51c2YZYYxqjAmiS/x9EXG1\nRE0+nxeRF5IH7+HagzlCbyNObMgkEgkNXOzt7cnJyYmSrEgFZqKGU+eYqIFRNeo+CiKJ53l9dWEc\nQpyJms3NTVVQMVGTSqXUUcTYg6hBrSncS7ZmSdjz5Z/290WAK4jIRA2urf2frVdhSUnMN06xwU9O\nlVpbW9NCl+l0Wu7v7zXlMJVK6Xpu10MQNZeXl/Lt2zdVtYXZQy1sYAuPzeNYuxxiToNxpdGi3kUq\nldJOMGin7tdNRkQ8jiJ3BxsMBtrJstPpeJx/qCERuEANjWw2K8PhUAaDga6jIi8KG2u/+im55h1Y\n81wKCft/XH849iC0M5mMBjkQsOCC0VBCsUIU85PHlBUcIG1xwGkvl8uyubkpnU5HVlZWdH1YWVnR\nukMuP3hRxssPlvwGUYO1EUTY7e2tlrdAMAgFuzH2GG9ec0HKseoK6yTPaz87x54jAsc4UIvm8vJS\nSqWSXF9f68FqVShVWbAxzto7LqZC1FgD0Ur1rNPMzx31nn4/7Xu4Nhz8ZCab20Rz5XZ0pcHFv7+/\n14KnTBqgjoNfHuQyg5nMeDwuuVxO9vb25OjoyGP0MytuuwChKOX19bWmmyG6ZVVMQfeEH1HjBz/m\n1QVreM/L2Id1FsI4FvZ6sTGClLdcLieFQkFrpYi8VtTYAojTuJaTOCXzCNf1dylqRLzOBlI6Mb94\nTRv1eaMeZ+IIRhfuCSjpuJsJwNFPTj+whdvx3HmFy5BhUoqNBiZpuPPB/f295/1isZjKvR8eHvRx\nkZcoJQ4/AyaZTMr+/r4cHR3J0dGRHBwcSLFY1ELgGNfn52ePjNmmzkXpwJPDKtFQBBFtRuFoICIM\npwJOXbfbVUUNq2ki5a8bLsUF5qKIeIgZ/G5/WpUGk9QIYODg9ToWi0k2m9VjY2NDC8za90ZNB8y5\ner0u1WpVyuWydiLl9JpJ5p51IhfBqeTx5XHkdCSQNUhPY6KMo/JMzLHaAgQpOsOgS2m73dZUqa2t\nLUkmk2oDQTWA6wuntdVqSb/f13Q71G+0RKufDzSvcPlqrgLCrKjB9YNCJpVKeQIFPLYYA5DdqPHF\nRA3viXyfMFFzd3cn6XRaFaYoVou1GM8T8Xbim/fxmRSwb0S89Xzg83U6HWm1WpJKpZQgBVnDaWo8\n71xjCrsjHo97bBV73XmdZiVcv99XFVy5XJbLy0v5/v27XF1dSaPRUCUN22YIkP0qDmCq7bldf/sx\niWFJmjCRdNfr+QBBg6K2iBzu7+9LoVDQorYYNLDbV1dXUiqVpFwuq6LGtuMa9V2WBVg8wXRCUXF4\neChHR0d6nblYGiIJjUZDLi8v5fLyUn78+CHlclkLzdqW3PgsF+x4TOIw2HsH966L/HF99izAL9ri\nR8D4KYhGGWvsWHA9BeTlgzDARggnnHNTuYbCe8ynMATdLI3dOLCkCJQrLO21UQQu5sYtuUe1srSP\nuc5FxCtfRtoGikojbYNToPj8WOIPkgayYj9lwCyPnYss5nHwMwrhlLFTBwMlnU571trNzU1P3TQo\na3jv42KLfmR0PB7XwsEHBwcawOCUJ3wXkH2Q+YdVxbmuzzj7+jxjHPIbyt9kMimFQkF2d3c93fO4\nYwWIMxi+djz8HAXXnF6WsWCw0c6qNBj/7KAzgeJSaGCMUZ+RI+283rFDCmeUVY18btx9pNlsqgQf\ntpGrqcWk18H1c14QZBPy+KJQdKfTUdIbTr3fe/D4g5zBAWcT5AxH3bH/pVIpeXp6UpUc1AW4F9Ah\nc3t7W9dyzGdbfHpUgHCUvTbL48qkKe8l1s6x+1E8HncGcRG8wv4HHxAOPac9cVqwJePQRhoFoZEt\nsL297UmT4U61lnDFuS4D2AbAWigiOv+Gw5duyr1eT+1VmyKPg8kV7I14LoIY+AkiDjWk2I/h92Gb\nq9FoSK1Wk1qtpkTN1dWVVKvVVx2H/eyc9x7bqbbnFnHXv5hkE7CGRNgFyvU6GD0ocIqUDNvlCURN\nvV6Xer2uBYRA1CA3LYy0exmBCLpVLR0dHWl6GZhOLMY3NzdSr9fl4uJCvn79qte70WhIt9vVKLGf\nEzBKTeP6aV9riRlbFZ6ZU3vgfWdlE7T3f5BjG0Y55PcZ9tqBqEFkCkQNZMQwWkHUcB0Fl6E5DScu\n7HjMythNAo7As6IGhohV1FiiBooVv6id308A48SRL5wLIl1M1HB9Kp5rcEpYboxoMauuJqnD8NGw\nawZH8Lm2DM+Nfr/vUSWtrq6q6hPyYIz1zc2NvheMGU71RdRxc3NTz4fP6/n5Wba2tmR/f18ODg5k\nf39fjR4QNXz+rODAnsj1FMYZl1Hk+yIh6Lvy3gPiO5VKST6fV6KGJfuYN0zUwFHkwuBh9sxlhnXk\n8Tfk+jZ1xkbKLbEi4l0r0dHEEqRwDvE6qEutjB42UqvV0rSLoMYWfC5hxnme1tEwcO1PcMxExEPU\n5HI5veYuApvXSdvwAsQMIu7cCQYHHEgotJBmhbHB+g6iplgsKgHUbrdlY2ND7x9LRIwiafzW4lm1\ndWzAhuu8WHKT1z87t2y3KE59YgWNTQPm93DNeeyv8XhcMpmM7O7uSqPRkGq1KtVqVbLZrJTLZVlb\nW9N1hO2aZYMfkcEkDaeI2oK/PC4Mm/KG7muFQkH9ehChPM94PsAGxr6JVNKLiwspl8uedRbzkWsQ\n/ap0J8a7dH1ykTX8/7CwDrTf+7je00anmLVmRQ2M3rW1tVc5wFdXV1Iul6VcLmtlfSgAxv0uiwyO\n/MJZZ6Lm+PhYJW2Qaw+HL5HZRqMhFxcX8tdff+mmV6/XPd2AXPJtv3vCRcyEJQd5wWeihhdwZmj5\n74+Gdabfg0ByEaF27PmIx+OeBdKlqPErJvwWsmbc7zwrYzgObKTJOuVWUcNEzWAw8ChqguaXJeUA\nJml4vWVlj0tRg/WW39sSNbhHuOD0vKXVuO5nXjeYqEG0Bt+71+t5CC9EkFCUm9VrVuXJBg8/D9Fc\nSxY9PT3J5uam1qfZ3d1VGTKIGnb6LVHDqXOTjs00iNl5Bc8vzGerqCkUClqbBikUIv6KGk7Pdn2W\n39/LBiZbeA3Cvm/nK1/TUWsR39N232SC+vn52UPU8OMgalBTzCpqXKqpsMGOZZhzdnxB1GxsbEiv\n1xupqGGiBw5mt9vVFP1KpaLj0mw2PSmshUJBbdhYLKbpObjuWN/hm8C/6HQ6UqvVPApIEXcZCZvu\nFsaOmVVbxxKj/J2snWMLPMPZty3XOe3XEjt4b/7J5+IKsGSzWVVitNttKRQKksvlJJ1OK0mDADPu\nGytYWHTw92SbDfY/EDQOLj+D09+wR25vb6tPj/pOsIO5diPOC34ngoHoond5eSlfvnzRMidYYzHv\n2UcZ16+cBt6l6xPjLV8kiDUOit4xsxqLxbR4MEiDvb09LR4mImocN5tNKZVKcn5+Lufn56rsYIdy\nEeokTAuW2Ein07K7uyu7u7tycnLiKSTLqRiQ86L7TLPZ1MgER4qCSBqLSUgaFxPPsjssDJZZ5/zx\nWYKLmAn67m/5DPteiPxDTQOHAko1q5YAU436I2+9lq5xHxezasD4wRIk9h521afhdpJhiqK7NlP+\nn4h45ksqlZJisSjFYlH29vbk9PRU11s4mtzNAQcMYMhQm82mpw2iqwPGLIPnov2uHMHllIvV1VV1\nImznEaRP8N/D4c/6NPg8gCOK3FkGEVruomXXPkSqOC3Dfi92Wuy+GGE07BpqHXqQnSgkjLQnBDos\nuclzh2tOjVoTw+4B8zLnJgU7vCLyar66DrzO7/1cv1twXTcEslj6L/Kz1gWCWQgatlotVdGNOie/\ne821Lk1jD50V2DHA+EJNGovFtHDo1taWPD4+eorNcsc9ON84Go2G54D92u12dX9FcWgQBFDOIBUK\nASwQgggo2xp/3G6a6zTaItaWuAmyZWZxfO134EAGAjeDwUDrsTFBs7m5qd8bTjkra3C4gv5Ba6Al\nyGxh46enJ8nn8xq4R/Cr3W57UptBTkxC2MziWIWB9UVGBbRd4+AKELIthLWRA3qsZuLX8r11d3cn\n3W5XOp2OdnW+vr6Wer0uzWbToxJ2KWj4O/4qvGt77reoaexA+0UM/N4TTBp3Hzo5OVHHIZvNyubm\npqcWQrValaurK/nx44ecnZ3pImzrpMzr5HkPsKGfyWRkf39fPn/+LJ8+fZLd3V2Va7MzByVNt9tV\nogYH96d3SbdHRYj4p/3dnjeztHBQ4NDw/2zkG/clb5bWGJpVTIOgscbfyoo39QlEDSIfGEsuzGY7\n3OB9g+aXSzE0je/N68w8kjUgaZicdjl0NtXGtlIOirYH/c4Fa9PptHYNOjk5kU+fPsn+/r7kcjlV\ndTBRgzX19vZWI4lM1NiC0/g+8zRGfiTNysqKRtzwfViazdf54eHBY3xycT0bLeRII0u/4RRgLoq8\n7pDgV8yRvwcr4/y68U16nZYFfg60i6ixJCeCB7ifMHdYaeGnUhx1Tvb3RR8T+515jloSw1WXMOz1\nce2ZVoUKwgZzVeQnUTMYDKTZbGrNRNik4xBHTM64vnvQY/MMvj5IvUbkvV6vq8qw1+t5ijuzY397\ne+shZdDVCYpCHCDPcPBchaImk8lIOp3WewwFgznYBaKmUCioPcxBLTj+eB0HM3ltcNkysz6+vMcw\nUXNzc6NzAoEE2BzYf2CHsj0TVHsIn4fnumAfZwIPaVAiP4Mj3W5Xa0lBUQOF1SiiYtbHZRIE+fCM\nMAQOfvK+NxwO9fpaX8LV7QnzhG1NqOJYRQObM0jF/avH610VNW/9MqM2Er4B/JwHEDW7u7tyenoq\nnz590sJDW1tbugiiUNvV1ZWcn5/Lt2/fNNd0HiO6k2BcssHK0TKZjOzt7clvv/2mRA3qHPCkQRQQ\njCYiEo1GQ6MR1vj3MzYswpI0fP62Qw1aSeP/rETAOUxDBfKr8RaSBj8tSYK/uUsJK2rY4ORWljg4\nuj/pdwizEYx6v3kkayzZ6KeoscUQmagZpVhzRaHwOH4yIYA14PPnz/Lnn39qimkul1NH008VwJsn\n1AH9fv+V9HQeYR0Gu9YiasMkCf//4eHhlYzbjj0O7pjA6hrg8fFR7u7ulBDg19o8cVewhYmaSFEz\nOVx7Ge+nQUQN7iVEFbvdrtTrde1MOY06evM61yYBkzEio1U1b4WLqEFtMRTBxPmg4QJqJnLa0ySE\nmp9dvWjjjfnF5DgIaibIYf8XCgXJ5/OSz+c9e1S/39e6FdfX11pfDzX2WPHC1xGfDZI9nU4rEcT7\nJhM1uB8ymYzk83kPab+6uqrnz98NsDVdwtjCswS+560CmLsp8T4Iog3Xh6+nPUZ9dhBYTYP9Fu+J\nVJt2u61d2ZBS3uv1PMpmvMc8jMc0EOZ7hvU18ROpiiDCON0Qc5BtI67x9Pj46AlslEolnddQxdn3\nmoW18d1Tn8IiyAkMWnBcFxAFFzOZjGSzWdnZ2ZHd3V3Nv4fEFIt0q9XSas+lUkmq1arU63VdJPw6\njiw7LCGWTqelWCzKwcGB7O7uanoZR4dXVla0qj0Wtk6n8yoiYXNUebG1pNy4Ex0HR5utGoTBTol1\nfl05tYsMP+cCihomajDuWCC5vR0WQyZqwi7qy7TRjQLfz7bAnoU1Im3RNnYA7fviMX4tDhSQTqfT\ncnh4KKenp3J6eionJyeSz+cll8tJIpHwEAwwyGCM9ft9laFWq1VtVYocfyv1nkfw+VsDG2sJFzrk\n/93e3noMVL7+rKCJxWJqzMJJ4MKzaEOJGjhodbmyshJonHAUi4m/UalzEYLB6ynmhg0ccG0ae19w\n9wzMGW54gM8Y9dn28WWC3VNs9HvaBA3GGKnC+XxeC62jJhST6Sh+i6AWosfjrIdBAa5FHG8bXMLf\nKCoMNaLIz3Sofr+viohWq+XZQ6G2R4oEgok2HcmvHhRqgEE9nk6nZTgcqt3EtQ9ZVQNCB++BdRbn\nPiqQPS/gMWKShpsecN06DkIgKwIHX6fHx0dPrRqXD2Efc/kart/5/oINBbUUUui63a6u2fiOHGye\nx7GaFG/9rmyX8r0P5Sl3e+IajZjHT09P6ne0222p1+tSqVSkVCrJ9fW1tFot6Xa7gQXaPxIzQ9SI\nuOXAo57PwCCiLg2iuUh34s5DkECBpPn27Zv8+PFDKpWKtNttlVEtU4encRYQXGtuy4yIQT6f125a\nLLnHZzw8PEiv11MlDRZi/lxLxuBnGHacvwu/B7Phq6urnqK3yB1GZIslrNggsEnw+/Kk/mhMqpgJ\ngp8xYB15LJi4hlgoRV7UNDYKxTVSwp5L2EgRb4jT+M6zBL4OrrXJdf7sIHCxXxj9MBj5/TkqweMN\nJwOENxd0A1FzfHws29vbStq52nEjuoF1uFarydXVlRZmBHHLROisj40LrvFxXWsR8ZDBrFyx7USZ\nZLNFFbnWjHVS+v2+kjWYs/F4XG5ubtTgub299Yw132vzPA6zCl6n7JjaLiUiLySNLbrd7/c9adrj\nfvYyIsjmGScAFAbWBkF3zL29PSkWi5JOp5U05bWx1+tJv9/3dMCbtKHFMo633S9h09/d3SmBjbRs\nKNNY0cidngaDgZOkdhHbIBuGw6ESqbVaTWuqrKysKIEAfwOPwZbiboCwNe342WChy8GcB2KAgzeo\nSdPpdEREPHsa9j7YMvF4XFtvc/paOp3W/8XjcY8fYQNUro5DfA/Ya27nMtfL4RRG7Nc2OBNhMvA1\n39jYkFwuJ8fHx/L777/LycmJHB0dSbFYlFQqpWMCcQDqB1UqFRWnPGJeAAAgAElEQVRmXFxcaMoT\nd0ucVK34XpgpokbEe1HGjfZg8jBR89tvv8np6ans7+8rUcM91FutlpRKJTk7O5MfP35oDiq3Z5yF\ngfpVGMc4gUGJCAA6vHCECBOF3xsRDOT8MlHjGn/+PMuo4n1d1e/tOXO0MhaLaXcqEEtgwxOJhN4f\nUP/wBsGfi40+7LV7D0xqeE3jfLGhcTtmVtSIeIkazicdh+QaRSL6kRNhMUuLchiM61iwccLkKsYk\nFotptBHX2tYvYScS45xMJrUezenpqRwcHMjOzo5sb29LsVjUiBZLhUVe6gXAIGu1WnJ9fS2lUkkL\nZsIoXrQ12EbueX2EtJ0d8cFgoJE5a0hiv7OdLziKCMIZaxmcenQWSiQScn9/L5lMRra3t+Xu7k4/\nhzsmLJt68FeC51xQcWcR8SjRuMYeVKmojxB2jJZ9LCdZS8M8z/U6tkMSiYTk83nZ39+X7e1tSafT\nsrGxISKiRA3qoCDdxnbAmwTLON5sq7G9CJIGpADWTgaCdQgwMTHjCiLgJ9bwp6cn6ff70m63PUpj\nkAxQQTJ5A3Uy7NCbmxtZX1+X+/t7j9rHEuj2XOaBoBHxfg9ct36/r2krHIzgwBE6G+LI5XJ6gKyB\nwsXOv1HpwiKiP10IS9TYQNcoW3UexusjARt0fX1d8vm8HB0dyd///nc5PDyUYrEohUJBksmkx7ZC\nGhpaqpdKJbm6upLLy0stEj6qLs1HYuaIGsYkm6Ctl/L582c5OjpSRU0ikdDIBCtqzs7O5Pz83FM7\nY9xzWAZYdYtV1KBafSaT8SxUvDHa1CfIzcKSNJzzyRMKuYuuaAIrP2D8ptNpKRQKsrOzo2QNlEBM\nKnA7YXwOpyugds2yYZSihjtXuBQ1roLR0XwbH/b6uQhPNipgUGAthLNnawVxhIl/ou4XIlcnJyfy\n559/yp9//in7+/uaBpVIJJwGCgwybvOMaCNSTzH/FiHlCbDksl3jEOW1beyR6mRVbJZ85rUNBxSM\niO4iMj8YDDT1IpVKyfPzs2xvb2vHA7wX54NHJM37whVMcBE1HK23RA1sl7dGb5dxjCch+8fd912K\nGrRft0QN1kYoarB3vkd0fhnGG/sixgwkjVVq28AiP8bPdala+W+odzCn2+22zmPu8ISaiHh/1KoB\nWYdAoa1fNoqkmbcxhU0NhREKZt/f33uK3Iu8fDdcSzQCsYWe0TkLNrqLXOEUYL5+nLLEcClz2K7i\nLosYbybX5oU8m0VYJVWhUJDj42Oth4jAE2oVwUe7v79XtRwUNSjOziTsLJI0IjNO1IwDSKE2Nzcl\nm82qA44IL8tKIWVEAVsUZ+N0DJH5W+h+FVi5tLW15WkhGo/HldjgTYUXJxRKBKnTarU0r5A3OSvr\nZwbcMvDcdpjPk9lyOKeYzIj87+zsSCaTUVY+FotpesDq6qpGLjntCZvwLKfG2XPiTeet54ux4fo+\nKHyZyWQkHo97ZIcg5lCsaxaYa96AcX/O0ybK9yDuUSgmQKAinx1GBdbH/f196ff7kslkPLUPRLwO\nI0ec4DTG43HJZrNK1hweHsrR0ZFGMjhqaCNFmK+DwUAVNKVSSb59+yaVSkXvD0Qi59XoFHk930bd\nW4io2i5oT09Pr1LHLGnDaySvmXDqcaA2FJNgXEMBc5TVV1xHAeeIe4IdiGmtLcsKduBc8nmODqKm\nU61W05SMMLn1LscjghdWjeC6XkHX0O/aW8eO909OEYdMHy25G42G9Pv9uS+oPisImhsi4TsA2fXO\nkjQMDlb1ej1Px6jn52e9H1gt56qB45fmZM9h1HedRVh7nhWEbIvguZibTLjc3d1pTadGo6HB13Q6\n7fEhQKhsbW0pYZZKpUTkdSdNe1/Y6zvpnAxaXyK8gANTqVRKa87u7+/LP/7xD62FaJuYcC2pZrOp\ngowfP35ItVrVdKdx62R+BBaCqIHhyEW4CoWCDmaxWNQoPypFt9tt7Z3e6XRUZTNrRYRmFSw7TKVS\nksvlNCeUc+ptNB0qHM4nRfTdMtogV9hgxaLMGxacVDh4+JyVlRU1hEAmZLNZlUWCqNne3pZEIqGL\n83A4VJIBtYz8OunM4r0SdD7TOFcm6nB9uUYR3wciP6ODTNSgjoIrGvUr4DK4Zm0Mw8AaNlBg9Ho9\n2dra8uS9Y75ubGwoUfP09CTZbFaJGuTsW0OFC5siFxwGELpT4Egmk55OFZaoAWFwc3MjtVpNvn//\nLn/99Zd8//5dKpWKdDodJfJAWMwz/Mgav3uO0yixvrGK0BI1Ii9RJldqFO4PJvRs56/7+3uJxWJK\n1HQ6HZ3b8Xjco6jBueNe4nVxXufRLICvKZwHRGVheOL6sowbRA26o4XZk6bhHCzqWAeRq0GEjVVf\njCJrmOhk5wJEDVLDmaiByjvCZLD3vYvQcI2dy15wBXnsZzGQPoU0ViZrRESVVNgjuZGJJWtcddtG\nETTzMFex54mIpwU5umbZIC0rX7AHcYpZIpHw1J60wSYof9PptNb+4UL9TAb5na8fQWbvET9EJM1o\n8JqZSqVUQfPHH39oyj2EAhyg4rRGEDXfv3+X8/NzT12aeWhWMfdEDRurUExYRU0mk1HnAfLRTqcj\n1WpVa9KAqJlFx3vWwI4fiJp8Pq8Oup+iBhsaV+rOZrOeSt0iL4seiDcUA8MiC6IGGxZYdMiDOdqM\nBRn1c6CgAUGDY2NjQ4vEQQ7L6RmcfoBz9Kv2/5F473vXOodQbkBRw8Tb+vq6Gp6WqLGE6EeSNPz7\nPKlqsBlxwUEoapLJpBI1uG+ZqHl+/tlhCDWaQNRwxJfVGWgVzMYNDkh9uX0wNle+jkwqDQYDJWr+\n9a9/SbValVqtpooajhbOO0Y5f/YaYW1ZXV2Vx8dHj2wa8FPWcA0tvJ817nGsra1plHdtbc1D1ICY\ng5Fs1zpWWXFaTqSqGR+4Zizp9lPUsOLCT1ET5tq/haxZdAn/OIoa13OCSBp2OkCGgpDDevn4+Bgp\naqaMIDvDrs/AqPkxjsKCFTVra2seRQ3GHXOc7VAmX/kIImvmSVHD+yEHKdi24SAEF+a1RAqCh1yI\nHb4D/AvYKdz45O7uTkREA8jY01yfweftuqdczw1L2kRwwxI1h4eH8o9//EP+93//1xMkRPMEkZcu\naS6i5uLiwlOc/S2qqF+FuSZqrEOez+dlb29Pjo+P5eDgQCvpc8VvdL5oNBpSKpXUOQCzNsuDNWuw\nDoIr8ut6zfr6upI7KJL3+PioCgy8FsRbIpHQqBMrahBpAFGD93IRNaifUywWteAUFx6LxWIqk+O8\nYDaouDCqiLdl4qzcN+9pPPOGuLa2pikwxWLRU5AZOaJra2sqP+z3+9oCD4qJj1ggXUb1vG6irKjB\nNW6329pZIpVKqVqCiz5D4ru+vi7JZFJVMShUaMkajDV3SeODn2cdGFaG4Pw6nY6USiWNblxeXurj\ny7AOB0VvXaQO0o1cYOKUyXA+XAY93h+KHax5iPQmk8lXXRCYqLHpVqzgmSey86PB8wXFnaE05Vpf\nfE/c3d1Jt9uVWq0mlUpFWq2Wp8bUNNbUaPxeY5y9wk+ZYWtagKhBIAgkLZx6tIxF/YQI74Mgcs31\nt0st6ue44yfXlcJai65GmLurq6tanw21M7hLpk0Z9yNm5nXu8l7H9g3PG0vUMGzTg5ubGw9BgwOp\nVQgG4/qz7+Ca61ZBA1IN6ic0AEDaml9dt2h9DQZfe9iomUxGPn/+LL/99pt8+vRJjo+P1T/EPolx\neXx8lG63K9VqVarVqlxeXkq5XJZarSatVkvHisnBWcZcEzU8KVOplOzu7srvv/+urboKhYJsbm4q\nYw2GrdPpSK1Wk4uLC7m+vpZer+cpZjvrgzYL4EWUOyTx4mSLcTEBk06ndVFGlP/4+FiNGTyORZZV\nOojwMlHDxX/586D2QA4qV4GHWgfF3HDeNm2Li+WCMBLxEjWzhPcma5hsKxaLcnh4KNvb25LL5V45\nF5hzcNLRmSRs5Pc94BcBnbf5z444iqXVajVJpVKytbUlmUxG7u/vtTYXHGqksyDilM1mlTzje54d\nC8xFqGdwuIrl4dxEROfp4+OjNJtNuby8lMvLS/nx44d8/fpVrq6upNVqSb/ff6VonJdxGIUg6XSY\nSHzQ/y2pw89zRVr9/gfnEN1P0um0JwUNBwwbF0HPBu6ijN2vAK4d9sVisSjb29taN43TnrDfQREM\nogYqtGledzuO80poTwpLOFrF5ST3uZ+iBqlPIvLK+QvbGXHU50YYHzz2rr3REgt+9wNsS+7WBpsI\njiXUI+jyBXsWxcJt7TbXWs7nPC9wzSkuYo/n4HER8bUTeHzwHFxzXGPUZEN6FauHueuTJWzs9Yb/\nYwu7I2jMhd1n0U+YdWAcc7mcdhb9/fff5Y8//pC9vT0tvg41osjL2Nzf30uj0ZAfP37Ily9f5Nu3\nb1KtVrXDMK+p8zAuExM14xiY7wU4H2tra5JMJrUd93/9139pO24MIgYGDs319bVcXl5Ko9GQbrcb\ndXkaA7ygWpmmjcBaKb7IC1GDYsRc3JTJGK5Jw3UQWB4KY4YjDwCMX0gfQbRwmgYOmxLAaVuc4oN2\nijiHWV2A38tZchE1BwcHr4gagBVPrKh574LdLlkyY9zHZxEcWULdinq9rgWDd3Z25O7uThKJhBoe\n3HUikUioA26JM0uu2iK1/DcbM3zfcRQRBd1+/Pgh//73v+Xr169SLpelVCpJs9n0FE7EaxcBoxyk\nsJE2V9TUL2rvMuJdn2UNThDeiOKj0J5Lai/irQ2AwxLz44zjLNgUvxrsDDBRAzUwRwpFRGumocYe\nWtmjQ8p7nN8yIwxJE+YaWUfftvSFjSMirxxA7o7I5xIWyz6G04BVWvB6B7jWV6ss5cL/KHoLOxpt\nqNnRZ7IGjr9VzlmiZh7hR9bwY/w3XmOvP48R12UDwYUjkUiozcPqUCZqXCnHfK1t4Wdu5hDVPJ0c\ndp7lcjn59OmT/M///I/88ccfcnh4qN1F2VfjPfLh4UGJmn/+859SKpWkUqkoUTNrmRCjMJeKGkwe\njkjkcjnZ29uTT58+ye+//67y4fX1dZ2cHDGs1+tSLpdnIsI/j+CFihUtLNPkDQ2Ak7+6uqq5osx2\nsxNonQAGs+RceM0W3EOxPpcqhycqt9jmTZUlkXZR4CjzLN470yZrePFEe/NisSj7+/saAUaNIt4U\nUTul0+lIr9fTDey9IkC8uY5zDWZxDEcB9zB3CllbW5OdnR2tXQGiRuSFcLHRIj8n2ZI3/HyXPJiN\nGDiVMF6QI/yf//xH/vrrL2m329JqtdRY5YjZImASB8mPpHERj6PIxjDzi40brOVYx+EU2NQnnA/L\n0dlxeavqYFlgnT4QNYVCQQqFgqRSKVUE25psaDVaq9U0ZfAjIurLMr48B+3fowgbXjNtyhMOroFn\n7Q+2LyKSJhze4760ZA0eExm91loFBmyijY0Nz/9isZgSMzhA1nAqqiVnPmLuTxuu/cLOu6B9kOcI\nkzW8N2EPQ4o1bFnUW8NhA8P8WS7SDTZOv993BjrmiRSYBXBQsFAoyOnpqfz3f/+3/PHHH+rbJxIJ\nz2tgw6B5Sb1el4uLC/l//+//SbPZ9NRymzdMRNTYxf9XbdbWsEExWjBuBwcHUigUPF1nVlZW1ImB\nkqbZbEqv13O2gY0QDiAqbm5upNPpyPr6utRqNT1WVlY89WVcEQkAjDYKn8L4dxE9ABxPV/FTRhBL\nbhduLLIg8hqNhjSbTS2AOxgMXuWML8sCjLHg4rLo9mVl+lBSYBPDtePNK8w1c23QQc+1m/qigw0T\nEGK9Xk9isZjUajWNuOP/6N5k52DQem6vq4vY4XNh4vT29lbTMyqVipydncmXL1+kVCppp5r7+/uF\niAi6MI37MSzZ4YrmjoKN8HMHN+5EY9dLvjdsTSNLuE1C1izafeACrj0r07hTCaeQYq+FEQr1KBw4\nEGoi4a/dMq2T04SLMAlyHnm9RLFSkHGZTEbrKzBRw3vtqAi//dygcV02xRqPy1u+uyVmeB209b/s\n+7sIPbyOlRhQjKytrXnIcgQ+g1p0L9JY2uvl2jvG+ZsDPzZ9F6ridDrtae1s6+3ZccP7wPdpt9vS\nbDa1izCU4ywACDtOizSW44Dn5/r6uqer6Onpqezv72vwAtkQFlCV93o9KZVKUq1WpdFoeGzNeQ0E\nvklRM2qzmiasURmLxSSTycje3p7s7+/rYEIyjG4JIqJEDSJQnIIxTqeECD+BBRRtdkGa4PpeX19r\nOhHGytYysJ1hbKTWFb1g2IguPufx8dHzPDaErdPBCy8XvG00GkrUoOMCpKjoEMab5zzdO0Hz1LUp\n8rXnvHp0Acrn8zrntra2ZG1tzam04ujQuDn3oyIqrueFeb95GrcgwJG7vb3V+VSv16VarUqhUFBj\nP5lM6mv81DT8f1ek2G8scNgUmvPzc/ny5Yt8/fpVLi8vpVKpSLlclna7rUboohmbjKBo+6h72CpT\n/F7j937jkDWc3slEDdZ2vJ9fjRpbUNjve4z6vssAnnfskCNNN4ioQbFKduQ4HWKcz/f7exJHdpLX\nzRv8VDSjbGDMMQQ40JUURA1sVbZ7YNNg7WYbytZWCEvO2McXZbyC9jF+3HW9/K4Bv6drfjw9PSm5\n4qqX4kfS4/88nzm4tbq6qqnCIHH8Oj8t6r7pmlv2f36vc5ErbJvgAHGKQrWWqAlTcw9EDWwtF1HD\nihrX91jE8RsXdq5Z3/7k5ET29vZUhIHaiIzhcOip01gqlXQ82u223NzcLC9RI+IuODftm88aNtjA\n0um07O3tyefPnz2KGs5dW1lZUaat0Wi8UtT4TaQIbrDRDVYZtX9YUQPJNqS9rIAJImCAoP8xoQNi\nAIoclxFj06fw3syOQ43QarX0O4Cs6ff7Gr1EoTdM+nnaMMNc7yCHCk4FIu/pdNpXUQPyi0kaKwed\n5vlP8h6LYKyykgW1f+7v76Ver8v19bXkcjktqF0oFPR1b52DrvOAsYl50mw25eLiQv71r3/J//3f\n/2nhdqSbckRy0RE2qjvKwA96/zDPs+D1EUQNSAJW1LDBa9dWm05qC0Hy9wob/V8GsKKG1UwuooYj\n8EGKmjCfGfQ3HptkXVyE9XQU/EiZMN89FotJIpHQLntM1KBBgciLStjWBOO6ebaILSPMmh5Ens4T\nwn5X19/jvrcrMGGJkzDvj9eBqBERDWwhAIraRKz69yNq5n0M/TDJ9+LX8D0OmxQ2v4j4EjU2NdyS\nPRgfEDW1Wk3K5bJUq1Wp1+uqwsfazIFoe37LDkvSMFGzv7+vjYH29vYkn89LOp1+lWWB64hGQdfX\n13J1deVR1GAc5vWav5moee8vbgcQ7dWSyaTs7OzI7u6uHBwcyO7urmSzWYnH42rcQIKPwTs/P5fv\n37+rwzCPiohZgCVrkB+PnMDNzU3pdDraBjufz2uHpWQy+SoXlJ2FoM+0GyT/zt1J/F6Hv/GT2x+i\nOCMOqGkajYYSDMgrBlM+b/eNnxPoB7uIcn49ooBcABHGxuPjo7RaLWm321KtVpUYdRVGDHsOk5w/\nXjPJ/+YNmIsAusLA2YPMl2s2cRqUSHhHy85BLnqI2hkgxf/zn//Ijx8/pFKpqIoGqiq8VwR/hIma\n2+eGhe0+g2LpUNQgis/vb/dL3D+28xP+Zx1Zv3tsWe4De3342qOOGqsrmKTB/mMJ77A2jJ8yzu+5\n447JsoyhSHDNGgYHiRDcKBQKsrOzoy3Y4Rzi+q2trWnb4EwmI+12W+LxuJKnbOe4VATAshKhYe/z\nMPaEHWNLkIzrfPPeCadfRLTjk4hXtcE2ky3oHjn+o2HJGq715RpPXF8ed4wFVDRQ2DcaDbm6utID\nHfj8CglH4+OFnaewR7ioPte/5G6yvDfiQDvub9++eVLsF6Gg80REjZ/BNSlz7Qc2AldWfrZrxuaF\nria7u7uyu7srhUJBNz1EdrHgNZtNKZfLcnZ2JmdnZ1r9eRlY6fcCM8wiP9PL0NXl7u5OyuWy5HI5\nyeVyks/nZXt7W7a3t2VnZ0cSiYR2YcLkYymbK/LMjDhvVlzUC2ls/Hre9LgI2/Pzsxb/QptEJmfa\n7bYWOwUzDoUIHM15vG/8ztcv0s1EKStqUP/JRnqhnoGjXiqVpFarvWqLN+q6+RlQ41zvsM+dtzH0\nA5OWIGqGw6Eq20DUpNNpyWQyr+T29r38PsOur5gnrVZL6+JUKhUplUpSKpXk6urKE2FaBgWNC+Pe\nj2EUOJMA78u1adAJj4kazHF8vp9zYskaJhlcEfxp2QfzDDZMQdSg2D1fH07NhZNwc3OjxTDfg6Th\n50WOoD9c9q7L+UBAA+nCxWJRdnZ2JJfLSSKR0IAV3m99fd1TA67dbmvEn9sK2wBUEGGzqGPnuub2\n56TrqIukcakLw/oQPFZM1NjvwGQCN82wxaWjuRkOvPfAd2C/gH0HpEWJ/Bx/BKKRpg07B4Fd2Djl\nclkajYZ24OP3m0c/4b3hUqtBPbi5uSmpVEry+bwqaRKJhMdHxJjyOLbbbSmVSvLlyxf5z3/+I+Vy\nWbrd7tyTNCJvUNSENQ4mvUCuaP7GxoZuXkzSIH8tlUp5iBo41s1mU0qlkpydncnXr1+l1Wp5iJoI\nk4EZ6efnZ6nX63J7eyu1Wk1SqZRkMhmNIJ2ensrJyYk8Pj5KNpuVTCbjMUxE/POB7cZmCRtuAQwj\nBu+FoqauVrNMxrTbbel0OtqFptvtapoG2HFuxTePippJwE4YK2qQFmGL4sViMel2u9JoNKRSqcjl\n5aXU63Xpdruh6/pMIxK4DGPDsHOx2+3KcDiUfr8vIqJF8xKJhKYKomo+O9ZB74//s/z34eFBWq2W\nGisXFxdyfn4uP378kMvLS51DvV4v6oAwJt4jQs77KtdHgVI1Ho+/Sn2y0UYePz+Sxm8tX2SncRT4\nuljiG0QNZPfs/HF3EU69dQULXNc3yJEF/MZkmccrLFyEJMD7Zjwel0wmI8ViUXZ3dyWXy71S1AyH\nQ1WOw9ZtNpuSSqUkHo/reo75iN9HramLTI66yBq/+zzoPRj29Uyy2Os9bvDI2rN+Kh3YVhxoHKXo\nieAP3sNcJA2uMbCysqLpZ1Ay1mo1qVarepTLZQ1M4Tm2rlA0Rl64SBpeJ7H25fN5XSctUSMinjly\nf38v7XZbrq6u5K+//pJ///vfGoRfhGs/9fbcrkEY90K5NjowbclkUnK5nBSLRSkWi5LP5yWXy2kr\nS2ZBe72e9Pt9LfaEXuooamrrmUQYD1iAoKyAEQmZL1KdcrmcRgEfHx+lUChoi7VkMqmpNBsbG84N\nkpUCdsNyETW8UXOdFEQhcYCkQU4pHEpIG1FXhT+XD74OiwhLlnIBaJGXuiggPTEO7XZbKpWKXF1d\nSalUknq9ro76qLSniKSZHGwQoONAv9+XjY0NzcOOxWKewmqI5nJetog7ms7RKE53urq6kouLCz2+\nf/8u5+fncnl56akDtazjMi1Yh2RScPADRWw5Hc5FGPA4upSNeN+gz8R34MeW5Z7wUyly6hlfczhx\nDw8P2rJ3MBjoHou9zH6GJcPCkDQRpg8/Mi6VSkk2m9V6C5xiiLmGoCQUOMlkUuLxuM5Rno9M2DBc\nah+/5ywKLDkcpCLzI9eC5oaLrOHHR8GSMC51uCVgXIHJyPkfH3Yfu7+/l8FgIJ1ORxqNhuf6cwF9\nNKLBgWYIlUpFCwhfX19LrVZT0scWf7Zjtczj5rcfudbJTCYjuVxOCwizKkrkp/IMKtN+v69qbqSi\n8Ro575gqUeO3yIWN3vBzrZIGEQmkPiEagU4zIuJhoDmVpVwuS7PZfNWtZ9S5RAgHNg6Z5by9vdXH\n1tfX5eHhQWW8OBC5dRXxwntzZBGTjyO3TOJw6hMUNbbNIQ5OfQITjgOpPFh0rZMySTTlvTAtB27U\nZ+D7Q4YP+Sei8Tg6nY6SNMjbRdHpcaNA0/5u1pGZhfF7D2BOiIh0u125urqSlZUV6Xa7SnJvb29r\nJB+V9Ll7j4g3xZHz5nnuoNMbGy1cAyxSLk4PfvNh1PV1ka4IfiAVdWNjQ1VymOtYT0GEc10vEOOW\nPPc7b9f/FjnSHwSXEknk57zFdcZ8RJpur9eTbrf7qtWo635wkWB27fPDso3FNOCaly4yFKo1m+rm\nF5yEgpXJVE73tvU0gggavz1v3sfbflc/dRP/D3CRNH7+yrSvE2xl2LLc4Y3rLrrUPjyXl3UNHRes\npun3+1KtViWRSMjDw4PkcjnJZrOSy+U8pCkTNf1+31MeodlsSrvdlm63q0FoV3paRNL8hN8+tbKy\n4rFFQEwjaIQ1EsQlq9G4gc23b9/k+vpaBoPBwtmdUyNqRi2IIuELI9qIk21dmU6nVY3BHYWweT09\nPUmr1VIVTalU0u49MCynVSchWiR/At8fhgNSg2yKxOXlpZIzIOC4awgrN/C+vFFi8nFHBKioMDkZ\nIBbYocBPboMIKbnNB3ZFkGcxouF3Lm+5P60xwDnTTNRgjmJMu92uRhyq1aoWWJs0X3fc57sM17e8\n3zyCieh2uy0iohEhrh2FIt9wHuAcxGIxp2oNxYA7nY4eSBtEyiCIzyg/+30w6XywyjgYR6hLY4ka\nzHURedUWGn9zsUteF/FZQeQMf5dFVtfY6+8aD2vD3N3d6Tg9PT0pSdPtdlVRw066nxFsEUR8hyH7\n5nmM3ttWc11bS9RgneVUN9sKmIlUS9RsbW2p7QKH0o6LH0mHn4vkOI7jZ1ilmR0vOz/5vfz+Dgt7\nzTmoyYQtq21soMO1prq+UwQ3QIKJiBI1w+FQut2uZDIZrX0KWxcBZ5Dk/X5flfewc1CTEeuxH0mz\nSHNuErjmop8twgpC+IciL8FH2CV3d3dSq9Xkx48fcn5+Lt++fZNqtapEzSLZnlMhaoJImnHUNPwa\nu1lx60ooalKplDoXmFycr1atVuXi4sJXUfPWQXxvFcO8gbx2PmEAAA4oSURBVCcGV7QXEWm1Wp6N\nkI8w9Q0swLZyC1OcA4MjE/YnL6ZMAtkNnDfPeZ38b93E2WFnogZt0Zls6/V6ynI3m01NIfsIx31Z\njRcmLRFBqlQqnmLC6XTa83sikdB5tbGx4SEmuR0wWm/jYCUa181Yxus+q/BT1KAbGIga7KOsoBoO\nh6EVNX5pGGGI5GWaq649UOQlsHB7e6v/g/qz1+tJp9PxKGrsXjktxYwrih/2/WcR416jaXweBxqZ\npEEjBU53s+dnFTWsWL2/v3+VLuX6fGsTLRpJ44LLdvMjbFykBxMm73mt2N7kzxYRXXPD+ilRsDgc\ncE2Hw6H0ej39Wa1WPXaQiOi1t+ph3v8gCnDVGeLPdP2+TPDjB1y2CBM1VlED+4Ibl9RqNTk/P9fu\nopaoWRRMhagJitIwghxwPI7oEo5UKqUHWj1Dpob6JlhYMQnBcg4GA+n3+5rKYp3zaWJeDZj3RNAi\n5RfltUSN3+sQeURkyfVckReHldOm8JNfY40Za5gGMeSLDP6euOZsgIqIjgHGESROp9MZ2arQFbF6\nKwHK7xE0Tss0hmz0IUKB9ER0PUMEw6WowVyDE4noPmoPjdPRK8LHgddX3BdIZQQRAPKNUy1gqKIF\nZqPRUNLAFk8cl9BexjWV5xXabrfbbanVarK+vi63t7daM2h9fV3q9boe1WpV2u221qHi9Ij3vobz\nOkZh94T3+FwOcIDwHgwGutaiaDfmD+Yi18uDDesiRv1sk2UjzC354rIlRhHGfn+7XutS5bjel+1b\nC4whEzV4HStsRtlEyzLGbwGuEeYjSjOAbEFdUxus4ECUXx0aa/e47Nplh50LsDPX19clk8lIoVDQ\nzsDpdFqDhRgHqH1RcxT2CsqcdDodDRYuGqaW+hRmweKf9n88iLyBofJ9NpuV7e1tJWuy2axGgDm3\nE84HyBpItV3pTtMmVyKyJjzspjpKxu16PcYbG5rf8zh6YRfVsOz3vBo80zhnu8HxeyLiwGOHQm1c\nAd9GHYLO7S3n7GeMz+PYTRP4/ii0PhwOPZ1kEN1lkpwNfVai4XW8tkZpTrMPu65yLbHBYCDdbleN\nHlZWPT4+elJvqtWq1Ot1JWpQnNpluLocZNc9smz3DRM1t7e3srq6Ks1mUwnSTqejaoq1tTVVr7Va\nLa2PAKImSMk0zfOdd3zEd2BHA5FgBBCRuo2AB9ZRkHY2lRRkjasWBn8/u8cuwtiFhbUr+bFRdqUl\nsfGY/T0s4eenIOfXYx2AEwpAZTAcDpXE8/u+rt8juMF2EFSJmJuDwUA2Njb0ebxGMzljyyGMIkSj\ncfkJ+Peog4hAxObmpjYIQhfnbDarRA3q5EFdigLCsEnQvbfb7crt7a3vXJlnTLWYsCVrrGrCL62F\nH0fxYAxgOp2WXC4nhUJBisWik6iBo44JB4KGu/1wa1j72dMma3AtIgTDb5MJQ9TwBA77OaPImXHO\nd1lgFTVw2uGwIzLI1xb/QxRxFEE27fMNG0VbFtgxxHp4c3PjSTu0qjY7T5jwHFU0L8Lsg4kCqGVa\nrZa2DEbE6+HhwVOTiAspjqOoce21y3jPMPGNeQhnbTgcyt3dncTjcXXkV1dX1RjtdDra+QkdCcNE\ndCN8DJjkhhoR3btA0oCogTOIbjQgRkGGcsoFBz7svrrs67GLpGGEVf/b17tIoHHUNNb34XGyhcHh\n0LLixs+uWdZxHhfWDoIPgXpgIBDsa+w8c80512dEeAHPBe7ijLRrEDV7e3uyt7cnmUxGNjY2PA0N\nRORVYAmKmlarJb1eLyJqxgEvaH6kDH7HTzgKXDh4a2tLCwfn83kpFAqSy+Ukk8loO24UG2InkjsA\n2ajDOKqNCL8GkfE++3CpkmxRQ2t4cKQ32sw+HhxNWsTNLII/XI4cF65FFB9dFEHSrK2tycPDgzqN\ncCA57YnT3oLSnqJ13msbcbABkfPh8Gc9IChp4ORxKgyuuV+9vWW8rrMKm0LR7Xal0WhIMpn0pEFh\n3EHUcHeZer2upCgX8LYkuYukcZGly4Cwc8CqW/yunev9RgV5baaADYjw5zJRY0mbZSfepg2+lmwH\nTZL+Fo1JMOw1xP0PGwP1t1CbBsQNNwliJf/d3Z30+33pdDrSarWk3W5r4IIDRouGdyFqRILZZ/uT\n5fY8cIlEQokaKGkymYy25eauQTB0LHMHY4fbzmKiMpk0yYRzEVERIswzwiqU2Liwxk0UcYgQYfZg\niVRE+UVEU29ERFtD40AxW6RsDAYDVa1yKkYYR2cZo8B+tgbIMqy5qJnw+Pj4qhsQK4RdLdGX8brO\nGvxUEyBE0d4X6YSpVEqSyaSkUilPisXNzY20Wi3P0Ww2teYbp2HgM1z3gB9Zukgp+i4bPAxJbMHk\nqX2+iygJU58Gz/PzSZiIsUSNra2I3/k8FmkcZwF2PEdd2+jah4NfZg03C0JRdQ7y4jVYQ1Gfptvt\nSrPZlOvrayWwXXaIyOKM0dSJGruI2AXNKmqsHMp2eGJFDYiaVCrlkQZDImjl+8ze2f+9x/eNEGGe\nMO49y/c65Lgu5wM/F3HBjBBhWvhVabJ2T8bcZTUHjru7O62Pgv0VBhIUAFBzwGF0qWnsOuA6n2UE\n20I8DrhOLMXn+wNppEEpZst8XT8aftF4ONhQytTrdS3Oje5P8XjcQ9Tc3t56Ug1BjHLXUtwDIuOn\ndC/afRLGoQ5Davg9z++6jquoAUkTi8U8r8d78HhasobHO8xnR5gM9ppGafTTgUtdhrkAH55JGetX\nc6MgdB29vr6WVqulRM20ujnPIn6JosblELoWMUihkPrEihoUFEYb2a2tLY+UkCNT/N5M0uAIU0U9\nQoQIbrBh6BeBcDloESJE+AmeN7/K6HbNWyYB7u/vPbUzYESJvNTPQK0360S4iklHJIIbfC1w3WzR\nRH4uKxRdEf8IHwuX3QmwagopTre3t9JqtbRY9+bmpqZHIRWRU9380vijuRUeowgV17UM4yMEPcel\nIOBC/YCtQeO3vo7bcCPC2xHNrenClQoI9Sjvg7YGItZH1O9qNBpSq9Wk1Wopgb3IXUffjagR8ZI1\nk1w8v/xRl/GCIsIoMoScNVfxNcvWTUMOao3fCBGWCWGjeb8C0VyMMOuYhXvU7qWc283GkYh46r7Z\nWlV+Shp+r2WHX8AK/8P//YiaiPieXQTZj3CuuUOlyE+CjtMLQZjiedwEIyjFLbonxkfYtTdozob9\nHKtg5L9x2LWS11TbrfatPlWECB8B3K9sY9zc3GgdGtzrNzc30m63pdlsSrValVKpJCIv5GW325Vy\nuSzlclkqlYrU63XpdrsepeEiro3vStSIjLfYjVo0XZJELGKoqI+2XVwp3252fggrc/PblBfpxoiw\n+LCEZRCsYRPkdPDPj8JHf36ECKPwEfeoVbryHso1L56enjTihf9Z5cyoLhjRHPTCXg92uMIoE6Pr\nOh9wqSVEvOlQDw8PnsgyO+go0u8qGuz3ORHGw7SJcpc9hDGF4p8JcVYU8Bpq19RRxcKjeyDCLMOu\nhZzmC5KGU0Pb7bYkEgmpVquSyWQknU57/G2kj+JAi+67u7vAtXLe8e5EjYi7GJeIv1SU/x/0Xmwg\nWqImSFFj4Ue8uB7nTXfRboYIy4lRZKrfPLSpjZEjESHC/MAaUXgM5AxHfC0x41J6RA7EeHA53n7B\nouh6zgesugakJ0eUud2sa864UgrtZ0R4O8Jcx7C2UdB7cT0//I4UKPzfpnq4fJxo3CPMI3hds8oa\nJmmgLlxfX5dEIqH1u7i27N3dnbTbba3fBUL7/v5+YdOeRH4RUQNw9M6vfs3q6qpKolZWVrRNJTpP\nZLNZZdpYgg02Dj3Va7Wa1Go1T1tDlh76RbciRIjghTU+Xf93/R4hQoTZBxtS/Ld9zihyJszfEdwI\ns7ZGmA9YAhR1EVklYYt429fbmkQi/rVUIrwvcK39AlZAkCLfvoddS/2IGn5uhAjzDLYzOBWQFWYg\nMXu9nmxubsrGxoaHqHl8fNTOk4PBwLew/qLhlxE1vCAxQbOysqKbFxdMQ80ZtCoslUqSSqW0pWEi\nkfBsaHd3d1qjBgWHcGBgbWVoP7VM0Ga4qDdChOVGkDHC//d7TTQvIkSYfYxKc3QV2nc5DGEcxmhN\niLDMsI6JqxDsKFLU9X4RPgaj1DVBZKufgsrW+xpnfY0QYR6Be5pTrbnL4erqqjw+Psr9/b227cbx\n9PQkd3d3Hl9+0UkaEZGVoC+3srIy1W/uSnUSEQ9jxm268RPH5uambG1t6cELHYgeHLe3t3pwO1HO\nkXM5p36b5EdgOBxOpbT7tMcxQngs0hhOYqRM8zM/ck4u0jguKxZxDIOk967/WWeR51dQxHiWiJlF\nHMdlw6KN4SgCdNQ8Y8yTkmLRxnGa8BtnXntdChuL974HojFcDMzLONr730Vicw0nfpzVZ5xSOuvr\nZFj4jeEvT31yXVC/1tpcaAusG1oarq+v6+OcToXovm1r52LerLJnUQY7QoT3gCuiFM2ZCBE+Btb5\n85Phh93bXFJ912MRIkQIRlg1zEcEPyL8GkTpjBEivEakFhsfqx99AhEiRIgQIUKECBEiRIgQIUKE\nCBF+4pemPkUYD/MiZYvgj2gMFwPROM4/ojFcDETjOP+IxnAxEI3j/CMaw8VANI7zD78xDCRqIkSI\nECFChAgRIkSIECFChAgRIvw6RKlPESJEiBAhQoQIESJEiBAhQoQIM4KIqIkQIUKECBEiRIgQIUKE\nCBEiRJgRRERNhAgRIkSIECFChAgRIkSIECHCjCAiaiJEiBAhQoQIESJEiBAhQoQIEWYEEVETIUKE\nCBEiRIgQIUKECBEiRIgwI/j/3p++8Tt5LoQAAAAASUVORK5CYII=\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "encoded_imgs = encoder.predict(x_test)\n",
- "decoded_imgs = decoder.predict(encoded_imgs)\n",
- "\n",
- "n = 10 \n",
- "plt.figure(figsize=(20, 4))\n",
- "for i in range(n):\n",
- " # original\n",
- " ax = plt.subplot(2, n, i + 1)\n",
- " plt.imshow(x_test[i].reshape(28, 28))\n",
- " plt.gray()\n",
- " ax.get_xaxis().set_visible(False)\n",
- " ax.get_yaxis().set_visible(False)\n",
- "\n",
- " # reconstruction\n",
- " ax = plt.subplot(2, n, i + 1 + n)\n",
- " plt.imshow(decoded_imgs[i].reshape(28, 28))\n",
- " plt.gray()\n",
- " ax.get_xaxis().set_visible(False)\n",
- " ax.get_yaxis().set_visible(False)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Sample generation with Autoencoder "
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 14,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABGoAAABsCAYAAAAyoVQIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnUlyZNlWtbcXKlySS4qITB5Ghx59zGgwDXoMgAZDoQ8z\nYABgRocxMANadJ+9JDMK1eFy978R9h19d+m4Innv+k9hfsyuKUJyv/cUu1h77X3OnWy32zq0Qzu0\nQzu0Qzu0Qzu0Qzu0Qzu0Qzu0Qzu0//42/e/uwKEd2qEd2qEd2qEd2qEd2qEd2qEd2qEd2qF9awei\n5tAO7dAO7dAO7dAO7dAO7dAO7dAO7dAO7X9IOxA1h3Zoh3Zoh3Zoh3Zoh3Zoh3Zoh3Zoh3Zo/0Pa\ngag5tEM7tEM7tEM7tEM7tEM7tEM7tEM7tEP7H9IORM2hHdqhHdqhHdqhHdqhHdqhHdqhHdqhHdr/\nkDZ/64+TyeTwSqj/xrbdbidj3Oewjv997bCG/zfaYR3/97fDGv7faId1/N/fDmv4f6Md1vF/fzus\n4f+NdljH//1t1xq+SdRUVf3FX/xFHR0d1cnJSR0fH9d0Oq3ValVfv36t1WpVx8fHdXx8XCcnJzWd\nTmuz2dR2u63tdtt+f3x8XJvNpp6enurp6amen59rNpu16/n5ud1vu93W2dlZLRaLOj09raqqzWZT\nm82m1ut1PT8/1/Pzc63X65rP53V0dFRHR0cMcvB8rvl8XsfHx3V0dFSz2azdZ71e1+PjY7tWq1W7\nT1XVyclJ6//p6Wnr09HRUZsDLs8JfXx+fq6Tk5P23fl8XpPJpCaTyWBc9FmLVf/8z//8h6z3q/bX\nf/3X7bmTyaS2222bg/V63eb87OysTk5Oaj6ft/4+PT21OfKYq6oWi0Wbl+l0WpPJpKbTaW232zbP\n2+22ptNpu7yOVVVHR0dtLZmrxWJRVTWYS2RgvV4P5Ofp6ak+f/5cnz9/rru7u1oul+1C7h4fH2uz\n2bT1ODk5GdxvtVrV4+PjQEbp59nZWV1eXtZyuazj4+NBn5CxzWZTX79+rYeHh7q/v6+np6f613/9\n11HX8G//9m8HuvL169e6v79vzzw5OWlrcXZ2Vufn53VxcVFnZ2eDtXl8fKybm5u6vb2t+/v7wdog\n8+iz15t1OTs7a7YAeX5+fq7ValWr1apms1m7x2w2q4eHh9bH2WzWbAZ6yz3+8z//s373u9/V7373\nu9psNvXhw4d6//59XV9ftzV8enoayBPPZr0mk0nNZrP296oXfZ7NZjWfz2s2m9V2u21z+Pz8XEdH\nR61P/I37/uM//uOo6/jnf/7ngzmvGtoC2na7rdPT01oul3VxcVGnp6dNPp+entq8Pjw8NNnm8rxO\np9M29qoarFV+Dj2cz+d1fn5eZ2dndXZ2Vs/Pz3V3d1f39/f1+Pg4mFdsxXw+r/V6Xff393V3d1dP\nT08DH8B6MV7G8fXr1/bc4+PjWq1WdXt7W7e3t/Xw8DCYK2R7sVjU0dFR0+HNZjNY381m08b4/Pxc\n//Zv/zbqGv7VX/3VK3/kdn5+3vTv6Oio2RlsDf2az+dtjrGhyO/T01Ob89VqNZgH+5/NZtPWbzqd\ntmefnZ3VfD5v68Sc8D3LBj6Bdb25uambm5v68uVLzWazevfuXb1//76urq4G8mP/lT+z8bzJZDKw\nK/ho1s4+kvtx/dM//dOo6/h3f/d3r9bRY8DmLRaLAb4xJtlsNu376JRtHJ9BRqwHzCN2kzmYz+dt\nPWezWbPri8Wi+Rpsl+fL/u3x8bHZ048fPw784na7HfhxZPDs7GwwtpwbYwhkGT9oO2Af6TE+Pz/X\nP/zDP4y6hn/2Z3/2yienLUQebQuRNdZjvV4PMBzzallk7L5HYhQ+M5lMBus2m83afcBfXNyPe3KP\nqqq7u7u6vb2tu7u7Wq1W7TP+juWFZ1sHHx8f6/7+vu7v79ua07DRJycnDSNjg5iL1WrVfPDDw0N9\n/fq1Pn78OOo6/uVf/uXAxnl9wI1crIH7ajwIXsUvcLnl91NPWYPpdNp8kzF84h5iEmNn1sM6a/yG\n7/P85/j9LONw+2rLLvNjn27Z8hz/y7/8y6hr+Kd/+qcDucyY0DJfVYN1Y76raoCre/GD5cBxGraY\ntcw4cJe+2EbRj5y/2WzW5v/h4eFVHOLv2CfQT9sZ5MZ4bzKZDGJasGHOCZfbf/zHf4y6jn/zN38z\nmOe86OPx8XGdnZ3VxcVFLZfLOjk5qbu7u4ZbvAZHR0cDTOnYGz21b6SxlsYVzDXrfnJyUuv1umHK\nzWbT+kfMxvqyfg8PD/X09FSnp6fNRqNP6K/lAn19enqqqpe4FbyZFzIHHjs/Px+sn/3rer2uv//7\nv9+5Ht8las7Pz1vHEZ6jo6M6OzsbKBIP9SSimFUvILH3uel02kAN/2YB3HgeYMrO0g6qqgaBdhoO\n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\nrkJggg==\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "encoded_imgs = np.random.rand(10,32)\n",
- "decoded_imgs = decoder.predict(encoded_imgs)\n",
- "\n",
- "n = 10 \n",
- "plt.figure(figsize=(20, 4))\n",
- "for i in range(n):\n",
- " # generation\n",
- " ax = plt.subplot(2, n, i + 1 + n)\n",
- " plt.imshow(decoded_imgs[i].reshape(28, 28))\n",
- " plt.gray()\n",
- " ax.get_xaxis().set_visible(False)\n",
- " ax.get_yaxis().set_visible(False)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "#### Pretraining encoders "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "One of the powerful tools of auto-encoders is using the encoder to generate meaningful representation from the feature vectors."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "# Use the encoder to pretrain a classifier "
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "---"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Natural Language Processing using Artificial Neural Networks"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "> “In God we trust. All others must bring data.†– W. Edwards Deming, statistician"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Word Embeddings\n",
- "\n",
- "### What?\n",
- "Convert words to vectors in a high dimensional space. Each dimension denotes an aspect like gender, type of object / word.\n",
- "\n",
- "\"Word embeddings\" are a family of natural language processing techniques aiming at mapping semantic meaning into a geometric space. This is done by associating a numeric vector to every word in a dictionary, such that the distance (e.g. L2 distance or more commonly cosine distance) between any two vectors would capture part of the semantic relationship between the two associated words. The geometric space formed by these vectors is called an embedding space.\n",
- "\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Why?\n",
- "By converting words to vectors we build relations between words. More similar the words in a dimension, more closer their scores are.\n",
- "\n",
- "### Example\n",
- "_W(green) = (1.2, 0.98, 0.05, ...)_\n",
- "\n",
- "_W(red) = (1.1, 0.2, 0.5, ...)_\n",
- "\n",
- "Here the vector values of _green_ and _red_ are very similar in one dimension because they both are colours. The value for second dimension is very different because red might be depicting something negative in the training data while green is used for positiveness.\n",
- "\n",
- "By vectorizing we are indirectly building different kind of relations between words."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Example of `word2vec` using gensim"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Using gpu device 0: GeForce GTX 760 (CNMeM is enabled with initial size: 90.0% of memory, cuDNN 4007)\n"
- ]
- }
- ],
- "source": [
- "from gensim.models import word2vec\n",
- "from gensim.models.word2vec import Word2Vec"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Reading blog post from data directory"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "import os\n",
- "import pickle"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "DATA_DIRECTORY = os.path.join(os.path.abspath(os.path.curdir), 'data', 'word_embeddings')"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "male_posts = []\n",
- "female_post = []"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "with open(os.path.join(DATA_DIRECTORY,\"male_blog_list.txt\"),\"rb\") as male_file:\n",
- " male_posts= pickle.load(male_file)\n",
- " \n",
- "with open(os.path.join(DATA_DIRECTORY,\"female_blog_list.txt\"),\"rb\") as female_file:\n",
- " female_posts = pickle.load(female_file)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2252\n",
- "2611\n"
- ]
- }
- ],
- "source": [
- "print(len(female_posts))\n",
- "print(len(male_posts))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {
- "collapsed": true
- },
- "outputs": [],
- "source": [
- "filtered_male_posts = list(filter(lambda p: len(p) > 0, male_posts))\n",
- "filtered_female_posts = list(filter(lambda p: len(p) > 0, female_posts))\n",
- "posts = filtered_female_posts + filtered_male_posts"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {
- "collapsed": false
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "2247 2595 4842\n"
- ]
- }
- ],
- "source": [
- "print(len(filtered_female_posts), len(filtered_male_posts), len(posts))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Word2Vec"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {
- "collapsed": false
- },
- "outputs": [],
- "source": [
- "w2v = Word2Vec(size=200, min_count=1)\n",
- "w2v.build_vocab(map(lambda x: x.split(), posts[:100]), )"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {
- "collapsed": false,
- "scrolled": true
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "{'see.': ,\n",
- " 'never.': ,\n",
- " 'driving': ,\n",
- " 'buddy': ,\n",
- " 'DEFENSE': ,\n",
- " 'interval': ,\n",
- " 'Right': ,\n",
- " 'minds,': ,\n",
- " 'earth.': ,\n",
- " 'pleasure': ,\n",
- " 'school,': ,\n",
- " 'someone': ,\n",
- " 'dangit...': ,\n",
- " 'one!': ,\n",
- " 'hard.': ,\n",
- " 'programs,': ,\n",
- " 'SEEEENNNIIIOOORS!!!': ,\n",
- " 'two)': ,\n",
- " \"o'\": ,\n",
- " '--': ,\n",
- " 'this-actually': ,\n",
- " 'swimming.': ,\n",
- " 'people.': ,\n",
- " 'turn': ,\n",
- " 'happened': ,\n",
- " 'clothing:': ,\n",
- " 'it!': ,\n",
- " 'church': ,\n",
- " 'boring.': ,\n",
- " 'freaky': ,\n",
- " 'Democrats,': ,\n",
- " '*kick': ,\n",
- " '\"It': ,\n",
- " 'wet': ,\n",
- " 'snooze': ,\n",
- " 'points': ,\n",
- " 'Sen.': ,\n",
- " 'although': ,\n",
- " 'Charlotte': ,\n",
- " 'lil...but': ,\n",
- " 'oneo': ,\n",
- " 'course;': ,\n",
- " 'Bring': ,\n",
- " '(compared': ,\n",
- " 'ugh.': ,\n",
- " 'sit': ,\n",
- " 'dipped?': ,\n",
- " 'based': ,\n",
- " 'A.I.': ,\n",
- " 'breathing.': ,\n",
- " 'multi-millionaire': ,\n",
- " 'groups': ,\n",
- " 'on': ,\n",
- " 'animals),': ,\n",
- " 'Manners?': ,\n",
- " 'you?]:': ,\n",
- " 'redistribute': ,\n",
- " 'omg.': ,\n",
- " 'dance?:': ,\n",
- " 'Canada)': ,\n",
- " 'came': ,\n",
- " 'poof': ,\n",
- " 'brownies.': ,\n",
- " 'Not': ,\n",
- " 'spaces': ,\n",
- " 'destroy': ,\n",
- " 'maybe.': ,\n",
- " 'Industrial': ,\n",
- " 'boring': ,\n",
- " 'is:': ,\n",
- " 'question.': ,\n",
- " 'long-lasting': ,\n",
- " 'sun': ,\n",
- " 'CrAp*': ,\n",
- " 'irresistable': ,\n",
- " 'dont...i': ,\n",
- " 'loss.': ,\n",
- " 'easy': ,\n",
- " 'wanna': ,\n",
- " 'Gaviota': ,\n",
- " 'nose': ,\n",
- " 'slept': ,\n",
- " 'hahahahah': ,\n",
- " 'halloween': ,\n",
- " 'shes': ,\n",
- " 'realize': ,\n",
- " 'twice': ,\n",
- " 'lift': ,\n",
- " 'china,': ,\n",
- " 'Standard.)': ,\n",
- " 'worried': ,\n",
- " 'Opposite': ,\n",
- " 'chin.': ,\n",
- " 'Garden': ,\n",
- " 'guy': ,\n",
- " 'remmeber': ,\n",
- " 'fence,': ,\n",
- " 'apologizing': ,\n",
- " 'next.': ,\n",
- " 'MATTERS': ,\n",
- " 'rugs': ,\n",
- " 'her...': ,\n",
- " 'energy,': ,\n",
- " 'recorded,': ,\n",
- " 'pepsi.': ,\n",
- " 'r': ,\n",
- " '13': ,\n",
- " 'at:': ,\n",
- " 'cheaper': ,\n",
- " 'children!': ,\n",
- " 'tree': ,\n",
- " 'met': ,\n",
- " 'one,': ,\n",
- " 'rejected?': ,\n",
- " 'Marianne’s': ,\n",
- " 'Icenhower': ,\n",
- " 'day!': ,\n",
- " 'leaving': ,\n",
- " '2110': ,\n",
- " 'kiss:': ,\n",
- " 'nearest': ,\n",
- " 'aimlessly': ,\n",
- " 'sprint': ,\n",
- " 'kids!)': ,\n",
- " 'canteen': ,\n",
- " 'weekend!': ,\n",
- " 'him': ,\n",
- " 'scariest': ,\n",
- " 'this?': ,\n",
- " '\"choosing': ,\n",
- " 'Talk': ,\n",
- " 'weeks': ,\n",
- " \"You'll\": ,\n",
- " 'goodnight': ,\n",
- " 'skiing.': ,\n",
- " 'KeEp': ,\n",
- " 'week': ,\n",
- " 'norwegian': ,\n",
- " 'HAND:': ,\n",
- " 'fact,': ,\n",
- " 'thanksgiving': ,\n",
- " 'me..argh...': ,\n",
- " 'she': ,\n",
- " 'Tree': ,\n",
- " 'combat.': ,\n",
- " 'mitosis': ,\n",
- " 'offered': ,\n",
- " 'no..': ,\n",
- " '(there': ,\n",
- " 'aspirations': ,\n",
- " 'page': ,\n",
- " 'Least': ,\n",
- " 'each': ,\n",
- " 'ride...': ,\n",
- " 'doesn’t': ,\n",
- " 'FUCK': ,\n",
- " 'gona': ,\n",
- " 'window': ,\n",
- " 'end': ,\n",
- " 'expected': ,\n",
- " 'well.': ,\n",
- " 'called': ,\n",
- " \"needn't\": ,\n",
- " 'doesnt': ,\n",
- " 'venturing': ,\n",
- " 'alex': ,\n",
- " 'here:': ,\n",
- " 'ewWw': ,\n",
- " 'pole?': ,\n",
- " 'melody,': ,\n",
- " 'motivated': ,\n",
- " 'Well,': ,\n",
- " 'says:': ,\n",
- " 'worm': ,\n",
- " '[some': ,\n",
- " 'name': ,\n",
- " 'Leave\"': ,\n",
- " '4th': ,\n",
- " \"It's...\": ,\n",
- " 'problem??': ,\n",
- " 'remember': ,\n",
- " 'o': ,\n",
- " 'letters.': ,\n",
- " 'jean': ,\n",
- " 'thing.': ,\n",
- " 'friend?]:': ,\n",
- " 'am!': ,\n",
- " 'side...': ,\n",
- " 'Yet': ,\n",
- " 'easier': ,\n",
- " 'babies': ,\n",
- " 'You?': ,\n",
- " 'wedding:': ,\n",
- " '2.)': ,\n",
- " 'first...then': ,\n",
- " 'LA:': ,\n",
- " 'but,)': ,\n",
- " 'not,': ,\n",
- " 'possession': ,\n",
- " 'its': ,\n",
- " 'stop': ,\n",
- " 'Thanks': ,\n",
- " 'durin': ,\n",
- " 'rings': ,\n",
- " 'Specifics': ,\n",
- " 'http://www.kingsofchaos.com/recruit.php?uniqid=jm8bja2z': ,\n",
- " 'lace': ,\n",
- " 'pretended': ,\n",
- " 'clothes': ,\n",
- " 'wong': ,\n",
- " '38': ,\n",
- " 'country.':