From f70d5e0575a8d0237efce1800e7520d1a2b0f572 Mon Sep 17 00:00:00 2001 From: Valerio Maggio Date: Fri, 5 May 2017 12:48:56 +0000 Subject: [PATCH] removed old notebooks and added new ones - sections 4 and 5 --- 0. Preamble.ipynb | 4 +- 2.2.2 CNN HandsOn - MNIST & CN Nets.ipynb | 1028 ---------- 3. Convolutional Neural Networks.ipynb | 1439 +++++++++++++ ... 4. Deep Networks Models and ResNets.ipynb | 91 +- ...=> 5 Transfer Learning & Fine-Tuning.ipynb | 2 +- Intro cnn.ipynb | 1023 ---------- ...Introduction - Deep Learning and ANN.ipynb | 1797 ----------------- to remove/1.2 Introduction - Tensorflow.ipynb | 1447 ------------- to remove/1.5.1 Introduction - Theano.ipynb | 949 --------- 9 files changed, 1457 insertions(+), 6323 deletions(-) delete mode 100644 2.2.2 CNN HandsOn - MNIST & CN Nets.ipynb create mode 100644 3. Convolutional Neural Networks.ipynb rename 2.3 Deep Convolutional Neural Networks.ipynb => 4. Deep Networks Models and ResNets.ipynb (86%) rename 2.4 Transfer Learning & Fine-Tuning.ipynb => 5 Transfer Learning & Fine-Tuning.ipynb (99%) delete mode 100644 Intro cnn.ipynb delete mode 100644 to remove/1.1 Introduction - Deep Learning and ANN.ipynb delete mode 100644 to remove/1.2 Introduction - Tensorflow.ipynb delete mode 100644 to remove/1.5.1 Introduction - Theano.ipynb diff --git a/0. Preamble.ipynb b/0. Preamble.ipynb index 38e0f56..c16923c 100644 --- a/0. Preamble.ipynb +++ b/0. Preamble.ipynb @@ -69,8 +69,8 @@ "1. _Multi-layer Fully Connected Networks (and the `backends`)_\n", "2. _Hidden Layers features and Embeddings_\n", "3. _Convolutional Networks_\n", - "4. _Transfer Learning and Fine Tuning_\n", - "5. _Residual Networks_\n", + "4. _Deep CNN and Residual Networks_\n", + "5. _Transfer Learning and Fine Tuning_\n", "6. _Recursive Neural Networks_\n", "7. _[Variational] AutoEncoders and Adversarials_\n", "8. _Multi-Modal Networks_\n", 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", - "" - ] - }, - { - "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/3. Convolutional Neural Networks.ipynb b/3. Convolutional Neural Networks.ipynb new file mode 100644 index 0000000..004c16f --- /dev/null +++ b/3. Convolutional Neural Networks.ipynb @@ -0,0 +1,1439 @@ +{ + "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", + "" + ] + }, + { + "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", + "" + ] + }, + { + "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_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'`\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": 2, + "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": 3, + "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": 4, + "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": 5, + "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": 6, + "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": 7, + "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": "code", + "execution_count": 8, + "metadata": { + "collapsed": 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": 9, + "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": 10, + "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": 11, + "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": 12, + "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": 13, + "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": 14, + "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": 15, + "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", + "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": 16, + "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": 17, + "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": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 11918 samples, validate on 10000 samples\n", + "Epoch 1/2\n", + "11918/11918 [==============================] - 9s - 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": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "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": 20, + "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": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test Loss: 0.0933376396745\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": 22, + "metadata": { + "collapsed": true, + "slideshow": { + "slide_type": "skip" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "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": 24, + "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": 25, + "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": 25, + "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": 26, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test score: 0.0898334540322\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": 27, + "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": 28, + "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.2394 - acc: 0.9329 - val_loss: 0.1882 - val_acc: 0.9355\n", + "Epoch 2/2\n", + "11918/11918 [==============================] - 1s - loss: 0.1038 - acc: 0.9656 - val_loss: 0.0900 - val_acc: 0.9679\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "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": 29, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test score: 0.090035862723\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": 31, + "metadata": { + "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": 32, + "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.3656 - acc: 0.8706 - val_loss: 0.1640 - val_acc: 0.9468\n", + "Epoch 2/2\n", + "11918/11918 [==============================] - 2s - loss: 0.1345 - acc: 0.9528 - val_loss: 0.0693 - val_acc: 0.9764\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 32, + "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": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Test score: 0.0693048403405\n", + "Test accuracy: 0.9764\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": 34, + "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": 35, + "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.8673 - val_loss: 0.1513 - val_acc: 0.9505\n", + "Epoch 2/2\n", + "11918/11918 [==============================] - 2s - loss: 0.1384 - acc: 0.9530 - val_loss: 0.0672 - val_acc: 0.9774\n", + "Test score: 0.0671841920182\n", + "Test accuracy: 0.9774\n", + "5.84 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": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Batch Normalisation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "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": { + "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, + "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 [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.3" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/2.3 Deep Convolutional Neural Networks.ipynb b/4. Deep Networks Models and ResNets.ipynb similarity index 86% rename from 2.3 Deep Convolutional Neural Networks.ipynb rename to 4. Deep Networks Models and ResNets.ipynb index df7cbaa..724a210 100644 --- a/2.3 Deep Convolutional Neural Networks.ipynb +++ b/4. Deep Networks Models and ResNets.ipynb @@ -3,8 +3,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "slide" } @@ -16,8 +14,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "subslide" } @@ -31,8 +27,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "slide" } @@ -44,8 +38,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "subslide" } @@ -64,8 +56,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "skip" } @@ -81,8 +71,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "subslide" } @@ -96,8 +84,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "slide" } @@ -108,10 +94,7 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "" ] @@ -125,10 +108,7 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "" ] @@ -136,9 +116,7 @@ { "cell_type": "markdown", "metadata": { - "collapsed": true, - "deletable": true, - "editable": true + "collapsed": true }, "source": [ "# `keras.applications`" @@ -148,9 +126,6 @@ "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": false, - "deletable": true, - "editable": true, "slideshow": { "slide_type": "subslide" } @@ -173,11 +148,7 @@ { "cell_type": "code", "execution_count": 2, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [], "source": [ "# -- Jupyter/IPython way to see documentation\n", @@ -188,11 +159,7 @@ { "cell_type": "code", "execution_count": 3, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -234,11 +201,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -255,10 +218,7 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "" ] @@ -267,9 +227,6 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false, - "deletable": true, - "editable": true, "slideshow": { "slide_type": "skip" } @@ -302,10 +259,7 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "" ] @@ -313,11 +267,7 @@ { "cell_type": "code", "execution_count": 14, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -342,10 +292,7 @@ }, { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ "" ] @@ -353,11 +300,7 @@ { "cell_type": "code", "execution_count": 15, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -383,8 +326,6 @@ { "cell_type": "markdown", "metadata": { - "deletable": true, - "editable": true, "slideshow": { "slide_type": "slide" } @@ -399,9 +340,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true, - "deletable": true, - "editable": true + "collapsed": true }, "outputs": [], "source": [ @@ -459,7 +398,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, @@ -473,9 +412,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.5.2" + "version": "3.5.3" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } diff --git a/2.4 Transfer Learning & Fine-Tuning.ipynb b/5 Transfer Learning & Fine-Tuning.ipynb similarity index 99% rename from 2.4 Transfer Learning & Fine-Tuning.ipynb rename to 5 Transfer Learning & Fine-Tuning.ipynb index 9b75068..361d53c 100644 --- a/2.4 Transfer Learning & Fine-Tuning.ipynb +++ b/5 Transfer Learning & Fine-Tuning.ipynb @@ -341,7 +341,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python [default]", "language": "python", "name": "python3" }, diff --git a/Intro cnn.ipynb b/Intro cnn.ipynb deleted file mode 100644 index 53358e9..0000000 --- a/Intro cnn.ipynb +++ /dev/null @@ -1,1023 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Convolutional Neural Network" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## How does it look like?" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true, - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "\n", - "\n", - "> source: https://flickrcode.files.wordpress.com/2014/10/conv-net2.png" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# The Problem Space \n", - "\n", - "## Image Classification" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Inputs and Outputs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "source: [http://www.pawbuzz.com/wp-content/uploads/sites/551/2014/11/corgi-puppies-21.jpg]()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Goal" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Structure of a CNN" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Convolutional Layer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "The first layer in a CNN is always a **Convolutional Layer**." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Convolutional filters\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "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": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "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": { - "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": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Visualisation of the Receptive Field" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Going Deeper Through the Network" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## ReLU (Rectified Linear Units) Layer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "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": { - "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": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Pooling Layers" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - " After some ReLU layers, it is customary to apply a **pooling layer** (aka *downsampling layer*)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "In this category, there are also several layer options, with **maxpooling** being the most popular. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Example of a MaxPooling filter" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "Other options for pooling layers are average pooling and L2-norm pooling. " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Dropout Layer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Fully Connected Layer" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "The last layer, however, is an important one, namely the **Fully Connected Layer**." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": {}, - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# CNN in Keras" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "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": { - "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": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Dimensions of Conv filters in Keras" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "The complex structure of ConvNets *may* lead to a representation that is challenging to understand." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/to remove/1.1 Introduction - Deep Learning and ANN.ipynb b/to remove/1.1 Introduction - Deep Learning and ANN.ipynb deleted file mode 100644 index c75b7e0..0000000 --- a/to remove/1.1 Introduction - Deep Learning and ANN.ipynb +++ /dev/null @@ -1,1797 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "nbpresent": { - "id": "24ca50a0-b9ad-425d-a28f-6bd3ca3ac378" - }, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Introduction to Deep Learning" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "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": { - "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": { - "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": { - "nbpresent": { - "id": "5e13607b-3ec5-4a95-a2d8-f898f20748da" - }, - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Building Blocks: Artificial Neural Networks (ANN)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "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": { - "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": { - "nbpresent": { - "id": "92d4603e-7e39-4156-818c-785df6189fe8" - }, - "slideshow": { - "slide_type": "-" - } - }, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": 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": { - "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": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Single Layer Neural Network" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "\n", - "_(Source: Python Machine Learning, S. Raschka)_" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Weights Update Rule" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": {}, - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Building Neural Nets from scratch \n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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, - "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": { - "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": {}, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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, - "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, - "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, - "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, - "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": { - "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": { - "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": { - "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, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### A look at the details" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": 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": { - "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, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Define our activation function. Let's use sigmoid function" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": 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": { - "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 - }, - "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": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Activation Function" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### BackPropagation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Running the model on our dataset" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Predicting on training dataset and measuring in-sample accuracy" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
actualprediction
01.00.491100
11.00.495469
20.00.097362
30.00.400006
41.00.489664
\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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "### Let's visualize and observe the results" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": 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": {}, - "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": { - "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 - }, - "outputs": [], - "source": [ - "# Put your code here \n", - "#(or load the solution if you wanna cheat :-)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "# %load solutions/sol_111.py\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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 - }, - "outputs": [], - "source": [ - "#Put your code here" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": false, - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "# %load solutions/sol_112.py" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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.3" - }, - "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": 1 -} diff --git a/to remove/1.2 Introduction - Tensorflow.ipynb b/to remove/1.2 Introduction - Tensorflow.ipynb deleted file mode 100644 index c631dff..0000000 --- a/to remove/1.2 Introduction - Tensorflow.ipynb +++ /dev/null @@ -1,1447 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Tensorflow Main Features" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Very Preliminary Example" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "outputs": [], - "source": [ - "import tensorflow as tf" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "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": { - "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": { - "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": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "model = tf.global_variables_initializer() # model is used by convention" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Data Flow Graph" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Tensorflow Graph Model" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Tensorflow Graph Model (cont.)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Tensorflow Graph Model Session" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Tensorboard" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Tensorboard Example" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "Run the **TensorBoard** Server:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "```shell\n", - "tensorboard --logdir=/tmp/tf_logs\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "[Open TensorBoard](http://localhost:6006)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Example" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Data Types (Tensors)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## One Dimensional Tensor (Vector)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Two Dimensional Tensor (Matrix)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "# Basic Operations (Examples)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "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": {}, - "outputs": [], - "source": [ - "tf_mat1 = tf.constant(matrix1) \n", - "tf_mat2 = tf.constant(matrix2)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "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": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "matrix_det = tf.matrix_determinant(matrix2)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": 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": { - "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": { - "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": {}, - "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": { - "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": { - "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": {}, - "source": [ - "### Slicing" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": 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": { - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Transpose" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "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": { - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "## Computing the Gradient\n", - "\n", - "- Gradients are free!" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Warming up: Logistic Regression" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Logistic Regression" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": {}, - "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": {}, - "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": {}, - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "#### Hands On - Logistic Regression" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": 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, - "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": {}, - "source": [ - "## The Model" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": 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, - "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, - "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, - "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": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "# Initializing the variables\n", - "init = tf.global_variables_initializer()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Learning" - ] - }, - { - "cell_type": "code", - "execution_count": 38, - "metadata": { - "collapsed": 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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Prediction" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": { - "collapsed": 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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## TF Session" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "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": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "[Open TensorBoard](http://localhost:6006)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Why Tensorflow ?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "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": { - "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": {}, - "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": { - "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": { - "slideshow": { - "slide_type": "subslide" - } - }, - "source": [ - "## Using Multiple GPUs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "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": { - "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": {}, - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/to remove/1.5.1 Introduction - Theano.ipynb b/to remove/1.5.1 Introduction - Theano.ipynb deleted file mode 100644 index 6631871..0000000 --- a/to remove/1.5.1 Introduction - Theano.ipynb +++ /dev/null @@ -1,949 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Theano \n", - "===\n", - "A language in a language" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Dealing with weights matrices and gradients can be tricky and sometimes not trivial.\n", - "Theano is a great framework for handling vectors, matrices and high dimensional tensor algebra. \n", - "Most of this tutorial will refer to Theano however TensorFlow is another great framework capable of providing an incredible abstraction for complex algebra.\n", - "More on TensorFlow in the next chapters." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "import theano\n", - "import theano.tensor as T" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Symbolic variables\n", - "==========" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Theano has it's own variables and functions, defined the following" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [], - "source": [ - "x = T.scalar()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Variables can be used in expressions" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "y = 3*(x**2) + 1" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "y is an expression now " - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "Result is symbolic as well" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Shape.0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(y)\n", - "y.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "#####printing" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "As we are about to see, normal printing isn't the best when it comes to theano" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Elemwise{add,no_inplace}.0\n" - ] - } - ], - "source": [ - "print(y)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'((TensorConstant{3} * ( ** TensorConstant{2})) + TensorConstant{1})'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "theano.pprint(y)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Elemwise{add,no_inplace} [id A] '' \n", - " |Elemwise{mul,no_inplace} [id B] '' \n", - " | |TensorConstant{3} [id C]\n", - " | |Elemwise{pow,no_inplace} [id D] '' \n", - " | | [id E]\n", - " | |TensorConstant{2} [id F]\n", - " |TensorConstant{1} [id G]\n" - ] - } - ], - "source": [ - "theano.printing.debugprint(y)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Evaluating expressions\n", - "============\n", - "\n", - "Supply a `dict` mapping variables to values" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(13.0)" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "y.eval({x: 2})" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Or compile a function" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "f = theano.function([x], y)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(13.0)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f(2)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Other tensor types\n", - "==========" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true, - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [], - "source": [ - "X = T.vector()\n", - "X = T.matrix()\n", - "X = T.tensor3()\n", - "X = T.tensor4()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Automatic differention\n", - "============\n", - "- Gradients are free!" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "x = T.scalar()\n", - "y = T.log(x)" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Elemwise{true_div}.0\n", - "0.5\n", - "Elemwise{mul,no_inplace}.0\n" - ] - } - ], - "source": [ - "gradient = T.grad(y, x)\n", - "print(gradient)\n", - "print(gradient.eval({x: 2}))\n", - "print((2 * gradient))" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Shared Variables\n", - "\n", - "- Symbolic + Storage" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "x = theano.shared(np.zeros((2, 3), dtype=theano.config.floatX))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "x" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "We can get and set the variable's value" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(2, 3)\n", - "[[ 0. 0. 0.]\n", - " [ 0. 0. 0.]]\n" - ] - } - ], - "source": [ - "values = x.get_value()\n", - "print(values.shape)\n", - "print(values)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "x.set_value(values)" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "Shared variables can be used in expressions as well" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "slideshow": { - "slide_type": "-" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Elemwise{pow,no_inplace}.0" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "(x + 2) ** 2" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "source": [ - "Their value is used as input when evaluating" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 4., 4., 4.],\n", - " [ 4., 4., 4.]])" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "((x + 2) ** 2).eval()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[ 4., 4., 4.],\n", - " [ 4., 4., 4.]])" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "theano.function([], (x + 2) ** 2)()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "source": [ - "# Updates\n", - "\n", - "- Store results of function evalution\n", - "- `dict` mapping shared variables to new values" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "slideshow": { - "slide_type": "slide" - } - }, - "outputs": [], - "source": [ - "count = theano.shared(0)\n", - "new_count = count + 1\n", - "updates = {count: new_count}\n", - "\n", - "f = theano.function([], count, updates=updates)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(0)" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f()" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(1)" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "slideshow": { - "slide_type": "fragment" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(2)" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "f()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Warming up! Logistic Regression" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import theano\n", - "import theano.tensor as T\n", - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 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.\n", - "\n", - "**Note** We already used this dataset in the [1.2 Introduction - Tensorflow](../1.2 Introduction - Tensorflow.ipynb) notebook, as well as [1.3 Introduction - Keras](../1.3 Introduction - Keras.ipynb) notebook." - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import sys\n", - "nb_dir = os.path.abspath('..')\n", - "if nb_dir not in sys.path:\n", - " sys.path.append(nb_dir)" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "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": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Loading data...\n", - "[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 3. 0. 0. 0. 3.\n", - " 2. 1. 0. 0. 0. 0. 0. 0. 0. 5. 3. 1. 1. 0.\n", - " 0. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0. 1. 0. 0.\n", - " 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", - " 0. 0. 0. 0. 0. 0. 0. 3. 0. 0. 0. 0. 1. 1.\n", - " 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.\n", - " 0. 11. 1. 20. 0. 0. 0. 0. 0.]]\n", - "9 classes\n", - "93 dims\n" - ] - } - ], - "source": [ - "print(\"Loading data...\")\n", - "X, labels = load_data('../data/kaggle_ottogroup/train.csv', train=True)\n", - "X, scaler = preprocess_data(X)\n", - "Y, encoder = preprocess_labels(labels)\n", - "\n", - "\n", - "X_test, ids = load_data('../data/kaggle_ottogroup/test.csv', train=False)\n", - "X_test, ids = X_test[:1000], ids[:1000]\n", - "\n", - "#Plotting the data\n", - "print(X_test[:1])\n", - "\n", - "X_test, _ = preprocess_data(X_test, scaler)\n", - "\n", - "nb_classes = Y.shape[1]\n", - "print(nb_classes, 'classes')\n", - "\n", - "dims = X.shape[1]\n", - "print(dims, 'dims')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now lets create and train a logistic regression model." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Hands On - Logistic Regression" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "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", - "[False False True ..., 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 = theano.shared(rng.randn(feats), name=\"w\")\n", - "b = theano.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", - " # (we shall return to this in a\n", - " # following sections of this tutorial\n", - " # See: Intro to tf & Keras)\n", - "\n", - "# Compile\n", - "train = theano.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", - "predict = theano.function(inputs=[x], outputs=prediction, allow_input_downcast=True)\n", - "\n", - "#Transform for class1\n", - "y_class1 = []\n", - "for i in Y:\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, y_class1)\n", - "\n", - "print(\"target values for Data:\")\n", - "print(y_class1)\n", - "print(\"prediction on training set:\")\n", - "print(predict(X))" - ] - }, - { - "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.3" - } - }, - "nbformat": 4, - "nbformat_minor": 1 -}