{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Keras intro exercises\n", "\n", "## 1. Build a simple sequential model\n", "\n", "* Can you build a sequential model to reproduce the graph shown in the figure? \n", "* Assume that this is a classifier\n", "* Choose whatever activations you want, wherever possible\n", "* How many classes are we predicting?\n", "\n", "<center><img src=\"figures/sequence_api_exercise.png\"></center>" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#!wget https://raw.githubusercontent.com/NBISweden/workshop-neural-nets-and-deep-learning/master/session_annBuildingBlocks/lab_keras/exercises.ipynb\n", "!mkdir figures\n", "!wget -P figures/ https://raw.githubusercontent.com/NBISweden/workshop-neural-nets-and-deep-learning/master/session_annBuildingBlocks/lab_keras/figures/sequence_api_exercise.png" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "2023-03-20 15:46:37.121579: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set\n", "2023-03-20 15:46:37.122137: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: SSE4.1 SSE4.2 AVX AVX2 FMA\n", "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", "2023-03-20 15:46:37.123102: I tensorflow/core/common_runtime/process_util.cc:146] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance.\n" ] } ], "source": [ "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense\n", "\n", "model = Sequential()\n", "model.add(Dense(units=64, activation='relu', input_dim=784, name=\"Dense\"))\n", "model.add(Dense(units=64, activation='relu', name=\"dense_1\"))\n", "model.add(Dense(units=10, activation='softmax', name=\"dense_2\"))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<IPython.core.display.Image object>" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from tensorflow.keras.utils import plot_model\n", "\n", "#Add your model here\n", "\n", "plot_model(model, \"figures/exercise_model.png\", show_shapes=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Build a better XOR classifier\n", "\n", "Given the model seen at lecture, how do we make a better classifier (higher accuracy)?\n", "\n", "* More layers? More neurons?\n", "* Generate more data?\n", "* More epochs?\n", "* Different batch size?\n", "* Different optimizer?\n", "* It's up to you! Let's see who does best on validation\n", "\n", "Only for Tuesday's session:\n", "\n", "* Different activations?\n", "* Add Dropout? How large?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Training curve plotting function:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "def plot_loss_acc(history):\n", " try:\n", " plt.plot(history.history['accuracy'])\n", " plt.plot(history.history['val_accuracy'])\n", " except:\n", " plt.plot(history.history['acc'])\n", " plt.plot(history.history['val_acc'])\n", " \n", " plt.plot(history.history['loss'])\n", " plt.plot(history.history['val_loss'])\n", " plt.title('model accuracy')\n", " plt.ylabel('accuracy')\n", " plt.xlabel('epoch')\n", " plt.legend(['train acc', 'val acc', 'train loss', 'val loss'], loc='upper left')\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Data generation step:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-0.37 xor 0.21 xor -0.22 equals 1.0\n", " 0.20 xor -0.29 xor 0.44 equals 0.0\n", "-0.44 xor -0.33 xor -0.45 equals 0.0\n" ] } ], "source": [ "# Generate XOR data\n", "data = np.random.random((1000000, 3)) - 0.5\n", "labels = np.zeros((1000000, 1))\n", "\n", "labels[np.where(np.logical_xor(np.logical_xor(data[:,0] > 0, data[:,1] > 0), data[:,2] > 0))] = 1\n", "\n", "#let's print some data and the corresponding label to check that they match the table above\n", "for x in range(3):\n", " print(\"{0: .2f} xor {1: .2f} xor {2: .2f} equals {3:}\".format(data[x,0], data[x,1], data[x,2], labels[x,0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "The baseline network to improve:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/30\n", "7032/7032 [==============================] - 11s 1ms/step - loss: 0.4865 - accuracy: 0.7417 - val_loss: 0.0967 - val_accuracy: 0.9761\n", "Epoch 2/30\n", "7032/7032 [==============================] - 15s 2ms/step - loss: 0.0709 - accuracy: 0.9829 - val_loss: 0.0287 - val_accuracy: 0.9952\n", "Epoch 3/30\n", "7032/7032 [==============================] - 17s 2ms/step - loss: 0.0237 - accuracy: 0.9962 - val_loss: 0.0136 - val_accuracy: 0.9980\n", "Epoch 4/30\n", "7032/7032 [==============================] - 16s 2ms/step - loss: 0.0124 - accuracy: 0.9979 - val_loss: 0.0084 - val_accuracy: 0.9985\n", "Epoch 5/30\n", "7032/7032 [==============================] - 17s 2ms/step - loss: 0.0078 - accuracy: 0.9986 - val_loss: 0.0059 - val_accuracy: 0.9987\n", "Epoch 6/30\n", "7032/7032 [==============================] - 16s 2ms/step - loss: 0.0057 - accuracy: 0.9988 - val_loss: 0.0045 - val_accuracy: 0.9993\n", "Epoch 7/30\n", "7032/7032 [==============================] - 17s 2ms/step - loss: 0.0046 - accuracy: 0.9991 - val_loss: 0.0036 - val_accuracy: 0.9993\n", "Epoch 8/30\n", "7032/7032 [==============================] - 17s 2ms/step - loss: 0.0037 - accuracy: 0.9991 - val_loss: 0.0032 - val_accuracy: 0.9992\n", "Epoch 9/30\n", "7032/7032 [==============================] - 16s 2ms/step - loss: 0.0031 - accuracy: 0.9993 - val_loss: 0.0026 - val_accuracy: 0.9995\n", "Epoch 10/30\n", "7032/7032 [==============================] - 16s 2ms/step - loss: 0.0028 - accuracy: 0.9993 - val_loss: 0.0027 - val_accuracy: 0.9990\n", "Epoch 11/30\n", "7032/7032 [==============================] - 16s 2ms/step - loss: 0.0024 - accuracy: 0.9994 - val_loss: 0.0022 - val_accuracy: 0.9994\n", "Epoch 12/30\n", "4657/7032 [==================>...........] - ETA: 5s - loss: 0.0021 - accuracy: 0.9994" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m/tmp/ipykernel_4810/438801614.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcompile\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moptimizer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'adam'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloss\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'sparse_categorical_crossentropy'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmetrics\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'accuracy'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# Train the model, iterating on the data in batches of 32 samples\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mhistory\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlabels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m30\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m128\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalidation_split\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/miniconda3/envs/nn_dl_python_v23/lib/python3.7/site-packages/tensorflow/python/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)\u001b[0m\n\u001b[1;32m 1098\u001b[0m _r=1):\n\u001b[1;32m 1099\u001b[0m \u001b[0mcallbacks\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mon_train_batch_begin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstep\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1100\u001b[0;31m \u001b[0mtmp_logs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtrain_function\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1101\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mdata_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshould_sync\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1102\u001b[0m \u001b[0mcontext\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masync_wait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/nn_dl_python_v23/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 826\u001b[0m \u001b[0mtracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 827\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_name\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtm\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 828\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 829\u001b[0m \u001b[0mcompiler\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m\"xla\"\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_experimental_compile\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m\"nonXla\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 830\u001b[0m \u001b[0mnew_tracing_count\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexperimental_get_tracing_count\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/nn_dl_python_v23/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py\u001b[0m in \u001b[0;36m_call\u001b[0;34m(self, *args, **kwds)\u001b[0m\n\u001b[1;32m 853\u001b[0m \u001b[0;31m# In this case we have created variables on the first call, so we run the\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 854\u001b[0m \u001b[0;31m# defunned version which is guaranteed to never create variables.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 855\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_stateless_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# pylint: disable=not-callable\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 856\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_stateful_fn\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 857\u001b[0m \u001b[0;31m# Release the lock early so that multiple threads can perform the call\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/nn_dl_python_v23/lib/python3.7/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 2941\u001b[0m filtered_flat_args) = self._maybe_define_function(args, kwargs)\n\u001b[1;32m 2942\u001b[0m return graph_function._call_flat(\n\u001b[0;32m-> 2943\u001b[0;31m filtered_flat_args, captured_inputs=graph_function.captured_inputs) # pylint: disable=protected-access\n\u001b[0m\u001b[1;32m 2944\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2945\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mproperty\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/nn_dl_python_v23/lib/python3.7/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36m_call_flat\u001b[0;34m(self, args, captured_inputs, cancellation_manager)\u001b[0m\n\u001b[1;32m 1917\u001b[0m \u001b[0;31m# No tape is watching; skip to running the function.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1918\u001b[0m return self._build_call_outputs(self._inference_function.call(\n\u001b[0;32m-> 1919\u001b[0;31m ctx, args, cancellation_manager=cancellation_manager))\n\u001b[0m\u001b[1;32m 1920\u001b[0m forward_backward = self._select_forward_and_backward_functions(\n\u001b[1;32m 1921\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/miniconda3/envs/nn_dl_python_v23/lib/python3.7/site-packages/tensorflow/python/eager/function.py\u001b[0m in \u001b[0;36mcall\u001b[0;34m(self, ctx, args, cancellation_manager)\u001b[0m\n\u001b[1;32m 558\u001b[0m \u001b[0minputs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 559\u001b[0m \u001b[0mattrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mattrs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 560\u001b[0;31m ctx=ctx)\n\u001b[0m\u001b[1;32m 561\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 562\u001b[0m outputs = execute.execute_with_cancellation(\n", "\u001b[0;32m~/miniconda3/envs/nn_dl_python_v23/lib/python3.7/site-packages/tensorflow/python/eager/execute.py\u001b[0m in \u001b[0;36mquick_execute\u001b[0;34m(op_name, num_outputs, inputs, attrs, ctx, name)\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0mctx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mensure_initialized\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 59\u001b[0m tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,\n\u001b[0;32m---> 60\u001b[0;31m inputs, attrs, num_outputs)\n\u001b[0m\u001b[1;32m 61\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_NotOkStatusException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 62\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mname\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "model = Sequential()\n", "model.add(Dense(units=10, activation='tanh', input_dim=3))\n", "model.add(Dense(units=4, activation='tanh'))\n", "model.add(Dense(units=2, activation='softmax'))\n", "\n", "model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n", "# Train the model, iterating on the data in batches of 32 samples\n", "history = model.fit(data, labels, epochs=30, batch_size=128, validation_split=0.1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Add your model here" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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hBAtiMev5Lz99tu89NJLpKWl0bVrVxYsWMCQIUMuuP/nn3/O/PnzOXbsGGazmTFjxvDyyy8THNww7SsUb2867tzRIOeuyXvX1Pjx43E4HCxZsoS+ffuyfv16Xn31Vdf2xx9/nGXLlvHyyy/Trl07vL29ufXWW7FYLHWqTVVVZ43nXTlRVdW1buzYsZw6dYolS5awYsUKRowYwYMPPsjLL79Mr169SEhI4Oeff2bFihXcdtttjBw5km+//bbqm1nLnFdtSnOc4+AAaHTO21O+IaA1VDmkqNzG3KUHsdpVbrgqkldv7yHTNQghRAvj0Ss5X3/9NTNnzuSpp55i165dDBkyhLFjx17w6sKGDRuYMmUK99xzDwcOHOCbb75h27Zt3HvvvQ1Wo6IoaHx8PLLUpD1OJW9vbyZNmsTnn3/Ol19+SYcOHejd++xttvXr1zNt2jQmTpzIVVddRUREBImJiXX+XNq1a4fBYGDDhg2udVarle3bt9O5c2fXutDQUKZNm8Znn33GggUL+M9//uPa5u/vz+233857773H119/zXfffUdOTo5zo6pCWQFkH4fMQ1CS5Qw4Om8wt4awruAfVSXgqKpKZmE5eSVWUGHKgFjeuONqCThCCNECefRKzquvvso999zjCikLFixg2bJlvPPOO9X2tNm8eTNxcXHMmDEDgPj4eP785z8zf/78Rq37SjV58mTGjx/PgQMH+MMf/uC2rV27dixatIjx48ejKApPP/10ld5YteHr68v999/P448/TlBQEK1bt2b+/PmUlJRwzz3Omb6feeYZevfuTdeuXSkvL+enn35yBaDXXnuNyMhIevbsiUaj4ZtvviEiIoIAf5Pzqk1xJtjOaUBsNINfKBj8qrS7qaSqKqfzSskpdh5318A47rmuY63CohBCiObDYyHHYrGwY8cOnnzySbf1o0aNcmu7ca6BAwfy1FNPsXTpUsaOHUtGRgbffvstN9xwwwXfp7y83NVOBaCgoKB+foAr0PDhwwkKCuLIkSPceeedbttee+017r77bgYOHEhISAh//etfL/uzePHFF3E4HPzxj3+ksLCQPn36sGzZMgIDnV24DQYDs2fPJjExEW9vb4YMGcJXX30FgJ+fH//85z85duwYWq2Wvn16s/S/C9FkHgLV7nwDRVNxSyq02rmnzuVwqCTllFBQZkUBAn30DOkV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\n", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_loss_acc(history)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Build a regression model\n", "\n", "* Take the Boston housing dataset (http://lib.stat.cmu.edu/datasets/boston)\n", "* Records a set of variables for a set of houses in Boston, including among others:\n", " * CRIM per capita crime rate by town\n", " * ZN proportion of residential land zoned for lots over 25,000 sq.ft.\n", " * INDUS proportion of non-retail business acres per town\n", " * CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)\n", " * NOX nitric oxides concentration (parts per 10 million)\n", " * RM average number of rooms per dwelling\n", "* Can we use these variables to predict the value of a house (in tens of thousands of dollars)?" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(404, 13)\n", "[ 1.23247 0. 8.14 0. 0.538 6.142 91.7\n", " 3.9769 4. 307. 21. 396.9 18.72 ] 15.2\n", "Epoch 1/200\n", "26/26 [==============================] - 1s 11ms/step - loss: 21.6109 - mean_absolute_error: 21.6109 - val_loss: 22.4583 - val_mean_absolute_error: 22.4583\n", "Epoch 2/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 21.5772 - mean_absolute_error: 21.5772 - val_loss: 22.1258 - val_mean_absolute_error: 22.1258\n", "Epoch 3/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 21.3992 - mean_absolute_error: 21.3992 - val_loss: 21.6760 - val_mean_absolute_error: 21.6760\n", "Epoch 4/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 20.4030 - mean_absolute_error: 20.4030 - val_loss: 21.1131 - val_mean_absolute_error: 21.1131\n", "Epoch 5/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 19.9874 - mean_absolute_error: 19.9874 - val_loss: 20.4033 - val_mean_absolute_error: 20.4033\n", "Epoch 6/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 20.1219 - mean_absolute_error: 20.1219 - val_loss: 19.4908 - val_mean_absolute_error: 19.4908\n", "Epoch 7/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 19.1036 - mean_absolute_error: 19.1036 - val_loss: 18.3523 - val_mean_absolute_error: 18.3523\n", "Epoch 8/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 16.9931 - mean_absolute_error: 16.9931 - val_loss: 16.9236 - val_mean_absolute_error: 16.9236\n", "Epoch 9/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 15.5107 - mean_absolute_error: 15.5107 - val_loss: 15.2093 - val_mean_absolute_error: 15.2093\n", "Epoch 10/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 13.8636 - mean_absolute_error: 13.8636 - val_loss: 13.3415 - val_mean_absolute_error: 13.3415\n", "Epoch 11/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 10.8403 - mean_absolute_error: 10.8403 - val_loss: 11.5087 - val_mean_absolute_error: 11.5087\n", "Epoch 12/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 10.1296 - mean_absolute_error: 10.1296 - val_loss: 9.8450 - val_mean_absolute_error: 9.8450\n", "Epoch 13/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 8.5314 - mean_absolute_error: 8.5314 - val_loss: 8.9286 - val_mean_absolute_error: 8.9286\n", "Epoch 14/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 7.4231 - mean_absolute_error: 7.4231 - val_loss: 8.3958 - val_mean_absolute_error: 8.3958\n", "Epoch 15/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 6.5610 - mean_absolute_error: 6.5610 - val_loss: 7.9650 - val_mean_absolute_error: 7.9650\n", "Epoch 16/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 6.0700 - mean_absolute_error: 6.0700 - val_loss: 7.6045 - val_mean_absolute_error: 7.6045\n", "Epoch 17/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 6.4790 - mean_absolute_error: 6.4790 - val_loss: 7.2826 - val_mean_absolute_error: 7.2826\n", "Epoch 18/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 6.4365 - mean_absolute_error: 6.4365 - val_loss: 6.9918 - val_mean_absolute_error: 6.9918\n", "Epoch 19/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 5.6074 - mean_absolute_error: 5.6074 - val_loss: 6.8193 - val_mean_absolute_error: 6.8193\n", "Epoch 20/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 5.2630 - mean_absolute_error: 5.2630 - val_loss: 6.5662 - val_mean_absolute_error: 6.5662\n", "Epoch 21/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 4.8799 - mean_absolute_error: 4.8799 - val_loss: 6.3558 - val_mean_absolute_error: 6.3558\n", "Epoch 22/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 5.3026 - mean_absolute_error: 5.3026 - val_loss: 6.1528 - val_mean_absolute_error: 6.1528\n", "Epoch 23/200\n", "26/26 [==============================] - 0s 4ms/step - loss: 4.8555 - mean_absolute_error: 4.8555 - val_loss: 5.9158 - val_mean_absolute_error: 5.9158\n", "Epoch 24/200\n", "26/26 [==============================] - 0s 4ms/step - loss: 4.4126 - mean_absolute_error: 4.4126 - val_loss: 5.7136 - val_mean_absolute_error: 5.7136\n", "Epoch 25/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 4.8889 - mean_absolute_error: 4.8889 - val_loss: 5.5361 - val_mean_absolute_error: 5.5361\n", "Epoch 26/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 4.3249 - mean_absolute_error: 4.3249 - val_loss: 5.3887 - val_mean_absolute_error: 5.3887\n", "Epoch 27/200\n", "26/26 [==============================] - 0s 4ms/step - loss: 4.3867 - mean_absolute_error: 4.3867 - val_loss: 5.2056 - val_mean_absolute_error: 5.2056\n", "Epoch 28/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 4.2328 - mean_absolute_error: 4.2328 - val_loss: 5.0588 - val_mean_absolute_error: 5.0588\n", "Epoch 29/200\n", "26/26 [==============================] - 0s 4ms/step - loss: 3.8410 - mean_absolute_error: 3.8410 - val_loss: 5.0011 - val_mean_absolute_error: 5.0011\n", "Epoch 30/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 4.1569 - mean_absolute_error: 4.1569 - val_loss: 4.8193 - val_mean_absolute_error: 4.8193\n", "Epoch 31/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 4.1129 - mean_absolute_error: 4.1129 - val_loss: 4.7275 - val_mean_absolute_error: 4.7275\n", "Epoch 32/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 3.8021 - mean_absolute_error: 3.8021 - val_loss: 4.6429 - val_mean_absolute_error: 4.6429\n", "Epoch 33/200\n", "26/26 [==============================] - 0s 4ms/step - loss: 3.6084 - mean_absolute_error: 3.6084 - val_loss: 4.5976 - val_mean_absolute_error: 4.5976\n", "Epoch 34/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.4057 - mean_absolute_error: 3.4057 - val_loss: 4.5200 - val_mean_absolute_error: 4.5200\n", "Epoch 35/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.4512 - mean_absolute_error: 3.4512 - val_loss: 4.4400 - val_mean_absolute_error: 4.4400\n", "Epoch 36/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.6850 - mean_absolute_error: 3.6850 - val_loss: 4.3912 - val_mean_absolute_error: 4.3912\n", "Epoch 37/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 3.3947 - mean_absolute_error: 3.3947 - val_loss: 4.3434 - val_mean_absolute_error: 4.3434\n", "Epoch 38/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 3.4325 - mean_absolute_error: 3.4325 - val_loss: 4.3203 - val_mean_absolute_error: 4.3203\n", "Epoch 39/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 3.2524 - mean_absolute_error: 3.2524 - val_loss: 4.2855 - val_mean_absolute_error: 4.2855\n", "Epoch 40/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.4257 - mean_absolute_error: 3.4257 - val_loss: 4.2574 - val_mean_absolute_error: 4.2574\n", "Epoch 41/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.5643 - mean_absolute_error: 3.5643 - val_loss: 4.2011 - val_mean_absolute_error: 4.2011\n", "Epoch 42/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 3.2866 - mean_absolute_error: 3.2866 - val_loss: 4.1959 - val_mean_absolute_error: 4.1959\n", "Epoch 43/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 3.2424 - mean_absolute_error: 3.2424 - val_loss: 4.1707 - val_mean_absolute_error: 4.1707\n", "Epoch 44/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 3.3217 - mean_absolute_error: 3.3217 - val_loss: 4.1586 - val_mean_absolute_error: 4.1586\n", "Epoch 45/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 3.4827 - mean_absolute_error: 3.4827 - val_loss: 4.0989 - val_mean_absolute_error: 4.0989\n", "Epoch 46/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 3.1294 - mean_absolute_error: 3.1294 - val_loss: 4.0344 - val_mean_absolute_error: 4.0344\n", "Epoch 47/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.0754 - mean_absolute_error: 3.0754 - val_loss: 4.0216 - val_mean_absolute_error: 4.0216\n", "Epoch 48/200\n", "26/26 [==============================] - 0s 4ms/step - loss: 3.2781 - mean_absolute_error: 3.2781 - val_loss: 3.9775 - val_mean_absolute_error: 3.9775\n", "Epoch 49/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 3.4443 - mean_absolute_error: 3.4443 - val_loss: 3.9640 - val_mean_absolute_error: 3.9640\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 50/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.0027 - mean_absolute_error: 3.0027 - val_loss: 3.9250 - val_mean_absolute_error: 3.9250\n", "Epoch 51/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.9999 - mean_absolute_error: 2.9999 - val_loss: 3.8946 - val_mean_absolute_error: 3.8946\n", "Epoch 52/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.9025 - mean_absolute_error: 2.9025 - val_loss: 3.8765 - val_mean_absolute_error: 3.8765\n", "Epoch 53/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.3828 - mean_absolute_error: 3.3828 - val_loss: 3.8243 - val_mean_absolute_error: 3.8243\n", "Epoch 54/200\n", "26/26 [==============================] - 0s 4ms/step - loss: 2.8655 - mean_absolute_error: 2.8655 - val_loss: 3.8114 - val_mean_absolute_error: 3.8114\n", "Epoch 55/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 3.0028 - mean_absolute_error: 3.0028 - val_loss: 3.7765 - val_mean_absolute_error: 3.7765\n", "Epoch 56/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.8245 - mean_absolute_error: 2.8245 - val_loss: 3.7457 - val_mean_absolute_error: 3.7457\n", "Epoch 57/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.9468 - mean_absolute_error: 2.9468 - val_loss: 3.6888 - val_mean_absolute_error: 3.6888\n", "Epoch 58/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.7477 - mean_absolute_error: 2.7477 - val_loss: 3.6147 - val_mean_absolute_error: 3.6147\n", "Epoch 59/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.7427 - mean_absolute_error: 2.7427 - val_loss: 3.5787 - val_mean_absolute_error: 3.5787\n", "Epoch 60/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.7045 - mean_absolute_error: 2.7045 - val_loss: 3.5805 - val_mean_absolute_error: 3.5805\n", "Epoch 61/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 3.0758 - mean_absolute_error: 3.0758 - val_loss: 3.5434 - val_mean_absolute_error: 3.5434\n", "Epoch 62/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.5906 - mean_absolute_error: 2.5906 - val_loss: 3.4849 - val_mean_absolute_error: 3.4849\n", "Epoch 63/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.7056 - mean_absolute_error: 2.7056 - val_loss: 3.4252 - val_mean_absolute_error: 3.4252\n", "Epoch 64/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.6804 - mean_absolute_error: 2.6804 - val_loss: 3.4052 - val_mean_absolute_error: 3.4052\n", "Epoch 65/200\n", "26/26 [==============================] - 0s 14ms/step - loss: 2.6384 - mean_absolute_error: 2.6384 - val_loss: 3.3552 - val_mean_absolute_error: 3.3552\n", "Epoch 66/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.6821 - mean_absolute_error: 2.6821 - val_loss: 3.3848 - val_mean_absolute_error: 3.3848\n", "Epoch 67/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.6875 - mean_absolute_error: 2.6875 - val_loss: 3.3294 - val_mean_absolute_error: 3.3294\n", "Epoch 68/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.6849 - mean_absolute_error: 2.6849 - val_loss: 3.3058 - val_mean_absolute_error: 3.3058\n", "Epoch 69/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.8893 - mean_absolute_error: 2.8893 - val_loss: 3.3245 - val_mean_absolute_error: 3.3245\n", "Epoch 70/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.7964 - mean_absolute_error: 2.7964 - val_loss: 3.2691 - val_mean_absolute_error: 3.2691\n", "Epoch 71/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.5735 - mean_absolute_error: 2.5735 - val_loss: 3.2690 - val_mean_absolute_error: 3.2690\n", "Epoch 72/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.4603 - mean_absolute_error: 2.4603 - val_loss: 3.2075 - val_mean_absolute_error: 3.2075\n", "Epoch 73/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.8286 - mean_absolute_error: 2.8286 - val_loss: 3.2432 - val_mean_absolute_error: 3.2432\n", "Epoch 74/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.5907 - mean_absolute_error: 2.5907 - val_loss: 3.2104 - val_mean_absolute_error: 3.2104\n", "Epoch 75/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.5671 - mean_absolute_error: 2.5671 - val_loss: 3.1826 - val_mean_absolute_error: 3.1826\n", "Epoch 76/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.5603 - mean_absolute_error: 2.5603 - val_loss: 3.1717 - val_mean_absolute_error: 3.1717\n", "Epoch 77/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.5923 - mean_absolute_error: 2.5923 - val_loss: 3.1614 - val_mean_absolute_error: 3.1614\n", "Epoch 78/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.4337 - mean_absolute_error: 2.4337 - val_loss: 3.1742 - val_mean_absolute_error: 3.1742\n", "Epoch 79/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.3499 - mean_absolute_error: 2.3499 - val_loss: 3.1750 - val_mean_absolute_error: 3.1750\n", "Epoch 80/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.4428 - mean_absolute_error: 2.4428 - val_loss: 3.1836 - val_mean_absolute_error: 3.1836\n", "Epoch 81/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.5726 - mean_absolute_error: 2.5726 - val_loss: 3.1205 - val_mean_absolute_error: 3.1205\n", "Epoch 82/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.4468 - mean_absolute_error: 2.4468 - val_loss: 3.1168 - val_mean_absolute_error: 3.1168\n", "Epoch 83/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.7357 - mean_absolute_error: 2.7357 - val_loss: 3.1133 - val_mean_absolute_error: 3.1133\n", "Epoch 84/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.6405 - mean_absolute_error: 2.6405 - val_loss: 3.1159 - val_mean_absolute_error: 3.1159\n", "Epoch 85/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.3454 - mean_absolute_error: 2.3454 - val_loss: 3.0946 - val_mean_absolute_error: 3.0946\n", "Epoch 86/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.3561 - mean_absolute_error: 2.3561 - val_loss: 3.0853 - val_mean_absolute_error: 3.0853\n", "Epoch 87/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.7146 - mean_absolute_error: 2.7146 - val_loss: 3.0578 - val_mean_absolute_error: 3.0578\n", "Epoch 88/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.2003 - mean_absolute_error: 2.2003 - val_loss: 3.0596 - val_mean_absolute_error: 3.0596\n", "Epoch 89/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.3286 - mean_absolute_error: 2.3286 - val_loss: 3.0563 - val_mean_absolute_error: 3.0563\n", "Epoch 90/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.5906 - mean_absolute_error: 2.5906 - val_loss: 3.0548 - val_mean_absolute_error: 3.0548\n", "Epoch 91/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.5163 - mean_absolute_error: 2.5163 - val_loss: 3.0350 - val_mean_absolute_error: 3.0350\n", "Epoch 92/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.4024 - mean_absolute_error: 2.4024 - val_loss: 3.0270 - val_mean_absolute_error: 3.0270\n", "Epoch 93/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.4520 - mean_absolute_error: 2.4520 - val_loss: 3.0233 - val_mean_absolute_error: 3.0233\n", "Epoch 94/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.2772 - mean_absolute_error: 2.2772 - val_loss: 3.0040 - val_mean_absolute_error: 3.0040\n", "Epoch 95/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.4342 - mean_absolute_error: 2.4342 - val_loss: 2.9915 - val_mean_absolute_error: 2.9915\n", "Epoch 96/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.1948 - mean_absolute_error: 2.1948 - val_loss: 2.9922 - val_mean_absolute_error: 2.9922\n", "Epoch 97/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.3435 - mean_absolute_error: 2.3435 - val_loss: 2.9896 - val_mean_absolute_error: 2.9896\n", "Epoch 98/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.5737 - mean_absolute_error: 2.5737 - val_loss: 2.9889 - val_mean_absolute_error: 2.9889\n", "Epoch 99/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.3235 - mean_absolute_error: 2.3235 - val_loss: 2.9629 - val_mean_absolute_error: 2.9629\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Epoch 100/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.1062 - mean_absolute_error: 2.1062 - val_loss: 2.9691 - val_mean_absolute_error: 2.9691\n", "Epoch 101/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.3449 - mean_absolute_error: 2.3449 - val_loss: 2.9415 - val_mean_absolute_error: 2.9415\n", "Epoch 102/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.2614 - mean_absolute_error: 2.2614 - val_loss: 2.9312 - val_mean_absolute_error: 2.9312\n", "Epoch 103/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.5561 - mean_absolute_error: 2.5561 - val_loss: 2.9332 - val_mean_absolute_error: 2.9332\n", "Epoch 104/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.5775 - mean_absolute_error: 2.5775 - val_loss: 2.9219 - val_mean_absolute_error: 2.9219\n", "Epoch 105/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.1406 - mean_absolute_error: 2.1406 - val_loss: 2.9346 - val_mean_absolute_error: 2.9346\n", "Epoch 106/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.0823 - mean_absolute_error: 2.0823 - val_loss: 2.9237 - val_mean_absolute_error: 2.9237\n", "Epoch 107/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.0902 - mean_absolute_error: 2.0902 - val_loss: 2.9173 - val_mean_absolute_error: 2.9173\n", "Epoch 108/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.3657 - mean_absolute_error: 2.3657 - val_loss: 2.8883 - val_mean_absolute_error: 2.8883\n", "Epoch 109/200\n", "26/26 [==============================] - 0s 11ms/step - loss: 2.1326 - mean_absolute_error: 2.1326 - val_loss: 2.9165 - val_mean_absolute_error: 2.9165\n", "Epoch 110/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.2008 - mean_absolute_error: 2.2008 - val_loss: 2.8832 - val_mean_absolute_error: 2.8832\n", "Epoch 111/200\n", "26/26 [==============================] - 0s 11ms/step - loss: 2.2046 - mean_absolute_error: 2.2046 - val_loss: 2.8765 - val_mean_absolute_error: 2.8765\n", "Epoch 112/200\n", "26/26 [==============================] - 0s 11ms/step - loss: 2.1866 - mean_absolute_error: 2.1866 - val_loss: 2.8839 - val_mean_absolute_error: 2.8839\n", "Epoch 113/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.2433 - mean_absolute_error: 2.2433 - val_loss: 2.8860 - val_mean_absolute_error: 2.8860\n", "Epoch 114/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 2.3487 - mean_absolute_error: 2.3487 - val_loss: 2.8775 - val_mean_absolute_error: 2.8775\n", "Epoch 115/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 2.0762 - mean_absolute_error: 2.0762 - val_loss: 2.8816 - val_mean_absolute_error: 2.8816\n", "Epoch 116/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.4214 - mean_absolute_error: 2.4214 - val_loss: 2.8562 - val_mean_absolute_error: 2.8562\n", "Epoch 117/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.3256 - mean_absolute_error: 2.3256 - val_loss: 2.8444 - val_mean_absolute_error: 2.8444\n", "Epoch 118/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.2213 - mean_absolute_error: 2.2213 - val_loss: 2.8517 - val_mean_absolute_error: 2.8517\n", "Epoch 119/200\n", "26/26 [==============================] - 0s 16ms/step - loss: 2.1035 - mean_absolute_error: 2.1035 - val_loss: 2.8418 - val_mean_absolute_error: 2.8418\n", "Epoch 120/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.1066 - mean_absolute_error: 2.1066 - val_loss: 2.8510 - val_mean_absolute_error: 2.8510\n", "Epoch 121/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.0234 - mean_absolute_error: 2.0234 - val_loss: 2.8468 - val_mean_absolute_error: 2.8468\n", "Epoch 122/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.1654 - mean_absolute_error: 2.1654 - val_loss: 2.8296 - val_mean_absolute_error: 2.8296\n", "Epoch 123/200\n", "26/26 [==============================] - 0s 13ms/step - loss: 2.2259 - mean_absolute_error: 2.2259 - val_loss: 2.8241 - val_mean_absolute_error: 2.8241\n", "Epoch 124/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.3686 - mean_absolute_error: 2.3686 - val_loss: 2.8228 - val_mean_absolute_error: 2.8228\n", "Epoch 125/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.0912 - mean_absolute_error: 2.0912 - val_loss: 2.7992 - val_mean_absolute_error: 2.7992\n", "Epoch 126/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0180 - mean_absolute_error: 2.0180 - val_loss: 2.8051 - val_mean_absolute_error: 2.8051\n", "Epoch 127/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.9800 - mean_absolute_error: 1.9800 - val_loss: 2.8194 - val_mean_absolute_error: 2.8194\n", "Epoch 128/200\n", "26/26 [==============================] - 0s 11ms/step - loss: 1.9827 - mean_absolute_error: 1.9827 - val_loss: 2.8219 - val_mean_absolute_error: 2.8219\n", "Epoch 129/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.2058 - mean_absolute_error: 2.2058 - val_loss: 2.7984 - val_mean_absolute_error: 2.7984\n", "Epoch 130/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.0980 - mean_absolute_error: 2.0980 - val_loss: 2.8125 - val_mean_absolute_error: 2.8125\n", "Epoch 131/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.1512 - mean_absolute_error: 2.1512 - val_loss: 2.8078 - val_mean_absolute_error: 2.8078\n", "Epoch 132/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.2226 - mean_absolute_error: 2.2226 - val_loss: 2.8006 - val_mean_absolute_error: 2.8006\n", "Epoch 133/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.1684 - mean_absolute_error: 2.1684 - val_loss: 2.8207 - val_mean_absolute_error: 2.8207\n", "Epoch 134/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.3117 - mean_absolute_error: 2.3117 - val_loss: 2.8240 - val_mean_absolute_error: 2.8240\n", "Epoch 135/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9569 - mean_absolute_error: 1.9569 - val_loss: 2.7897 - val_mean_absolute_error: 2.7897\n", "Epoch 136/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.2826 - mean_absolute_error: 2.2826 - val_loss: 2.7844 - val_mean_absolute_error: 2.7844\n", "Epoch 137/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0468 - mean_absolute_error: 2.0468 - val_loss: 2.8270 - val_mean_absolute_error: 2.8270\n", "Epoch 138/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.8598 - mean_absolute_error: 1.8598 - val_loss: 2.7926 - val_mean_absolute_error: 2.7926\n", "Epoch 139/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0425 - mean_absolute_error: 2.0425 - val_loss: 2.8094 - val_mean_absolute_error: 2.8094\n", "Epoch 140/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 2.1512 - mean_absolute_error: 2.1512 - val_loss: 2.7883 - val_mean_absolute_error: 2.7883\n", "Epoch 141/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 2.0940 - mean_absolute_error: 2.0940 - val_loss: 2.7660 - val_mean_absolute_error: 2.7660\n", "Epoch 142/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 2.2522 - mean_absolute_error: 2.2522 - val_loss: 2.7677 - val_mean_absolute_error: 2.7677\n", "Epoch 143/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0983 - mean_absolute_error: 2.0983 - val_loss: 2.7593 - val_mean_absolute_error: 2.7593\n", "Epoch 144/200\n", "26/26 [==============================] - 0s 11ms/step - loss: 1.9190 - mean_absolute_error: 1.9190 - val_loss: 2.7624 - val_mean_absolute_error: 2.7624\n", "Epoch 145/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.1065 - mean_absolute_error: 2.1065 - val_loss: 2.7746 - val_mean_absolute_error: 2.7746\n", "Epoch 146/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.0141 - mean_absolute_error: 2.0141 - val_loss: 2.7522 - val_mean_absolute_error: 2.7522\n", "Epoch 147/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 1.9370 - mean_absolute_error: 1.9370 - val_loss: 2.7613 - val_mean_absolute_error: 2.7613\n", "Epoch 148/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0703 - mean_absolute_error: 2.0703 - val_loss: 2.7480 - val_mean_absolute_error: 2.7480\n", "Epoch 149/200\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "26/26 [==============================] - 0s 9ms/step - loss: 2.1192 - mean_absolute_error: 2.1192 - val_loss: 2.7636 - val_mean_absolute_error: 2.7636\n", "Epoch 150/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9302 - mean_absolute_error: 1.9302 - val_loss: 2.7525 - val_mean_absolute_error: 2.7525\n", "Epoch 151/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0195 - mean_absolute_error: 2.0195 - val_loss: 2.7480 - val_mean_absolute_error: 2.7480\n", "Epoch 152/200\n", "26/26 [==============================] - 0s 13ms/step - loss: 1.9020 - mean_absolute_error: 1.9020 - val_loss: 2.7630 - val_mean_absolute_error: 2.7630\n", "Epoch 153/200\n", "26/26 [==============================] - 0s 5ms/step - loss: 2.0030 - mean_absolute_error: 2.0030 - val_loss: 2.7461 - val_mean_absolute_error: 2.7461\n", "Epoch 154/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 1.9754 - mean_absolute_error: 1.9754 - val_loss: 2.7432 - val_mean_absolute_error: 2.7432\n", "Epoch 155/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.0527 - mean_absolute_error: 2.0527 - val_loss: 2.7575 - val_mean_absolute_error: 2.7575\n", "Epoch 156/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 2.1061 - mean_absolute_error: 2.1061 - val_loss: 2.7720 - val_mean_absolute_error: 2.7720\n", "Epoch 157/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.0949 - mean_absolute_error: 2.0949 - val_loss: 2.7517 - val_mean_absolute_error: 2.7517\n", "Epoch 158/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 2.1040 - mean_absolute_error: 2.1040 - val_loss: 2.7501 - val_mean_absolute_error: 2.7501\n", "Epoch 159/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 1.9812 - mean_absolute_error: 1.9812 - val_loss: 2.7378 - val_mean_absolute_error: 2.7378\n", "Epoch 160/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 2.1415 - mean_absolute_error: 2.1415 - val_loss: 2.7283 - val_mean_absolute_error: 2.7283\n", "Epoch 161/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.0386 - mean_absolute_error: 2.0386 - val_loss: 2.7524 - val_mean_absolute_error: 2.7524\n", "Epoch 162/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9954 - mean_absolute_error: 1.9954 - val_loss: 2.7441 - val_mean_absolute_error: 2.7441\n", "Epoch 163/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.2932 - mean_absolute_error: 2.2932 - val_loss: 2.7536 - val_mean_absolute_error: 2.7536\n", "Epoch 164/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.9488 - mean_absolute_error: 1.9488 - val_loss: 2.7416 - val_mean_absolute_error: 2.7416\n", "Epoch 165/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.9556 - mean_absolute_error: 1.9556 - val_loss: 2.7342 - val_mean_absolute_error: 2.7342\n", "Epoch 166/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9017 - mean_absolute_error: 1.9017 - val_loss: 2.7454 - val_mean_absolute_error: 2.7454\n", "Epoch 167/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 1.9576 - mean_absolute_error: 1.9576 - val_loss: 2.7563 - val_mean_absolute_error: 2.7563\n", "Epoch 168/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.1329 - mean_absolute_error: 2.1329 - val_loss: 2.7645 - val_mean_absolute_error: 2.7645\n", "Epoch 169/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 1.9891 - mean_absolute_error: 1.9891 - val_loss: 2.7905 - val_mean_absolute_error: 2.7905\n", "Epoch 170/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0846 - mean_absolute_error: 2.0846 - val_loss: 2.7413 - val_mean_absolute_error: 2.7413\n", "Epoch 171/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.9608 - mean_absolute_error: 1.9608 - val_loss: 2.7423 - val_mean_absolute_error: 2.7423\n", "Epoch 172/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.0748 - mean_absolute_error: 2.0748 - val_loss: 2.7647 - val_mean_absolute_error: 2.7647\n", "Epoch 173/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.8660 - mean_absolute_error: 1.8660 - val_loss: 2.7400 - val_mean_absolute_error: 2.7400\n", "Epoch 174/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.8207 - mean_absolute_error: 1.8207 - val_loss: 2.7521 - val_mean_absolute_error: 2.7521\n", "Epoch 175/200\n", "26/26 [==============================] - 0s 11ms/step - loss: 1.8221 - mean_absolute_error: 1.8221 - val_loss: 2.7295 - val_mean_absolute_error: 2.7295\n", "Epoch 176/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9739 - mean_absolute_error: 1.9739 - val_loss: 2.7391 - val_mean_absolute_error: 2.7391\n", "Epoch 177/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 1.8478 - mean_absolute_error: 1.8478 - val_loss: 2.7490 - val_mean_absolute_error: 2.7490\n", "Epoch 178/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.8959 - mean_absolute_error: 1.8959 - val_loss: 2.7275 - val_mean_absolute_error: 2.7275\n", "Epoch 179/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.1063 - mean_absolute_error: 2.1063 - val_loss: 2.7583 - val_mean_absolute_error: 2.7583\n", "Epoch 180/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 2.0418 - mean_absolute_error: 2.0418 - val_loss: 2.7637 - val_mean_absolute_error: 2.7637\n", "Epoch 181/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.8130 - mean_absolute_error: 1.8130 - val_loss: 2.7381 - val_mean_absolute_error: 2.7381\n", "Epoch 182/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 2.0561 - mean_absolute_error: 2.0561 - val_loss: 2.7520 - val_mean_absolute_error: 2.7520\n", "Epoch 183/200\n", "26/26 [==============================] - 0s 12ms/step - loss: 1.8741 - mean_absolute_error: 1.8741 - val_loss: 2.7346 - val_mean_absolute_error: 2.7346\n", "Epoch 184/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.8242 - mean_absolute_error: 1.8242 - val_loss: 2.7466 - val_mean_absolute_error: 2.7466\n", "Epoch 185/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9171 - mean_absolute_error: 1.9171 - val_loss: 2.7508 - val_mean_absolute_error: 2.7508\n", "Epoch 186/200\n", "26/26 [==============================] - 0s 18ms/step - loss: 2.0321 - mean_absolute_error: 2.0321 - val_loss: 2.7557 - val_mean_absolute_error: 2.7557\n", "Epoch 187/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.9743 - mean_absolute_error: 1.9743 - val_loss: 2.7344 - val_mean_absolute_error: 2.7344\n", "Epoch 188/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 1.9806 - mean_absolute_error: 1.9806 - val_loss: 2.7278 - val_mean_absolute_error: 2.7278\n", "Epoch 189/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.8372 - mean_absolute_error: 1.8372 - val_loss: 2.7703 - val_mean_absolute_error: 2.7703\n", "Epoch 190/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9704 - mean_absolute_error: 1.9704 - val_loss: 2.7623 - val_mean_absolute_error: 2.7623\n", "Epoch 191/200\n", "26/26 [==============================] - 0s 10ms/step - loss: 1.9210 - mean_absolute_error: 1.9210 - val_loss: 2.7495 - val_mean_absolute_error: 2.7495\n", "Epoch 192/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 1.8330 - mean_absolute_error: 1.8330 - val_loss: 2.7546 - val_mean_absolute_error: 2.7546\n", "Epoch 193/200\n", "26/26 [==============================] - 0s 9ms/step - loss: 1.9657 - mean_absolute_error: 1.9657 - val_loss: 2.7489 - val_mean_absolute_error: 2.7489\n", "Epoch 194/200\n", "26/26 [==============================] - 0s 8ms/step - loss: 1.9099 - mean_absolute_error: 1.9099 - val_loss: 2.7829 - val_mean_absolute_error: 2.7829\n", "Epoch 195/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 1.8235 - mean_absolute_error: 1.8235 - val_loss: 2.7689 - val_mean_absolute_error: 2.7689\n", "Epoch 196/200\n", "26/26 [==============================] - 0s 13ms/step - loss: 1.9017 - mean_absolute_error: 1.9017 - val_loss: 2.7503 - val_mean_absolute_error: 2.7503\n", "Epoch 197/200\n", "26/26 [==============================] - 0s 12ms/step - loss: 1.9999 - mean_absolute_error: 1.9999 - val_loss: 2.7654 - val_mean_absolute_error: 2.7654\n", "Epoch 198/200\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "26/26 [==============================] - 0s 11ms/step - loss: 1.9983 - mean_absolute_error: 1.9983 - val_loss: 2.7687 - val_mean_absolute_error: 2.7687\n", "Epoch 199/200\n", "26/26 [==============================] - 0s 7ms/step - loss: 1.8042 - mean_absolute_error: 1.8042 - val_loss: 2.7898 - val_mean_absolute_error: 2.7898\n", "Epoch 200/200\n", "26/26 [==============================] - 0s 6ms/step - loss: 1.7373 - mean_absolute_error: 1.7373 - val_loss: 2.7827 - val_mean_absolute_error: 2.7827\n" ] } ], "source": [ "import tensorflow\n", "from sklearn.preprocessing import StandardScaler #hint\n", "\n", "#This is how we load the dataset, pre-split in training/validation sets\n", "(X_train, y_train), (X_val, y_val) = tensorflow.keras.datasets.boston_housing.load_data(path=\"boston_housing.npz\", test_split=0.2, seed=113)\n", "\n", "#Let's have a look at the data\n", "print(X_train.shape)\n", "print(X_train[0], y_train[0])\n", "\n", "scaler = StandardScaler()\n", "scaler.fit(X_train)\n", "X_train = scaler.transform(X_train)\n", "X_val = scaler.transform(X_val)\n", "\n", "# Add your model here\n", "model = Sequential()\n", "model.add(Dense(10, activation=\"relu\", input_dim=13))\n", "model.add(Dense(4, activation=\"relu\"))\n", "model.add(Dense(1, activation=\"linear\"))\n", "\n", "model.compile(optimizer='adam', #adaptive learning rate method\n", " loss='mean_absolute_error', metrics=[\"mean_absolute_error\"]) \n", "\n", "history = model.fit(X_train, y_train, batch_size=16, epochs=200, validation_data=(X_val, y_val))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmIAAAGxCAYAAADBFNr6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB6tUlEQVR4nO3dd3hUZdrH8e/0zCST3gmE0AlNuqAI2CgqKK5iW2BVXBuKWFZfdVHXBcVV7GVdRV37KlZQsNCU3quhBRJISO9l6vP+ERgNCZAMISfl/lzXXM55TpnfmTPx3JzyHJ1SSiGEEEIIIRqdXusAQgghhBCtlRRiQgghhBAakUJMCCGEEEIjUogJIYQQQmhECjEhhBBCCI1IISaEEEIIoREpxIQQQgghNCKFmBBCCCGERqQQE0IIIYTQiBRiQgi/HThwAJ1OxzvvvFPveZcuXYpOp2Pp0qUNnksIIZoLKcSEEEIIITQihZgQQjSgiooK5BG+Qoi6kkJMiGbsscceQ6fTsXXrVq666ipCQkIIDw9nxowZuN1uUlJSGD16NHa7nfbt2zNnzpway0hLS+OGG24gOjoai8VC9+7defbZZ/F6vdWmy8jI4Oqrr8ZutxMSEsLEiRM5cuRIrbnWr1/PuHHjCA8PJyAggL59+/Lpp5/6tY45OTncfvvtJCcnExQURHR0NOeffz4rVqyoMa3D4eCJJ56ge/fuBAQEEBERwciRI1m5cqVvGq/Xy0svvcRZZ52F1WolNDSUs88+m6+//to3jU6n47HHHqux/Pbt2zNlyhTf8DvvvINOp2Px4sXceOONREVFYbPZcDgc7N27l7/85S907twZm81GmzZtuOyyy9i2bVuN5RYWFnLvvffSoUMHLBYL0dHRjB07lt9++w2lFJ07d2bUqFE15istLSUkJIQ77rijnt+qEKKpMGodQAhx+q6++mpuuOEG/vrXv/LDDz8wZ84cXC4XP/74I7fffjv33XcfH374IX/729/o1KkTEyZMAKqKnKFDh+J0OvnHP/5B+/bt+fbbb7nvvvvYt28fr776KlB1lOfCCy8kIyOD2bNn06VLFxYsWMDEiRNrZFmyZAmjR49m8ODBvP7664SEhPDxxx8zceJEysvLqxUydZGfnw/AzJkziY2NpbS0lC+++IIRI0bw008/MWLECADcbjdjxoxhxYoVTJ8+nfPPPx+3283q1atJS0tj6NChAEyZMoX333+fm266iSeeeAKz2czGjRs5cOCAf18+cOONN3LJJZfw3//+l7KyMkwmExkZGURERPDUU08RFRVFfn4+7777LoMHD2bTpk107doVgJKSEs4991wOHDjA3/72NwYPHkxpaSnLly8nMzOTbt26MW3aNKZPn86ePXvo3Lmz73Pfe+89iouLpRATojlTQohma+bMmQpQzz77bLX2s846SwFq/vz5vjaXy6WioqLUhAkTfG0PPvigAtSaNWuqzX/bbbcpnU6nUlJSlFJKvfbaawpQX331VbXppk6dqgA1b948X1u3bt1U3759lcvlqjbtpZdequLi4pTH41FKKbVkyRIFqCVLltRrnd1ut3K5XOqCCy5QV1xxha/9vffeU4B68803Tzjv8uXLFaAefvjhk34GoGbOnFmjPTExUU2ePNk3PG/ePAWoSZMm1Sm30+lUnTt3Vvfcc4+v/YknnlCA+uGHH044b3FxsbLb7eruu++u1p6cnKxGjhx5ys8WQjRdcmpSiBbg0ksvrTbcvXt3dDodY8aM8bUZjUY6derEwYMHfW0///wzycnJDBo0qNr8U6ZMQSnFzz//DFQd5bLb7YwbN67adNddd1214b179/Lbb79x/fXXA1VHqY69xo4dS2ZmJikpKfVev9dff51+/foREBCA0WjEZDLx008/sWvXLt803333HQEBAdx4440nXM53330H0OBHkK688soabW63m1mzZpGcnIzZbMZoNGI2m9mzZ0+N3F26dOHCCy884fLtdjt/+ctfeOeddygrKwOqtt3OnTu58847G3RdhBCNSwoxIVqA8PDwasNmsxmbzUZAQECN9srKSt9wXl4ecXFxNZYXHx/vG3/svzExMTWmi42NrTaclZUFwH333YfJZKr2uv322wHIzc2t17o999xz3HbbbQwePJjPP/+c1atXs27dOkaPHk1FRYVvupycHOLj49HrT/y/tZycHAwGQ43cp6u273DGjBk8+uijXH755XzzzTesWbOGdevW0adPnxq5ExISTvkZ06ZNo6SkhA8++ACAl19+mYSEBMaPH99wKyKEaHRyjZgQrVhERASZmZk12jMyMgCIjIz0Tbd27doa0x1/sf6x6R966CHfdWjHO3ZtVF29//77jBgxgtdee61ae0lJSbXhqKgofvnlF7xe7wmLsaioKDweD0eOHKm1eDrGYrHgcDhqtB8rTI+n0+lqzT1p0iRmzZpVrT03N5fQ0NBqmQ4dOnTCLMd06tSJMWPG8MorrzBmzBi+/vprHn/8cQwGwynnFUI0XXJETIhW7IILLmDnzp1s3LixWvt7772HTqdj5MiRAIwcOZKSkpJqdxYCfPjhh9WGu3btSufOndmyZQsDBgyo9WW32+uVUafTYbFYqrVt3bqVVatWVWsbM2YMlZWVJ+1c9tip2uOLuuO1b9+erVu3Vmv7+eefKS0tPa3cCxYs4PDhwzUy7d6923ca+GTuvvtutm7dyuTJkzEYDEydOrXOeYQQTZMcEROiFbvnnnt47733uOSSS3jiiSdITExkwYIFvPrqq9x222106dIFgEmTJjF37lwmTZrEP//5Tzp37szChQtZtGhRjWW+8cYbjBkzhlGjRjFlyhTatGlDfn4+u3btYuPGjfzvf/+rV8ZLL72Uf/zjH8ycOZPhw4eTkpLCE088QVJSEm632zfdtddey7x587j11ltJSUlh5MiReL1e1qxZQ/fu3bnmmmsYNmwYf/7zn3nyySfJysri0ksvxWKxsGnTJmw2G9OmTQPgz3/+M48++ih///vfGT58ODt37uTll18mJCSkXrnfeecdunXrRu/evdmwYQPPPPNMjdOQ06dP55NPPmH8+PE8+OCDDBo0iIqKCpYtW8all17qK4YBLrroIpKTk1myZImvyxEhRDOn9d0CQgj/HbtrMicnp1r75MmTVWBgYI3phw8frnr06FGt7eDBg+q6665TERERymQyqa5du6pnnnnGd3fjMYcOHVJXXnmlCgoKUna7XV155ZVq5cqVNe6aVEqpLVu2qKuvvlpFR0crk8mkYmNj1fnnn69ef/113zR1vWvS4XCo++67T7Vp00YFBASofv36qS+//FJNnjxZJSYmVpu2oqJC/f3vf1edO3dWZrNZRUREqPPPP1+tXLnSN43H41Fz585VPXv2VGazWYWEhKghQ4aob775ptpnPvDAA6pt27bKarWq4cOHq82bN5/wrsl169bVyF1QUKBuuukmFR0drWw2mzr33HPVihUr1PDhw9Xw4cNrTHv33Xerdu3aKZPJpKKjo9Ull1yifvvttxrLfeyxxxSgVq9efdLvTQjRPOiUki6ghRCiuRgwYAA6nY5169ZpHUUI0QDk1KQQQjRxxcXFbN++nW+//ZYNGzbwxRdfaB1JCNFApBATQogmbuPGjYwcOZKIiAhmzpzJ5ZdfrnUkIUQDkVOTQgghhBAake4rhBBCCCE0IoWYEEIIIYRGpBATQgghhNBIi79Y3+12s2nTJmJiYk76DDohhBBCNB1er5esrCz69u2L0dhyy5WWu2ZHbdq0iUGDBmkdQwghhBB+WLt2LQMHDtQ6xhnT4guxmJgYoGpDnuwhv0IIIYRoOjIzMxk0aJBvP95StfhC7NjpyLi4uBrPeBNCCCFE09bSLytq2WsnhBBCCNGESSEmhBBCCKERKcSEEEIIITTS4q8RqwulFG63G4/Ho3UUIcQfGAwGjEYjOp1O6yhCCHFGtPpCzOl0kpmZSXl5udZRhBC1sNlsxMXFYTabtY4ihBANrlUXYl6vl9TUVAwGA/Hx8ZjNZvmXtxBNhFIKp9NJTk4OqampdO7cucXfPSWEaH1adSHmdDrxer20bdsWm82mdRwhxHGsVismk4mDBw/idDoJCAjQOpIQQjQo+eclLb+PEiGaM/n7FEK0ZPJ/OCGEEEIIjUghJoQQQgihESnEBADt27fn+eef1zpGk3Wmv5933nmH0NDQM7Z8IYQQTZMUYs3UiBEjmD59eoMtb926ddxyyy0Ntjxx5jX0b0AIIUTjk0LMT5WVxaRl7ySn4IDWUU7oWEe1dREVFSV3jop6O9FvzOl0+rU8f+cTQojmSgqx4ykFZWWnfBXnpJFbnEd23iFUaWmd5jnpS6k6R5wyZQrLli3jhRdeQKfTodPpOHDgAEuXLkWn07Fo0SIGDBiAxWJhxYoV7Nu3j/HjxxMTE0NQUBADBw7kxx9/rLbM40+96XQ6/vOf/3DFFVdgs9no3LkzX3/99UlztW/fnieffJJJkyYRFBREYmIiX331FTk5OYwfP56goCB69erF+vXrq823cuVKzjvvPKxWK23btuWuu+6irKzMN/79999nwIAB2O12YmNjue6668jOzvaNP7beP/30EwMGDMBmszF06FBSUlLq9H3W5fsBKCkp4brrriMoKIj4+HheeumlauMfe+wx2rVrh8ViIT4+nrvuuss3rqCggEmTJhEWFobNZmPMmDHs2bPnhJmmTJnC5ZdfXq1t+vTpjBgxwje+tt8AwM6dOxk7dixBQUHExMTw5z//mdzc3Dp9F0op5syZQ4cOHbBarfTp04fPPvvMN/5Ev7ERI0Zw5513MmPGDCIjI7nooosAWLZsGYMGDcJisRAXF8eDDz5YrXA70XxCCNFqqBYuPT1dASo9Pb3GuIqKCrVz505VUVHxe2NpqVJVZVHjvkpL67xOhYWFasiQIWrq1KkqMzNTZWZmKrfbrZYsWaIA1bt3b7V48WK1d+9elZubqzZv3qxef/11tXXrVrV792718MMPq4CAAHXw4EHfMhMTE9XcuXN9w4BKSEhQH374odqzZ4+66667VFBQkMrLyzthrsTERBUeHq5ef/11tXv3bnXbbbcpu92uRo8erT799FOVkpKiLr/8ctW9e3fl9XqVUkpt3bpVBQUFqblz56rdu3erX3/9VfXt21dNmTLFt9y33npLLVy4UO3bt0+tWrVKnX322WrMmDG+8cfWe/DgwWrp0qVqx44datiwYWro0KF1+j7r+v3Y7XY1e/ZslZKSol588UVlMBjU4sWLlVJK/e9//1PBwcFq4cKF6uDBg2rNmjXq3//+t2/+cePGqe7du6vly5erzZs3q1GjRqlOnTopp9OplFJq3rx5KiQkxDf95MmT1fjx46vlvPvuu9Xw4cOVUif+DWRkZKjIyEj10EMPqV27dqmNGzeqiy66SI0cObJO38X//d//qW7duqnvv/9e7du3T82bN09ZLBa1dOnSat/18b+x4cOHq6CgIHX//fer3377Te3atUsdOnRI2Ww2dfvtt6tdu3apL774QkVGRqqZM2f6Pq+2+Y5X69+pEKLFO9n+uyWRQqwZFmJKVe3A7r777mptx3aSX3755SnnT05OVi+99JJvuLZC7JFHHvnD11KqdDqd+u677064zMTERHXDDTf4hjMzMxWgHn30UV/bqlWrFKAyMzOVUkr9+c9/Vrfccku15axYsULp9foT7njXrl2rAFVSUlJtvX/88UffNAsWLFCA3zvv2r6f0aNHV5tm4sSJvoLw2WefVV26dPEVVn+0e/duBahff/3V15abm6usVqv69NNPlVL1L8SUqv038Oijj6qLL764Wtuxv4GUlJSTrnNpaakKCAhQK1eurNZ+0003qWuvvVYpdeLf2PDhw9VZZ51Vre3//u//VNeuXX1Ft1JKvfLKKyooKEh5PJ4Tznc8KcSEaJ1aSyHWqnvWr5XNBqWldZq0orKIXQX7AOgR3gWLJej0PreBDBgwoNpwWVkZjz/+ON9++y0ZGRm43W4qKipIS0s76XJ69+7tex8YGIjdbq92SvBU88TExADQq1evGm3Z2dnExsayYcMG9u7dywcffOCbRinle/xU9+7d2bRpE4899hibN28mPz8fr9cLQFpaGsnJybV+dlxcnO9z2rVrd9LMdf1+hgwZUmP42Oncq666iueff54OHTowevRoxo4dy2WXXYbRaGTXrl0YjUYGDx7smzciIoKuXbuya9euk2arrw0bNrBkyRKCgmr+Fvft20eXLl1OOO/OnTuprKyscXrQ6XTSt2/fam3H/8Zqa9u1axdDhgyp9tiwc845h9LSUg4dOuTbLrUtSwghWgspxI6n00FgYJ0mtQYGEujMpkS5yfUU0CYw5gyHq5vA4/Lff//9LFq0iH/961906tQJq9XKn/70p1NeGG0ymaoN63Q6XxFUl3mO7YBrazu2HK/Xy1//+tdq11Md065dO8rKyrj44ou5+OKLef/994mKiiItLY1Ro0bVyH+yzzkZf7+fP35O27ZtSUlJ4YcffuDHH3/k9ttv55lnnmHZsmWoE1z/p5Q64bNN9Xp9jflcLtcp83i9Xi677DKefvrpGuOOFacnmxdgwYIFtGnTpto4i8VSbfj431htbbWt37F1+mN7bcsSQojWQgqx0xRti6Sk7Ag5rlLivB70ekOjfK7ZbMbj8dRp2hUrVjBlyhSuuOIKAEpLS30XdmutX79+7Nixg06dOtU6ftu2beTm5vLUU0/Rtm1bgBoX+5+uun4/q1evrjHcrVs337DVamXcuHGMGzeOO+64g27durFt2zaSk5Nxu92sWbOGoUOHApCXl8fu3bvp3r17rZmioqLYvn17tbbNmzdXKzZr+w3069ePzz//nPbt22M01u/POzk5GYvFQlpaGsOHD6/XvCda3ueff16tIFu5ciV2u71GoSeEEK2V3DV5mkLt8RgBN1BWXrc70xpC+/btWbNmDQcOHCA3N/ekR346derE/Pnz2bx5M1u2bOG6666r05GixvC3v/2NVatWcccdd7B582b27NnD119/zbRp04Cqo2Jms5mXXnqJ/fv38/XXX/OPf/yjQTPU9fv59ddfmTNnDrt37+aVV17hf//7H3fffTdQ1SHrW2+9xfbt29m/fz///e9/sVqtJCYm0rlzZ8aPH8/UqVP55Zdf2LJlCzfccANt2rRh/PjxtWY6//zzWb9+Pe+99x579uxh5syZNQqz2n4Dd9xxB/n5+Vx77bWsXbuW/fv3s3jxYm688cZTFu52u5377ruPe+65h3fffZd9+/axadMmXnnlFd599916f6+333476enpTJs2jd9++42vvvqKmTNnMmPGDHl+pBBCHCX/NzxdOh0hhgAACivyGu1j77vvPgwGA8nJyb7TdScyd+5cwsLCGDp0KJdddhmjRo2iX79+jZb1ZHr37s2yZcvYs2cPw4YNo2/fvjz66KO+02hRUVG88847/O9//yM5OZmnnnqKf/3rXw2aoa7fz7333suGDRvo27cv//jHP3j22WcZNWoUAKGhobz55pucc8459O7dm59++olvvvmGiIgIAObNm0f//v259NJLGTJkCEopFi5cWOP07zGjRo3i0Ucf5YEHHmDgwIGUlJQwadKkatPU9huIj4/n119/xePxMGrUKHr27Mndd99NSEhInYqff/zjH/z9739n9uzZdO/enVGjRvHNN9+QlJRU36+VNm3asHDhQtauXUufPn249dZbuemmm3jkkUfqvSwhhGipdOpEF7C0EIcOHaJt27akp6eTkJBQbVxlZSWpqakkJSUREBBQr+VWFBShMjLwBgbhCtexr/QIFnT0jOt3wut+hBD1dzp/p0KI5utk+++WRI6I+clbWYmtogxLfh52axQ6wIGiorJQ62hCCCGEaCakEPOTNToKl96IyevGkVNIsL7qFFNhWY7GycTxevToQVBQUK2vP3ab0dKlpaWd8HsICgo6ZXcmQgghGp7cNeknvUFPeXgEptwsDLnZhLYNpqgij0JXKfFahxPVLFy48IRdPxzr16w1iI+PZ/PmzScdL4QQonFJIXYaAuJi8OZlE+B04PbEAHmUKy9OZxlms/SN1FQkJiZqHaFJMBqNJ+wmRAghhDbk1ORpMFrMlNtDAdBnFxCoq+pDrLgRu7EQQgghRPMlhdhpMsXFAmAtLyFIX9X7eImjRMtIQgghhGgmpBA7TRZ7IJUWKzogwFF1RKzU49A2lBBCCCGaBSnEGoA7JBQAW1HVBeEOFE5nmYaJhBBCCNEcSCHWACzRkSgg0FGJ7ehXWlLeeL3sCyGEEKJ5kkKsAZgCLFQG2AAIdFednixxFmsZqU7at2/P888/r3UMTUyZMoXLL7/8jC3/wIED6HS6k3YXIYQQQkgh1kC8oWEABJZVPTGqxC3XiYn6eeyxxzjrrLO0jiGEEKIRSSHWQCzRkXjREVruBo5dJ1aucSoh6q+2zm9P1CGuP8sSQgjxOynEjqOUosxZVu+XAyd5JnC4KlCOSipcFWQVp9d5/vo8e/2NN96gTZs2eL3eau3jxo1j8uTJAOzbt4/x48cTExNDUFAQAwcO5Mcff6zXd3Hs9N2sWbOIiYkhNDSUxx9/HLfbzf333094eDgJCQm8/fbb1eY7fPgwEydOJCwsjIiICMaPH8+BAwd849etW8dFF11EZGQkISEhDB8+nI0bN1Zbhk6n4z//+Q9XXHEFNpuNzp078/XXX9cpt8fj4aabbiIpKQmr1UrXrl154YUXap328ccfJzo6muDgYP7617/idDp94z777DN69eqF1WolIiKCCy+8kLKyqpswvF4vTzzxBAkJCVgsFs466yy+//77E2Z65513CA0Nrdb25Zdf+h4Q/8477/D444+zZcsWdDodOp2Od955B4CioiJuueUWX87zzz+fLVu21Om7APjmm2/o378/AQEBdOjQwbcNj9HpdLz++uuMHz+ewMBAnnzySd/RubfffpsOHTpgsVhQSpGWlsb48eMJCgoiODiYq6++mqysLN+yTjSfEEKI2knP+scpd5UTNDuo0T+39KFSAuvYG/9VV13FXXfdxZIlS7jgggsAKCgoYNGiRXzzzTdVyystZezYsTz55JMEBATw7rvvctlll5GSkkK7du3qnOvnn38mISGB5cuX8+uvv3LTTTexatUqzjvvPNasWcMnn3zCrbfeykUXXUTbtm0pLy9n5MiRDBs2jOXLl2M0GnnyyScZPXo0W7duxWw2U1JSwuTJk3nxxRcBePbZZxk7dix79uzBbrf7Pvvxxx9nzpw5PPPMM7z00ktcf/31HDx4kPDw8JNm9nq9JCQk8OmnnxIZGcnKlSu55ZZbiIuL4+qrr/ZN99NPPxEQEMCSJUs4cOAAf/nLX4iMjOSf//wnmZmZXHvttcyZM4crrriCkpISVqxY4SsqXnjhBZ599lneeOMN+vbty9tvv824cePYsWMHnTt3rvP3e8zEiRPZvn0733//va9gDgkJQSnFJZdcQnh4OAsXLiQkJIQ33niDCy64gN27d5/yu1i0aBE33HADL774IsOGDWPfvn3ccsstAMycOdM33cyZM5k9ezZz587FYDAwb9489u7dy6effsrnn3+OwVB17ePll19OYGAgy5Ytw+12c/vttzNx4kSWLl3qW1Zt8wkhhDgB1cKlp6crQKWnp9cYV1FRoXbu3KkqKip8baWOUsVjNPqr1FFar/UaN26cuvHGG33Db7zxhoqNjVVut/uE8yQnJ6uXXnrJN5yYmKjmzp17wuknT56sEhMTlcfj8bV17dpVDRs2zDfsdrtVYGCg+uijj5RSSr311luqa9euyuv1+qZxOBzKarWqRYsW1fo5brdb2e129c033/jaAPXII4/4hktLS5VOp1PffffdCfOezO23366uvPLKausWHh6uysrKfG2vvfaaCgoKUh6PR23YsEEB6sCBA7UuLz4+Xv3zn/+s1jZw4EB1++23K6WUSk1NVYDatGmTUkqpefPmqZCQkGrTf/HFF+qPf4IzZ85Uffr0qTbNTz/9pIKDg1VlZWW19o4dO6o33njjlOs9bNgwNWvWrGpt//3vf1VcXJxvGFDTp0+vNs3MmTOVyWRS2dnZvrbFixcrg8Gg0tLSfG07duxQgFq7du0J5ztdtf2dCiFavpPtv1sSOSJ2HJvJRulDpX7Nq5TCs2UrLr2HXVFV5337xJ6FTnfqM8A2k61en3X99ddzyy238Oqrr2KxWPjggw+45pprfEcgysrKePzxx/n222/JyMjA7XZTUVFBWlpavT6nR48e6PW/54+JiaFnz56+YYPBQEREBNnZ2QBs2LCBvXv3VjuyBVBZWcm+ffsAyM7O5u9//zs///wzWVlZeDweysvLa2Tr3bu3731gYCB2u933Oafy+uuv85///IeDBw9SUVGB0+mscSF8nz59sNl+/96HDBlCaWkp6enp9OnThwsuuIBevXoxatQoLr74Yv70pz8RFhZGcXExGRkZnHPOOdWWd84559TrlGFdbNiwgdLSUiIiIqq1V1RU+L7PU82/bt06/vnPf/raPB4PlZWVlJeX+9Z/wIABNeZNTEwkKirKN7xr1y7atm1L27ZtfW3JycmEhoaya9cuBg4cWOt8QgghTkwKsePodLo6nyKsTVlwFMGlRQQawasDg9eD1Wo/9Yz1dNlll+H1elmwYAEDBw5kxYoVPPfcc77x999/P4sWLeJf//oXnTp1wmq18qc//anaNVB1YTKZqg3rdLpa245dr+b1eunfvz8ffPBBjWUd2zlPmTKFnJwcnn/+eRITE7FYLAwZMqRGtpN9zsl8+umn3HPPPTz77LMMGTIEu93OM888w5o1a069wkc/x2Aw8MMPP7By5UoWL17MSy+9xMMPP8yaNWt8RdGx67uOUUrVaDtGr9fXuFaqLheye71e4uLiqp36O+b4a85ONP/jjz/OhAkTaowLCAjwvQ8MrPmbP77tROt3fHttyxJCCFE7KcQamt2OrrQIqxvKTFDuKMZqDW3wj7FarUyYMIEPPviAvXv30qVLF/r37+8bv2LFCqZMmcIVV1wBVF0z9scL5s+Ufv368cknn/guLK/NihUrePXVVxk7diwA6enp5OY23IPSV6xYwdChQ7n99tt9bbUdPdqyZQsVFRVYrVYAVq9eTVBQEAkJCUBVoXXOOedwzjnn8Pe//53ExES++OILZsyYQXx8PL/88gvnnXeeb3krV65k0KBBtWaKioqipKSEsrIyX6FyfB9jZrMZj8dTra1fv34cOXIEo9FI+/bt6/1d9OvXj5SUFDp16lTveY+XnJxMWloa6enpvqNiO3fupKioiO7du5/28oUQojWSuyYbmDksFIDAowd3yl1n7lFH119/PQsWLODtt9/mhhtuqDauU6dOzJ8/n82bN7Nlyxauu+66Oh1NaohMkZGRjB8/nhUrVpCamsqyZcu4++67OXTokC/bf//7X3bt2sWaNWu4/vrrfcVQQ+jUqRPr169n0aJF7N69m0cffZR169bVmM7pdHLTTTexc+dOvvvuO2bOnMmdd96JXq9nzZo1zJo1i/Xr15OWlsb8+fPJycnxFRz3338/Tz/9NJ988gkpKSk8+OCDbN68mbvvvrvWTIMHD8Zms/F///d/7N27lw8//NB3V+Qx7du3JzU1lc2bN5Obm4vD4eDCCy9kyJAhXH755SxatIgDBw6wcuVKHnnkEdavX3/K7+Lvf/877733Ho899hg7duxg165dfPLJJzzyyCP1/l4vvPBCevfuzfXXX8/GjRtZu3YtkyZNYvjw4bWe2hRCCHFqUog1MJMtAKfRjO3oWafyM9ix6/nnn094eDgpKSlcd9111cbNnTuXsLAwhg4dymWXXcaoUaPo16/fGctyjM1mY/ny5bRr144JEybQvXt3brzxRioqKnxHyN5++20KCgro27cvf/7zn7nrrruIjo5usAy33norEyZMYOLEiQwePJi8vLxqR8eOueCCC+jcuTPnnXceV199NZdddhmPPfYYAMHBwSxfvpyxY8fSpUsXHnnkEZ599lnGjBkDwF133cW9997LvffeS69evfj+++/5+uuvT3jHZHh4OO+//z4LFy6kV69efPTRR77POubKK69k9OjRjBw5kqioKD766CN0Oh0LFy7kvPPO48Ybb6RLly5cc801HDhwgJiYmFN+F6NGjeLbb7/lhx9+YODAgZx99tk899xzJCYm1u9LpeoI4ZdffklYWBjnnXceF154IR06dOCTTz6p97KEEEJU0anjL1xpYQ4dOkTbtm1JT0/3nXI6prKyktTUVJKSkqpdL3O6SnfvQ19RwM4oMABnxfU/4bVDQoiTO1N/p0KIpu1k+++WRI6InQE6u50AF+gUeACHo0TrSEIIIYRogqQQOwNMwUHo4ffTk44iTfO0NLfeeitBQUG1vm699Vat4zWqHj16nPC7qO3OVSGEEE2L3DV5BphsVtw6PTaXlzIzlDvLOHn/56I+nnjiCe67775ax53oTs2WauHChSfsBqMu15AJIYTQlhRiZ4BOp8MZYMV29I7Jcnelxolalujo6Aa9uL858+eieyGEEE2HnJqEM/JQYq81EOvRAxUVyn3yiYUQJ9TC7ycSQrRyrboQO9Zze3l5eYMvWx8USMDR+ssFeNz169FeCFHl2N/n8U9aEEKIlqBVn5o0GAyEhob6nl9os9karJsJb4AJtwKDAzwGKCrJw2YNa5BlC9EaKKUoLy8nOzub0NBQ33NUhRCiJdG0EJs9ezbz58/nt99+w2q1MnToUJ5++mm6du3qm0YpxeOPP86///1vCgoKGDx4MK+88go9evRokAyxsbEAdX6YdH148gsorPTgMAAWB4FWuWRfiPoKDQ31/Z0KIcSJNIWawh+aFmLLli3jjjvuYODAgbjdbh5++GEuvvhidu7c6Xse35w5c3juued455136NKlC08++SQXXXQRKSkp2O2n/zBtnU5HXFwc0dHRdXoIc33seOifLAz7hf/1gDviBzNtwrsNunwhWjqTySRHwoQQddIUagq/qCYkOztbAWrZsmVKKaW8Xq+KjY1VTz31lG+ayspKFRISol5//fU6LTM9PV0BKj09/YxkPplVd/yfemYoisdQE59r3+ifL4QQQjRXp7v/PhM1xZnQpC7WLyqq6vg0PLzqFF5qaipHjhzh4osv9k1jsVgYPnw4K1eurHUZDoeD4uJi36ukRLte7YPPPZuuuVXvU8pzNMshhBBCNFclJSXV9usOR92e4dwQNUVjaDKFmFKKGTNmcO6559KzZ08Ajhw5AtTsmDImJsY37nizZ88mJCTE90pOTj6zwU+izbkD6ZpX9X63qwyvR7qxEEIIIeojOTm52n599uzZp5ynoWqKxtBk7pq888472bp1K7/88kuNccffyaiUOuHdjQ899BAzZszwDR8+fFizYiwkIZZyVyhGTyHlBjicuZG2CYM0ySKEEEI0Rzt37qRNmza+YYvFcsp5GqqmaAxN4ojYtGnT+Prrr1myZEm1J6wfu1Pq+Eo1Ozv7hI9vsVgsBAcH+16aXXx3VF58RzoWVL1PObBc0yxCCCFEc2O326vt109ViDVkTdEYNC3ElFLceeedzJ8/n59//pmkpKRq45OSkoiNjeWHH37wtTmdTpYtW8bQoUMbO65fyjp2pcvR05MpmRu1DSOEEEK0UM21ptD01OQdd9zBhx9+yFdffYXdbvdVqSEhIVitVnQ6HdOnT2fWrFl07tyZzp07M2vWLGw2G9ddd52W0esuOZmum+GbrpCSm6J1GiGEEKJFaq41haaF2GuvvQbAiBEjqrXPmzePKVOmAPDAAw9QUVHB7bff7ut8bfHixZqfcqwre/+z6PpT1fvdJYe0DSOEEEK0UM21ptAp1bKfqHvo0CHatm1Lenp6tXPFjaUwLZNtw+I570Zoj4nUmfLMSSGEEOJUtN5/N5YmcbF+SxbaLo7oymAADioXFeX5GicSQgghRFMhhVgjcIZ1wu4ApYODh9ZoHUcIIYQQTYQUYo2gvGNXEgur3h88slnLKEIIIYRoQqQQaww9epBY9aQFDub+pm0WIYQQQjQZUog1Anu/3rQvrHp/sCBV0yxCCCGEaDqkEGsE8UMH+E5N7i9I1zSLEEIIIZoOKcQaQWi7OGIqTAAcLMnVOI0QQgghmgopxBpJiC4SgDRPucZJhBBCCNFUSCHWSIIC2wOQafTickoxJoQQQggpxBpNQFwPLG7w6uBQxgat4wghhBCiCZBCrJGYOnf+vS+xzE2aZhFCCCFE0yCFWCOxdevi60vsQPYObcMIIYQQokmQQqyRRPTu5jsidiBvr6ZZhBBCCNE0SCHWSKK7d6JtsQ6A/TkHtA0jhBBCiCZBCrFGYjAZiXLZAEgrydE4jRBCCCGaAinEGlGoMQqAdK90XyGEEEIIKcQaVYi9IwDpJg9ej1vjNEIIIYTQmhRijSi47VkYvODSQ2bWFq3jCCGEEEJjUog1Ilu3ZBKKq94fPLxR2zBCCCGE0JwUYo0oJLmrrwuLtJydmmYRQgghhPakEGtEMX2TiS+pen/wyG5twwghhBBCc1KINaKgyDCiKg0AHDpyQNswQgghhNCcFGKNLExV9SWWVZyrcRIhhBBCaE0KsUYWagwBINtdqnESIYQQQmhNCrFGFmKNBSBb59A4iRBCCCG0JoVYIwsNSwLgiNmjcRIhhBBCaE0KsUYWkdALgAIzVFYUahtGCCGEEJqSQqyRRXfuh+Xo042OZG/XNowQQgghNCWFWCML7daR2KPX6R/Okk5dhRBCiNZMCrFGFtGpPXHHOnVN3aptGCGEEEJoSgqxRma2BRBToQMg/VCKxmmEEEIIoSUpxDQQ6TIDcCT/kMZJhBBCCKElKcQ0EHG0d/3sijyNkwghhBBCS1KIaSDUFApAjkd61xdCCCFaMynENBAWFAdAtt6pcRIhhBBCaEkKMQ1ERnYCIEt61xdCCCFaNSnENBDd/iwAsgPA45ajYkIIIURrJYWYBtr1OAe9F7x6yM7ZpXUcIYQQQmhECjENRCd3Jbqs6v3+Peu0DSOEEEIIzUghpgFbWAhxRwuxA7ulEBNCCCFaKynENBLtMACQkbFb4yRCCCGE0IoUYhqJdFf1rp9dlKFxEiGEEEJoRQoxjUToAgHIrczXOIkQQgghtCKFmEbCzGEA5HvLNU4ihBBCCK1IIaaR0MAoAAqkd30hhBCi1ZJCTCNhYW0ByDNJ7/pCCCFEayWFmEYiYzoAkGtRGicRQgghhFakENNIXPs+AOQFgNfj1jiNEEIIIbQghZhG2vUYDIBHD5lpOzVOI4QQQggtSCGmkYg27QiurHp/MGWttmGEEEIIoQkpxDSi0+uJOlqIZR7coW0YIYQQQmii3oWYy+WiQ4cO7Nwpp9NOV4Sj6uvPzd6vcRIhhBBCaKHehZjJZMLhcKDT6c5EnlYl3F31vMn8wkyNkwghhBBCC36dmpw2bRpPP/00brfc7Xc6wrwWAAoqcjVOIoQQQggtGP2Zac2aNfz0008sXryYXr16ERgYWG38/PnzGyRcSxeqswGlFLqKtY4ihBBCCA34VYiFhoZy5ZVXNnSWVifUHAxkU6gqtI4ihBBCCA34VYjNmzevoXO0SmG2KGAv+QZ53qQQQgjRGvlViB2Tk5NDSkoKOp2OLl26EBUV1VC5WoXw0DbghgKjPG9SCCGEaI38uli/rKyMG2+8kbi4OM477zyGDRtGfHw8N910E+Xl5Q2dscWKiusEQG6APG9SCCGEaI38KsRmzJjBsmXL+OabbygsLKSwsJCvvvqKZcuWce+99zZ0xhYrvn0vAHKs4HXLUTEhhBCitfGrEPv888956623GDNmDMHBwQQHBzN27FjefPNNPvvss4bO2GK1T6563mSFCY7s36VxGiGEEEI0Nr8KsfLycmJiYmq0R0dHy6nJeoiITsJ8tCu29JT12oYRQgghRKPzqxAbMmQIM2fOpLKy0tdWUVHB448/zpAhQxosXEtX/XmTW7UNI4QQQohG59ddk88//zxjxowhISGBPn36oNPp2Lx5MwEBASxatKihM7ZokQ49h4O85MnzJoUQQohWx69CrFevXuzZs4f333+f3377DaUU11xzDddffz1Wq7WhM7ZoYW4D4KWgMEPrKEIIIYRoZPUuxFwuF127duXbb79l6tSpZyJTqxLuNQMuCivytI4ihBBCiEZW72vETCYTDocDnU53JvK0OmF6GwBF8rxJIYQQotXx62L9adOm8fTTT+N2uxs6T6sTagoGoBB53qQQQgjR2vh1jdiaNWv46aefWLx4Mb169SIwMLDa+Pnz5zdIuNYgzBYJ7KNA79A6ihBCCCEamV+FWGhoKFdeeWVDZ2mVIsPbQDnkmaRnfSGEEKK1qXch5na7GTFiBKNGjSI2NvZMZGpVoqKT4ADkyfMmhRBCiFan3teIGY1GbrvtNhyO0z+Vtnz5ci677DLi4+PR6XR8+eWX1cZPmTIFnU5X7XX22Wef9uc2JbEJ3QDICwCPS665E0IIIfzRXGsKvy7WHzx4MJs2bTrtDy8rK6NPnz68/PLLJ5xm9OjRZGZm+l4LFy487c9tStp27AtAgRUK0w9rnEYIIYRonpprTeHXNWK333479957L4cOHaJ///41Ltbv3bt3nZYzZswYxowZc9JpLBZLvU6BOhyOakfrSkpK6jyvFmLjuwOgdHB432YiOiRqnEgIIYRoOkpKSigu/r2LJ4vFgsViqTHdmagpGoNfR8QmTpxIamoqd911F+eccw5nnXUWffv29f23IS1dupTo6Gi6dOnC1KlTyc7OPun0s2fPJiQkxPdKTk5u0DwNzWS2EXy0bsxK26FtGCGEEKKJSU5OrrZfnz17tt/Lqm9N0Rj8OiKWmpra0DlqNWbMGK666ioSExNJTU3l0Ucf5fzzz2fDhg21VsMADz30EDNmzPANHz58uMkXYxEOKLZAfvY+raMIIYQQTcrOnTtp06aNb/hE+/9T8aemaAx+FWKJiY1z+mzixIm+9z179mTAgAEkJiayYMECJkyYUOs8xx+y/OPhzKYqzKUnFS8FBYe0jiKEEEI0KXa7neDg4NNejj81RWPw69QkwH//+1/OOecc4uPjOXjwIADPP/88X331VYOFO15cXByJiYns2bPnjH2GFsLdVfVwcVmOxkmEEEKI1qGp1BR+FWKvvfYaM2bMYOzYsRQWFuLxVHVGGhoayvPPP9+Q+arJy8sjPT2duLi4M/YZWgj1mgEocuRrnEQIIYRoHZpKTeFXIfbSSy/x5ptv8vDDD2MwGHztAwYMYNu2bXVeTmlpKZs3b2bz5s1A1bVnmzdvJi0tjdLSUu677z5WrVrFgQMHWLp0KZdddhmRkZFcccUV/sRuskL0VgCK3aUaJxFCCCGap+ZaU/h9sX5td0daLBbKysrqvJz169czcuRI3/Cxi+wnT57Ma6+9xrZt23jvvfcoLCwkLi6OkSNH8sknn2C32/2J3WSFGIOAHIqo1DqKEEII0Sw115rCr0IsKSmJzZs317ho/7vvvqvXHYojRoxAqRM/2mfRokX+xGt2QgPCgVQK9S6towghhBDNUnOtKfwqxO6//37uuOMOKisrUUqxdu1aPvroI2bPns1//vOfhs7Y4oXZY8ALhSZ5xJEQQgjRmvhViP3lL3/B7XbzwAMPUF5eznXXXUebNm144YUXuOaaaxo6Y4sXEdEWciDf7NU6ihBCCCEakV+FGMDUqVOZOnUqubm5eL1eoqOja0zz66+/MmDAAE07SmsOouM6QQ7kydckhBBCtCp+9yN2TGRkZK1FGFT1Ynv4sDzI+lTiknoCkGeDisKm3wGtEEIIIRrGaRdiJ3Oyi+bE79p1OAsAlwEy927XNowQQgghGs0ZLcRE3QQGRRNw9IbJjP1btA0jhBBCiEYjhVgToNPriXBUvc/L3K1tGCGEEEI0GinEmohwZ9WmyMs7qHESIYQQQjSWM1qI6XS6M7n4FiXMVbUpCoszNU4ihBBCiMYiF+s3EaFeEwDFlfLgbyGEEKK18LsQc7vd/Pjjj7zxxhuUlJQAkJGRQWnp7w+uLikpoUOHDqefshUIJQCAYpd0XyGEEEK0Fn516Hrw4EFGjx5NWloaDoeDiy66CLvdzpw5c6isrOT1119v6JwtXoghECigyFuudRQhhBBCNBK/jojdfffdDBgwgIKCAqxWq6/9iiuu4KeffmqwcK1JiDkUgCKdU9sgQgghhGg0fh0R++WXX/j1118xm83V2hMTE6UnfT+FBkUAUGB0aZxECCGEEI3FryNiXq8Xj8dTo/3QoUPY7fbTDtUahYe2AaDAJA/+FkIIIVoLvwqxiy66iOeff943rNPpKC0tZebMmYwdO7ahsrUqkdFJAORb5E5TIYQQorXw69Tk3LlzGTlyJMnJyVRWVnLdddexZ88eIiMj+eijjxo6Y6sQ1zYZ9kNeAHjdHvRGg9aRhBBCCHGG+VWIxcfHs3nzZj7++GM2bNiA1+vlpptu4vrrr6928b6ou7ad+8EyKLVAbloq0R06aR1JCCGEEGeYX4XY8uXLGTp0KH/5y1/4y1/+4mt3u90sX76c8847r8ECthZRsZ3Qe8Grh8N7NkghJoQQQrQCfl0jNnLkSPLza/YAX1RUxMiRI087VGukNxgJr6x6n304RdswQgghhGgUfhViSqlanyOZl5dHYGDgaYdqrcIdVd9pbk6qxkmEEEII0RjqdWpywoQJQNVdklOmTMFisfjGeTwetm7dytChQxs2YSsS4dQDHgqLMrSOIoQQQohGUK9CLCQkBKg6Ima326tdmG82mzn77LOZOnVqwyZsRULdBsBDYXmO1lGEEEII0QjqVYjNmzcPgPbt23PffffJacgGFuo1A06KHIVaRxFCCCFEI/DrrsmZM2c2dA4BhOgCgFKKPKVaRxFCCCFEI/CrEEtKSqr1Yv1j9u/f73eg1izEEATkUkSF1lGEEEII0Qj8KsSmT59ebdjlcrFp0ya+//577r///obI1SqFmMOAAxTqnFpHEUIIIUQj8KsQu/vuu2ttf+WVV1i/fv1pBWrNQgOjACg01nyguhBCCCFaHr/6ETuRMWPG8PnnnzfkIluVkJB4APLNXo2TCCGEEKIxNGgh9tlnnxEeHt6Qi2xVwiPaA5BnUdoGEUIIIUQN7777LgsWLPANP/DAA4SGhjJ06FAOHjzo1zL9OjXZt2/fahfrK6U4cuQIOTk5vPrqq34FERCd0A0yoCAAPG4nBqNZ60hCCCGEOGrWrFm89tprAKxatYqXX36Z559/nm+//ZZ77rmH+fPn13uZfhVil19+ebVhvV5PVFQUI0aMoFu3bv4sUgBxSWfBWlA6yMvdT3SsfJdCCCFEU5Genk6nTp0A+PLLL/nTn/7ELbfcwjnnnMOIESP8Wqb0I9aERLRLJLgSigPg0P4tUogJIYQQTUhQUBB5eXm0a9eOxYsXc8899wAQEBBARYV/XU/VuRArLi6u80KDg4P9CtPamW0BRFRUFWKZh37TOo4QQggh/uCiiy7i5ptvpm/fvuzevZtLLrkEgB07dtC+fXu/llnnQiw0NPSknbhC1bViOp0Oj0e6X/BXuENHKorc7FStowghhBDiD1555RUeeeQR0tPT+fzzz4mIiABgw4YNXHvttX4ts86F2JIlS/z6AFE/YU494CGv8LDWUYQQQgjxB6Ghobz88ss12h9//HG/l1nnQmz48OF+f4iou3CXAfBQUJajdRQhhBBC/MH3339PUFAQ5557LlB1hOzNN98kOTmZV155hbCwsHov0+9+xAoLC3n22We5+eabmTp1KnPnzqWoqMjfxYmjQrxVXVYUVhZqG0QIIYQQ1dx///2+a+a3bdvGvffey9ixY9m/fz8zZszwa5l+FWLr16+nY8eOzJ07l/z8fHJzc3nuuefo2LEjGzdu9CuIqBJMAABF7jKNkwghhBDij1JTU0lOTgbg888/59JLL2XWrFm8+uqrfPfdd34t06/uK+655x7GjRvHm2++idFYtQi3283NN9/M9OnTWb58uV9hBNj1QUAuhcq/22CFEEIIcWaYzWbKy8sB+PHHH5k0aRIA4eHh9epd4o/8KsTWr19frQgDMBqNPPDAAwwYMMCvIKJKsDkUgAK9U9sgQgghhKjm3HPPZcaMGZxzzjmsXbuWTz75BIDdu3eTkJDg1zL9OjUZHBxMWlpajfb09HTsdrtfQUSVYGsUAAVG6QJECCGEaEpefvlljEYjn332Ga+99hpt2rQB4LvvvmP06NF+LdOvI2ITJ07kpptu4l//+hdDhw5Fp9Pxyy+/cP/99/vdj4aoEhIcD0C+yatxEiGEEEL8Ubt27fj2229rtM+dO9fvZfpViP3rX/9Cp9MxadIk3G43ACaTidtuu42nnnrK7zACQiPbQzHkWUB5vej0ft/YKoQQQogG5vF4+PLLL9m1axc6nY7u3bszfvx4DAaDX8vzqxAzm8288MILzJ49m3379qGUolOnTthsNr9CiN9FxnWDYnAaoKwsmyB7rNaRhBBCCAHs3buXsWPHcvjwYbp27YpSit27d9O2bVsWLFhAx44d673M0zrcYrPZ6NWrF+3bt2fx4sXs2rXrdBYngND4DliqDjKSV7Bf2zBCCCGE8Lnrrrvo2LEj6enpbNy4kU2bNpGWlkZSUhJ33XWXX8v0qxC7+uqrfV38V1RUMGDAAK6++mp69+7N559/7lcQUSUoPprIqjtjyc6VQkwIIYRoKpYtW8acOXMIDw/3tUVERPDUU0+xbNkyv5bpVyG2fPlyhg0bBsAXX3yBUorCwkJefPFFnnzySb+CiCr2uGgijhZimRm7tQ0jhBBCCB+LxUJJSUmN9tLSUsxms1/L9KsQKyoq8lWD33//PVdeeSU2m41LLrmEPXv2+BVEVLEE2givrHqfnZWqbRghhBBC+Fx66aXccsstrFmzBqUUSilWr17Nrbfeyrhx4/xapl+FWNu2bVm1ahVlZWV8//33XHzxxQAUFBQQEBDgVxDxu3BH1WbJyT+scRIhhBBCHPPiiy/SsWNHhgwZQkBAAAEBAQwdOpROnTrx/PPP+7VMv+6anD59Otdffz1BQUEkJiYyYsQIoOqUZa9evfwKIn4X7jQCTnLLsrWOIoQQQoijQkND+eqrr9i7dy+7du1CKUVycjKdOnXye5l+FWK33347gwYNIj09nYsuugj90b6uOnToINeINYBQjwlwkldZqHUUIYQQolWbMWPGSccvXbrU9/65556r9/L9KsQABgwYwIABA3znSHU6HZdccom/ixN/EKJsQBn57jKtowghhBCt2qZNm+o0nU6n82v5fhdib731FnPnzvVdnN+5c2emT5/OzTff7O8ixVEhumAghzwqtI4ihBBCtGpLliw5o8v3qxB79NFHmTt3LtOmTWPIkCEArFq1invuuYcDBw7I6cnTZDeHA/vI07u1jiKEEEKIM8ivQuy1117jzTffrPaA73HjxtG7d2+mTZsmhdhpsgfGAZBr8micRAghhBBnkl/dV3g8HgYMGFCjvX///r6HgAv/BYclApBnBrerUuM0QgghhDhT/CrEbrjhBl577bUa7f/+97+5/vrrTztUaxcS1Rmdqnqfl79X2zBCCCGEOGPqfGryj7dv6nQ6/vOf/7B48WLOPvtsAFavXk16ejqTJk1q+JStjDU2loidkBsIOfn7iInpqXUkIYQQQpwBdS7Ejr99s3///gDs27cPgKioKKKiotixY0cDxmudrLHRRK2vKsSy8+XB30IIIURLVedC7Ezfvil+Z4uNJroMdkVBTnG61nGEEEIIcYb4dY2YOLPs8dFEHe3L9UhemrZhhBBCCHHG+N2h67p16/jf//5HWloaTqez2rj58+efdrDWLCgyjMjyqveZeYe0DSOEEEKIM8avI2Iff/wx55xzDjt37uSLL77A5XKxc+dOfv75Z0JCQho6Y6uj0+sJdxoAyCnN1TiNEEIIIc4UvwqxWbNmMXfuXL799lvMZjMvvPACu3bt4uqrr6Zdu3YNnbFVCnFbAMitLNI4iRBCCCHOFL8KsX379vke8G2xWCgrK0On03HPPffw73//u0EDtlbBygZArrtc4yRCCCGEOFP8KsTCw8MpKSkBoE2bNmzfvh2AwsJCysulcGgIQbpgAPJwnmJKIYQQQjRXfhViw4YN44cffgDg6quv5u6772bq1Klce+21XHDBBQ0asLUKNEcCkGuQ500KIYQQLZVfd02+/PLLVFZWPQPxoYcewmQy8csvvzBhwgQeffTRBg3YWgXaYgHIMyncrkqMpgCNEwkhhBCiofl9ajI+Pr5qAXo9DzzwAF9//TXPPfccYWFhvumeeuopCgsLGyRoaxMY0k6eNymEEEK0cGe0Q9dZs2aRn59/wvHLly/nsssuIz4+Hp1Ox5dfflltvFKKxx57jPj4eKxWKyNGjGg1j1AyRkQTcfRyu5z8fdqGEUIIIZq45lpTnNFCTCl10vFlZWX06dOHl19+udbxc+bM4bnnnuPll19m3bp1xMbGctFFF/luFGjJjNGRRB0txOR5k0IIIcTJNdeawu+e9RvCmDFjGDNmTK3jlFI8//zzPPzww0yYMAGAd999l5iYGD788EP++te/NmbURmeOjiRqlzxvUgghhKiL5lpTNNlnTaampnLkyBEuvvhiX5vFYmH48OGsXLnyhPM5HA6Ki4t9L60rXX8FRFc9+BsgpyRT2zBCCCGERkpKSqrt1x0OR72X4W9N0RiabCF25MgRAGJiYqq1x8TE+MbVZvbs2YSEhPheycnJZzTnmRIYH/37qcnSE6+vEEII0ZIlJydX26/Pnj273svwt6ZoDJqemqwLnU5XbVgpVaPtjx566CFmzJjhGz58+HCzLMbs8dFEHT0illWao20YIYQQQiM7d+6kTZs2vmGLxeL3supbUzSGM1qIDRs2DKvV6te8sbFV/WgdOXKEuLg4X3t2dnaNivaPLBZLtY1UXFzs1+drLSgyjMijR8QyS/O0DSOEEEJoxG63ExwcfFrL8LemaAx+F2Jer5e9e/eSnZ2N1+utNu68884DYOHChX4HS0pKIjY2lh9++IG+ffsC4HQ6WbZsGU8//bTfy20udHo98eUWwME+R4HWcYQQQohmqynXFH4VYqtXr+a6667j4MGDNbqo0Ol0eDx1eyxPaWkpe/f+3llpamoqmzdvJjw8nHbt2jF9+nRmzZpF586d6dy5M7NmzcJms3Hdddf5E7vZiasMAbLZp3PgcTsxGM1aRxJCCCGapOZaU/hViN16660MGDCABQsWEBcX5/f51fXr1zNy5Ejf8LFruyZPnsw777zDAw88QEVFBbfffjsFBQUMHjyYxYsXY7fb/fq85iZERWFxZ+MwQtqhNSS1H6Z1JCGEEKJJaq41hU6dqtfVWgQGBrJlyxY6dep0JjI1qEOHDtG2bVvS09NJSEjQOk69bD5rGDec8ws7ouG7EbMYPfwhrSMJIYQQjaI577/rw6/uKwYPHlzt8J84M1whoXTNrXqfcmSjtmGEEEII0eD8OjU5bdo07r33Xo4cOUKvXr0wmUzVxvfu3btBwrV2nrBwuhy9YXJ33h5twwghhBCiwflViF155ZUA3Hjjjb42nU7n64+jrhfri5NTYeF0PVj1PqXksLZhhBBCCNHg/CrEUlNTGzqHqIU+Ivz3U5OOQk2zCCGEEKLh+VWIJSYmNnQOUQtT2za0P3pq8pByU1aaTWBQtLahhBBCCNFgTqtn/Z07d5KWlobT6azWPm7cuNMKJaoEdUgkvAIiKiDPCntSl3JWr6u1jiWEEEKIBuJXIbZ//36uuOIKtm3b5rs2DH5/hpNcI9YwQjq2A6BrLqxsCymHVkshJoQQQrQgfnVfcffdd5OUlERWVhY2m40dO3awfPlyBgwYwNKlSxs4YusV3qEdXnS/XyeWtU3bQEIIIYRoUH4dEVu1ahU///wzUVFR6PV69Ho95557LrNnz+auu+5i06ZNDZ2zVTIFWMgNCqNrbj4AKYVyk4QQQgjRkvh1RMzj8RAUFARAZGQkGRkZQNVF/CkpKQ2XTlAYGknXY32JlWdrG0YIIYQQDcqvI2I9e/Zk69atdOjQgcGDBzNnzhzMZjP//ve/6dChQ0NnbNVKI2Poemg3ALtcpbic5ZjMNo1TCSGEEKIh+HVE7JFHHsHr9QLw5JNPcvDgQYYNG8bChQt58cUXGzRga+eIjqVLHoS5oAzF+m0faR1JCCGEEA3EryNio0aN8r3v0KEDO3fuJD8/n7CwMN+dk6JheOPjMSg4J8/Kt7EV/Lzjfwzpf5PWsYQQQgjRAPw6InbM3r17WbRoERUVFYSHhzdUJvEHhjbxAJx9OBCAnzLWaxlHCCGEEA3Ir0IsLy+PCy64gC5dujB27FgyMzMBuPnmm7n33nsbNGBrF9C+qi+xoXurHqy+0pFHRXm+lpGEEEII0UD8KsTuueceTCYTaWlp2Gy/Xzg+ceJEvv/++wYLJyAoqaoQ63OwjHidEQewctM8bUMJIYQQokH4VYgtXryYp59+moSEhGrtnTt35uDBgw0STFQJ75xU9d/yYs63Vz3j86ffvtQwkRBCCCEail+FWFlZWbUjYcfk5uZisVhOO5T4XUhCDA5D1WnJs4P6A/BT1hYtIwkhhBCigfhViJ133nm89957vmGdTofX6+WZZ55h5MiRDRZOgE6vJy8kEoBexrMBWO8qobBAjjwKIYQQzZ1f3Vc888wzjBgxgvXr1+N0OnnggQfYsWMH+fn5/Prrrw2dsdUrCosiPj+TwLxAuugt7PY6WLzmRa4e/azW0YQQQghxGvw6IpacnMyWLVsYNGgQF110EWVlZUyYMIFNmzbRsWPHhs7Y6pVHxgDgSj/E5bH9AJi/a76WkYQQQgjRAPw6IgYQFhbGJZdcwsCBA3297K9btw6AcePGNUw6AYArJrbqzeHDTJh8C3MyVrGg+CCVFYUEWEM1zSaEEEII//lViH3//fdMmjSJvLw8lFLVxul0OjweT4OEE0e1aQOA8Ugm/frcQMK3Uzmk3Pyw6nkuO/8xTaMJIYQQwn9+nZq88847ueqqq8jIyMDr9VZ7SRHW8Ixtqwoxa04WeoORK6J6AzB/+8daxhJCCCHEafKrEMvOzmbGjBnExMQ0dB5RC+vR3vWDC3IAuLLvFAC+LtiDy1muVSwhhBBCnCa/CrE//elPLF26tIGjiBMJPdqpa1RBFm6Hk3MH/JUo9OTjZdnaVzVOJ4QQQgh/+XWN2Msvv8xVV13FihUr6NWrFyaTqdr4u+66q0HCiSpxZyVTarYR5Cxn/y/r6XDBUK6ITObfudv5YON/uPDc+7SOKIQQQgg/+FWIffjhhyxatAir1crSpUvR6XS+cTqdTgqxBqY3GjiY1J0eKRvI/XkFHS4YyuRBd/HvhbfwacFuXizOwB4cr3VMIYQQQtSTX6cmH3nkEZ544gmKioo4cOAAqampvtf+/fsbOqMAinv3BUCtWw/AkP430VVvoRzFJz89omU0IYQQQvjJr0LM6XQyceJE9Hq/Zhd+sJw9GIDInVXPmdTp9dzUYRQAb/8mnbsKIYQQzZFfldTkyZP55JNPGjqLOIn4i4cDkJixj8riUgD+fMGTGIBVziJ2pSzUMJ0QQggh/OHXNWIej4c5c+awaNEievfuXeNi/eeee65BwonfxSR3JDcojMjSAvb++AvdJowmNrYXlwa24auyw7y17An+1XWs1jGFEEIIUQ9+HRHbtm0bffv2Ra/Xs337djZt2uR7bd68uYEjCqg6FXmoU08ACpet9LXf1O9mAOZlrqO8LFeTbEIIIYTwj19HxJYsWdLQOUQdVJzVHzavwLhhva9t7Hn/R9Ivs0hVLj5c/AA3X/G2hgmFEEIIUR9ytX0zEnju2QDEpGzztRmMZu7sfCkAL+z4GHX0AexCCCGEaPqkEGtGEkdVXbDfNvcQRYezfe03jp6LDR3bPRUsXfOiVvGEEEIIUU9SiDUjIQmxpEcmALD/8wW+9tCwRCZH9QLgxZXPapJNCCGEEPUnhVgzc3jICABcX35drX3aBbMB+KrkELv3/tDYsYQQQgjhBynEmpmgP10BQMe1S/G6Pb727l3HcllgPEoHT38nj5gSQgghmgMpxJqZLn8aS4nFRkRZIbu//anauP8b+Q8A3sv/jbS01VrEE0IIIUQ9SCHWzJhtAew+6xwACj6p/mijs/vfyEhLBG7g2YV3apBOCCGEEPUhhVgzpC67DIDYZTWvBfu/cx8E4M2sDWRkbGrUXEIIIYSoHynEmqHOk6/CrdOTlLmfjM27qo27YOgMzjYFUwH86d2ROCqLtQkphBBCiFOSQqwZCkmIZXen3gCkzfuo2jidXs97E+cTgo5VziLueuscLSIKIYQQog6kEGumii8ZD0DEF5/WGNe54wV8NOIf6BT8O3c77319W2PHE0IIIUQdSCHWTHW562ZcegOd01M4sGxtjfFjhj/M40kXAfDg5jcpK82uMY0QQgghtCWFWDMVnpTA9rPOBSDz5X/XOs0DEz8jSWciU3l47vMbGjOeEEIIIepACrFmTE2aBEDHRV/icblrjLcEBDNrwB0AzDnwI1lZ2xs1nxBCCCFOTgqxZqzHzddQaLUTXZLHzv/Or3Waq0c9wwCTnVIUMz+7tpETCiGEEOJkpBBrxiyBNlJGXgKA8z9v1zqN3mDkX+f/E4A3crezbPVLjZZPCCGEECcnhVgzFzHtVgB6rfmJ3H1ptU4z/OxpTI3oAcCNP9xHacmRRssnhBBCiBOTQqyZ6zR6OCntkzF73eyZ9fwJp/vXn7+nnc7Efq+TB/87pvECCiGEEOKEpBBrAUpu+isAHT5/H7fDWes0wSEJvHX+LABeydnMklXPN1Y8IYQQQpyAFGItQK97biY/MISYohy2vfbfE0534bn3cWtkLwBu/OEBSoozGiuiEEIIIWohhVgLYAm0kXLZNQCYX3/tpNPO+fP3tNeZOKBcPPDf0Y0RTwghhBAnIIVYC5H08L24dXp6pGxg7/fLTjidPTiety+aA8DrudtYuurFxooohBBCiONIIdZCxPbszOahowAonvnkSacdOWS67xTlXT89hNtVecbzCSGEEKImKcRakIh/PArAWWt/In31ppNO+89rviAcPds85bzx5Y2NEU8IIYQQx5FCrAVJGjmEzX3ORY8i85GTHxULj+jIkz2qetp/dOcn5ObsboyIQgghhPgDKcRamIC/PwzAWUu+5sj2PSed9pbL36aPMZACvNz/0bjGiCeEEEKIP5BCrIXpNmE0O7r0w+x1c+i2e046rcFo5pWLn0Wn4J2CFL75+bHGCSmEEEIIQAqxFsk89zm86BjwywJ++3LxSac9Z+Bfua/NEABuXvEkOTm/NUZEIYQQQiCFWIvUeexw1o+oOtWonz4dr9tz0umfuGEhPQ1WsvFwy3sXobzexogphBBCtHpSiLVQHd58njKzlS4Hd7Hhny+ddNoAayjvjZ+HCfiy9BDPfjyhcUIKIYQQrZwUYi1UZKf2bJ1yJwDtn/0HZXmFJ52+b6+JvNjjBgD+tucreRalEEII0QikEGvB+j33GIfD44gqyWfrnQ+ecvq/TniXyWFd8AITF9/Lnn0/nfmQQgghRCsmhVgLZgm0kT3znwD0+9/bZGzaedLpdXo9r928in7GIHLwcuEHY0g/tLYxogohhBCtkhRiLdxZd05me7f+WDwusqbeccrprbZwFt68ii56C2nKxYXzzpPOXoUQQogzRAqxFk6n1xP46ku4dXr6bljK1v98fMp5YmJ68sPkpbTVGdntdXD9vGF4Pe5GSCuEEEK0LlKItQJJI4ewflzVhfjhD95LZUnZKedp1+5sFl71GVZgcUU2s96/9AynFEIIIVofKcRaiR7/fo4cezgJeRlsuvP/6jRPz+7jea3vXwGYeWARP/367JmMKIQQQrQ6Tb4Qe+yxx9DpdNVesbGxWsdqduzREaQdfRB4vw9eI3XJqjrNN3nc69wY3g0vcMWP97N+8/tnMKUQQgjhn+ZaLzT5QgygR48eZGZm+l7btm3TOlKz1O++v7Kl91AsHhdcdz2VxaV1mu/lm35lhCWcEhSjv5rM9l1fneGkQgghRP01x3qhWRRiRqOR2NhY3ysqKkrrSM2STq8n4cuPyQ0KI+lIKluuvaVO81lt4Xx9+zYGmezk4aXfp5dz7dwOrNn4zpkNLIQQQtRDc6wXmkUhtmfPHuLj40lKSuKaa65h//79J5zW4XBQXFzse5WUlDRi0qYvIqktGXNfBWDwwo/Y/Np/6zSfPTie7/66ifMDInABHxenMuTrv/Ddsn+ewbRCCCFau5KSkmr7dYfDccJp61MvNBVNvhAbPHgw7733HosWLeLNN9/kyJEjDB06lLy8vFqnnz17NiEhIb5XcnJyIydu+nrffA2rx08CIPG+aeTuTq3TfOERHfnpb7lsnPAx4wLboHRww9K/k5a2+kzGFUII0YolJydX26/Pnj271unqWy80FTqllNI6RH2UlZXRsWNHHnjgAWbMmFFjvMPhqFYtHz58mOTkZNLT00lISGjMqE2ao6ycQ1360DFjL9uSB9Fjy0r0RkPd568s5tznEljvKmGQyc7yGYewBASfwcRCCCFak0OHDtG2bVt27txJmzZtfO0WiwWLxXLK+U9VLzQVTf6I2PECAwPp1asXe/bsqXW8xWIhODjY97Lb7Y2csHmwBNowfvIRFUYLvXauZW0du7TwzR8QzKfXLSAUHWtdJQx+Np51m987Q2mFEEK0Vna7vdp+vS5FGJy6Xmgqml0h5nA42LVrF3FxcVpHafYSzx3AtvsfB2DAv//Fzk8W1Gv+pPbD+N8FcwhHzxZ3GWd/NZl73hhIacmRMxFXCCGEqLPmUi80+ULsvvvuY9myZaSmprJmzRr+9Kc/UVxczOTJk7WO1iIMfPJ+1p8zBqPyEjV1Ern70uo1/4Xn3seu27ZxfUhHvMDzR9bTc247PvluBhXl+WcmtBBCCHGc5lovNPlC7NChQ1x77bV07dqVCRMmYDabWb16NYmJiVpHaxF0ej3dv/qQAzHtiSrJJ2fUZZQXFNVrGdHRybw/fS/fjZhFos7EQeXimrVziXomkuuf78TuvT+cofRCCCFEleZaLzS7i/Xr69jFfnKx/skd/GU94RcOx+4oZ0fX/nRYvQRraP2vrysrzeapT6/mv4dWclC5ADACd8YO4O9Xf0pYWFIDJxdCCNEStZb9d5M/IiYaR+K5Azj84XzKzFZ6pGxg39Dz6/Rw8OMFBkXzjxuXkvpIJasvm8cltjjcVJ2y7PRiJ1769BpczvKGXwEhhBCiGZJCTPh0mzCK9A8+p9wUQM9d69k14lLcDqdfy9Lp9QzuN4Vv789g0flP0cNgJR8vd+36hITZwUx7rR8r172J8nobeC2EEEKI5kNOTYoatr//JV2mXIXZ42btyMsZ+OPn6PSnV7O7XZW8+dXNPLbjY7Lx+NoTdSb+FNuPvm0G0qPdMHp0vRST2Xa6qyCEEKKZay37bynERK02vTiP3tNvxqC8rDvvUvp89z/MtoDTXq7LWc6Pq+by4eZ3+LJwH6VU//lZgUGWcIZGJTM06ULO6TtJrisTQohWqLXsv6UQEye07vHn6fv4vRiVl23dB5K4ZCHBMZENtvzyslwW/PI0P+9dxI6SQ2xzFFJ4XGFmBq4M6cDkfjcTH9mNQGs4bdsMlKNmQgjRwrWW/bcUYuKktrz5EZ3vuBGbq5K0qLZ4//cZ7YcPOiOf5fW42b3vB37d+Rkr01fyS2Equ701H+5qBpKNgXS0RhAdEErXiC5MuniOHDkTQogWpLXsv6UQE6e09/tl2K+5ipiiHMpNFnY8PJsBj9592teN1cWGLR/w+opZ/JS/hzLlpRgPlbVMF4iOG6P7Mn30c3RIGn7GcwkhhDizWsv+WwoxUSf5qYc4fMkEeu1aB8DWHoOJePct2vTv0ag5vB43B9NXsXXfYtLz9pJVmslXGevY5qnqEkMPXB7UlpFtzyE2pC09k0bSrcuYRs0ohBDi9LWW/bcUYqLOPC436277G33feQmLx0WF0cLmG+9iwAv/wBRQt4ewngnK6+Wnlc/x7Mp/8X1FVo3xXfUWRkf1pF1IOxLCkji39w3Ex/fVIKkQQoi6ai37bynERL2lr95E0V+m0vO3DQDsj+9Ixb+eo8e14zROBjt++5p3ls/mQGkGhx1FrHcW4aplut5GGyMiunN2u3Pp22kU7dsOIcAa2thxhRBCnEBr2X9LISb8orxe1v/jRTrNmUlYeTEAm/qPIPqNlxv9dOXJFBWlsfDX51iXvpLM8lz2lOew0VWK0tWctoPezMT4QUwa9n907TSqUa6BE0IIUbvWsv+WQkycloKDGey+9R4GLPoMg/JSaTSzaco0+r/wZIP0O3Ym5Obs5sd1r7EqbQWr83ez01Vaoz8zExCrM9IjIIJzY89iWJfLGNTnejlqJoQQjaS17L+lEBMN4sCytZTeervvdOWhiDYcnnILvR6+G1tYiMbpTk55veTl7WXJxjd5d+sHfF+e+Ye+/39nBs62hDG52wSuuegpbIEN16eaEEKI6lrL/lsKMdFglNfL+n++RKenZhJWXgRAcUAQOy6dSNLMvxHbs7PGCevGUVlMVvZOMnJ2sm7fYlYcWs2K0kMcUb+XZ6HomNZ2OPdd+V+CQ+R3JYQQDa217L+lEBMNrjS3gB2zXqTNe2+SkHcYALdOz/beQ/FOmkyPv16HJbB59YyvvF72pS5h/urneWP/YvZ7qx6GHoGeW9uey4Xdr+SsbuNReDEZrQTZYzVOLIQQzVtr2X9LISbOGI/LzbZ/f4TppRfokbLB115otZMyfCz2KX+m02UXNNlryU7E63HzxU8P8/CaF0ipped/gF4GGxdF9+SaQXcw8KxJjZxQCCGav9ay/5ZCTDSKg79uIOPFN+j4/RdEF+f62iuMFvZ17kXp8AuImXgF7c8b2GzuVnS7Kvlk8f0s2LOQn4sOklXrlWUw2BTMtD6TuOrC2ZgtQY2cUgghmqfWsv+WQkw0Ko/Lzc4PvsDxn3l03LTSdy3ZMVkhURwcMAz9iOFEjRhKwuCzMJiMGqWtO+X14nAUYzCYKSxKY8mGN/n6t6/4X9E+nEenicHApPhB9IrtS7e2g+nX8xoMRrOmuYUQoqlqLftvKcSEZpTXS9ovG8ic/y22n36gy28bCHA7q01TYAtmz5ALsVx1JdFD+hHdvVOzKMyOycrazpvf38drB38iQ7mrjYvXGZkY05dKj4N1hakEG8z8pcc1XHn+E1ht4RolFkKIpqG17L+lEBNNRmVxKbs//ZbybxYSun0z7dJ3Y3NVvwbLaTCyv103CgYNJejiC+gw/mICI0K1CVwPLmc5X/z8KD/uXcSe0kw2OwoopPY/vUB09DLZ6WiLIstRRJqzhO7WSKb2v4XRwx6Uo2hCiFahtey/pRATTZbb4eS3TxdQ9v5HxG9aTUxeJmZv9aNKLr2B/e26UtjjLPQDB2Lv1Z3IPt2JSEpo0teaOSqL+e6Xp/l653zCAoIZ1PYc9mTv5M2DP5OmansoUxWdAp0OQtDz55i+3Hb+PziSt4cVu7/FZgrk7M6j6dfjKjmiJoRo9lrL/lsKMdFseFxujmzZxeFvfkC3bCltt6whtjC71mmzQqJI7zkAz9lDCDl7AAkjziYoMqyRE9efx+3kt73fs+PAMvbn/EZscALx4R34fufnvHtkA/l4T7kMI9DHGMSA0PbEBcYQGRhNZFAsEfZ4nO5KsorSKKrIx6u8uL0uiiqLKHWVc0774Uy44J8YTc3rLlYhRMvUWvbfUoiJZi1j004yvv8Z96o12H/bQUT2IaKLctHXctrvcHgc2UldqezRi4D+fQntnUxE944ExzSPHvJdznJy8/YAsHXPQp5f/QLfV2QRqzMwMjiRSo+TVWWZ1Tqera8knYlx0b0x6U3odToMegMG3dGX3kBccALd2gyifXx/wkITsdkim/SRRyFE89Va9t9SiIkWp6KwhH1f/0Dpop+wbt9M3IHd1brMOF6BLZiMNh0p7dwNevXE3rcPttgoLGHBRHXtgNHSdK/JKi/LxWoN9xVDyusl/dBaVu/8H1sOryO3soA8RzG5zlLy3BUYdXpiTUGEmQMx6PQYdHqCTVVdanyUvZncOhxx+6NAdPQxB9M3JIkgsw0dOnQ6HTp06HV6DDoDVpOVpMiudIofQFhwAoG2CAJtkVit4egNzefGCyFE42ot+28pxESrUHAwg8PL11C6dgOGbVsJ25dCZF4moRUlJ52v0Gpnz6AR6MaMIWLQWcQN6E2APbCRUjeuivJ8Plr8AHtyf8OjvHiUB4/X43vv8rpJK8/lt8oCDivXCXpNq59gdLQ1BNDWHEy7wCjaBrXBZrah01UVclUFnQG9To/JYKZr/AD6dL8MmzWSsrIcAgJC5EHsQrRQrWX/LYWYaNXKC4rIWLuFgtUb8WzbhnX3LqIOH8BaWUagoxyzp+bNAaltu5DfdxDGAf0JP7s/bc4+q9k9sul0Ka+X0tIjHMrczMa937E9cxMOjxOFwqsUSim8Rwu4Mncl+8tz2OcqoUh5qGjAHAagh9FG76B4oq3hhAdUXQfo9roJMtuJCopFrzeQVXyYospCggNCCLWGE2qLJDQwmqQ2/emQOBydXk9BQSppGRvo2uFCKe6EaAJay/5bCjEhTsDtcJLy2XeUfPIZods3E5+RSrCjrMZ0Lr2Bw1FtyUvqgjO5BwFn9SZ66EDi+nRDbzRokLxp83rclJfnUl6RT17BAdKzt5Get5v0ggMcKs3E4XVVFXNUFXPH3pd5HOyoyD/pXaX+CEdPqN7oe36oGRhkDqWtNRy7yYYOqPA4qXA7qPS6cHrdBBkDCDFVFd8Oj4sQcxC9Y3rTo+1QYiI6ExHankpHMSVl2VjMgUSEdcBgMFNQdJCy8nws5kCsAaFEhHeS7kiEOIHWsv+WQkyIOlJeL5lbfiNjwY94fv2V4D2/0ebQvlqLM4Ays5VD8UkUdeiKt2dPggb0Jf7cgYQnye/wdBQVpeFxuwgMjCI79zc2/PYVKUe2kFeRT4Gj6OjpTB2lrgpynCW4lYdYSygh5kBKXRUUusoodFeQ765kj6eCP3YhHIyO4hP073YmGIF2ejPhBgtmnR6LzohZbyDQYKFLSDuSY/pgNJgocxSTW5pFRukR8hxFuI5249IppC3JMX1weZxkFKXhcDsINAcSaLZjMwdiMlg4mL+PvUWpFLvKcSkPoaZAzmt7Lmd3G0dYcAIer4sfNvyH71N/wmowM7zdMJKie5Ceu5v88hySIrvRrd25dGx/Xqt+RFd5WS55BftJiB/QYm9Q8XrcKOWt0z8Oykqzyczahs0ajj0ohsDA6Aa/5rO17L+lEBPiNCivl6yd+8j6dR3lGzdj2rmTsP0ptM06UOO05jF5gaEcSehIaaeu0KsXIf37EHfOAELioho5vXA6Stm660uKyrLo2+1ywsKS2Ju6hFU7PiOvPJuSymIArCYbASYrVpMNo95EqaOYosoCdOiwGAPILstiS8E+dlcWkKPclKLQA3Z0VKI41i2xgaobHFyoBj1F2xgMQEe9hQhjAG7lxYCOEGMA9qPDTq+bPFc52e4KAvQGulkjSbBFU+wqpcRVQYQlmBhbJKWuMtLLsqnwOAk2WgkxBxJitmMz2cgpz+NwRS5Wg5nEoDhigmIxGyx4lZcjpRlklGZzuDKfDGcJAXojnW1RtA2Mwag3YtKbCLdFEGWPJzI4nsiQRAqKM9h+aBWZJRkEW4IJNAdR4iimoLIQi8FMuDWC8MAoIoJisVqCKCjNIq80i7yyXPIr88lzFJHnKGG/o4AUTyVeoLshgOvaDqdtWHs8XjeHCg+yq2Af5R4nyaHt6RzZjeLKQnLLc4gJiiO5zUDstkjyizPILz1Cflk2Zc4S2oV3olN8Pw5mbWf1weWkl2VR7nGgQ0eP0CSSY/pQ6igis/gwQZYg2kd0IdASQnbxIfLKsqlwlVPhrqDS7aDS4yDMEkLXqB60j+6JPTCSispiFmz9Lz9mbUaHjgiTjQiznciAUAJNNirclTg9LgKMFkx6I1vy9/JL+RFKUbTRmWhnCqSdNYI4WyR5lYUcrsin1OvE6fWQ5ank0HFPChkf2IYv7zvUoL+51rL/lkJMiDPAVekgY+1WctdswLl5KwG/7ST6wG7a5GeecJ5Ssw2HyUyZzU5uUlccyT0xtInDGBWJJToSW2wU9nZtmnxntaKqwDOZbOj0epTXS0VFPm53JXZ7vG/bedxOMo5s5kDGeorLcnG6K3G6K3G4KiiqLGBX7i5+Kz4MQKDRTLjZTpvAaCJtUZgNFtxeFyl5u9lVchir3kRcQBhWo4UydwXlbgdlHgcOr5sEazidQ5OIsEVhMpo5mL+fZdlb2OoopByFExhgsjOuzdm4PC6WZW8h211BW5OdcHMg+yvy+M1VSkkjHilsqnQKlE7rFE2H7eg/NLzA9SEdeX/63gZdfmvZf0shJkQjKi8o4vDKjRSs3YR32zZse1KISd9LTFFOnZdRaTSTExpNWXAYFaHhuMIi8ERGok9IIKBrJwLbtUFvNGIKCiTurO5NuvsNoT2vx33KU0rK6yXzyBZ2pf5MSUU+Rr0Zt9dJUXkeJZVFmAwmTAYz4UExRIe0p8xRwM7D6zhSkkloQChBlmDyynLIKs8h0GSjbUg7As1BFFcWUlxZRJGzmFJXOZEBYcQHJ1DhKudgURq5lYW4jvaLFxsQTnxQLG1CE4kP70BZZRG7s7ZypDQLj/Li9DjJd5aQ6ywh111BjseBTWegpzWKdoExlLrKKXVXEGyyEWoJxulxke8oIt9VSr6rgnKvmzCjhXBTIBFmOxEBoUTYIgi3RdEmvCNndbkUmy2M+Uuf5Ju931HhcaHX6YiyBJMc0YVAs53t2dtJLcsizBRIuCWYjIo8dpTnUKk8RBgshBsDCDcFYjVYSC3PYa+rhBhDAENCO9A9shuBFjuVrgq2ZW8jpSSDEKOVWGsYZe5KUstzqfC6iTFX5bMZA7AaLAQYLVgMFrLLc/mt5DCHXWWUKjceBSOC23Jpp7EE28LJK8kktyyLvPI8ylwV2ExWzAYTlW4HFe5KOoZ1YHjylcRGdSM9cwtpOTtIy99HZmkmEQHhtAlNJMQWgdloJcweR9f2IwiP6Oj7h4bH48QeHN+gv83Wsv+WQkyIJqAoM4fig4dwlVVQln6YsrUbMezcgamwgICSIqylRdjLiggtK661s9oTqTBaSEvoiCMoGKXT4QoOxZXQFn27dgR0TCKkWycie3RuFk8dEEK0Lq1l/y29KQrRBITERVW/RmzKVbVO5yyvJGfXPgp378ORkYUrKwtvVg763GzMmRmEHjlEYGkReuXF5ijH5nLQ9cDOU35+cUAQOeGxlETH4Yhvg2qXiLFdAqbICAKiI4kf0g97dERDra4QQoijpBATohkx2wJo078Hbfr3OOW0XreHtHVbyPl1Pd6ycnC78eTmoktLw5JxCHt2JpH5RwipLCW4spTgjL2QsRc21768QxHxlIZE4NXrcVltOCJj8MTEoI+Lw9QmHmNoMMZAGyZ7EGZ7EJawEAJjIgiKDJNr2oQQ4gSkEBOihdIbDbQb0o92Q/qddLrS3AJyd+yhaPc+Kvel4j1wENOhdKy52VjKSgguzie6OJeEvAzIy6h3DqfByOGothS064grMgpvcAgEVD1YXGcNwJSUSGDH9lijI7FFhRMYHYE1xC7FmxCiVZBCTIhWLigyjKDhg2D4oBNOU3Awg8PLVuMqLMLrdOEpLMSTeQT9kUxM2VlYC/IwV1ZgdlZWvVwOAivLMXvdmD1uko6kknQktc6Z3Do9pQGBlAcEUmGzUxloxxlkx20PxhMcggoJQRccjD40BENoCKawUMzhYVjCgnGVVeAqKsHWJpb4gb1a3VMPhBDNixRiQohTCkuMJ2zShHrNo7xeKkvLyd+XRs7azVRs24HKy0dfXASuqt7xDWWlBGZlEJKfTWBFKUGOcgzKi1F5Ca0oqXoWaMERv3O7dXoyQ6IoCwrBYQ3E6HZidDpxWG04gsNwxLdB170bAZ07YgwKxGizYrTZMAVZMQXaMAXaMAfZMFsDMNus8qQEIUSDk0JMCHFG6PR6AoKDiO+bTHzf5DrNo7xeygqKKc/Npzwnn4rcfJy5+bjyC3AXFKEKClAFBeiLizGUFGMsK8VUVkpAeSkBFaVYHeU4TRacJgthxXnYHeXEFWZBYVbtH7gR+Lbu6+TW6XEaTbgMJlxGE26jCZfRTHlQMCVtEnHFxYNeDzodWK3ogoLQ2+3o7UEYg4Mxhtgxh9ixhARjCg6iMq+AiiM5BESFk3BOfzl6J0QrJIWYEKLJ0On1BEaEEhgRCl07nNaylNdLdkoq+Sn7cGTl4i4qQm+1YrAG4CooxJ2Vg9q/H+u+3QTl5WB0OTC5nJhdTszuqleA21ltmUblxehygMtR/cNygTrcnXoyLr2B9PA4yu0hOALtqKMFndLpUXo9XrMFT2AQXrsdFRyMLjAQnE5URQW6ykp0lRWoACskJGCMjUFvsaAzGtCZjOhNpqr3RhOWsBDCunWUjoGFaCKkEBNCtEg6vZ7o7h2J7t7R72UorxdnRSWuCkfVtWflFbgrHVX/La/E43DgqaikIj0D5+49kHn0yQleL/rKSvTlZRgqyjFVlGGuKMdcWYHFUUGAswKrs5Iyi43SwGDCivMJriylbe4hyG3Yx8ScyLGje26DieLAEEpCIzA5KojIz8LicpIXEkm5PYSAshICy0soCo6gsG0S7rAwdO6qTla9AQEomw0CrOhsVjAaq44IOp2o0lJwOMBgALMFU+eOhPTtRWCbWMxBVor2p5O3fBXeI1nYLxhOlytGYQqwNMq6C9GUSIeuQgihMeX1krVjL/k7UnDk5OHOL0R5vei8XpTXg/IqVEUFqqQEiovRl5agLytDmS0oiwUVEIAKCEBXVoY5MwNLYT46rwe95+jLe/Tl8RBYXkxESUG9OgZuDOUmC5XmAAweDw6ThfJAO44AG16DEa/egDIaqv5rMFS1WQLwBNlRZhP60lKMZaUYy8swVVZQGRJGZbv2kJCAPiICY0gwyuNGOV14nS5wu9FZzBjsdvRmM8rrAZ0OU1golrAQAiJCsYaHUpKRTdH2FLxOJ6F9konr3wtrqN2X2ev2oNPrfEcWldeL8iq5lrCBtJb9txwRE0IIjen0emJ7dSG2V5dG+TxneSVF6RlVR/pKyyg7nEXloQz0tgCCu3TEFBRI8f6DOHPyMEeEY4kMo3T/QSq376o60qU3AAoqKtAdfekrK9B5vaBUVbEUGISyWMDjQV9RQWBaKjGZBwiqLMPsdlFqsZGW1A1HSDhJ29cSXlaE7dgp38pSKMk7vZXcvOK0v6fIWtqcBiPlZitmt9OXt9xkwaM3YHVWoleK9KgEctp3xhMYVHX00OtB5/FgcFRiKSnCUlFGSVQsFYkdULZA8HrQFxdhOZKJ0VFBadceGAf0Rx8UCB4veqsFc1goXpebigNpePILMMbGENAmDnOIHUNAAEarBaPVitFqxmS1YrQFyE0mzYQcERNCCNGolNcL4DuS5HV7SF+zGa/Ljd5kxFVaRmVWLq6iYvB48LpcKLcH5XajXG5wu/GWl6OKisDpRGe3owu2YwgOxhAUiDMjE7V3H8bsLMxFhZgqyqqOohmNeA0GlMGI3u3CVFGOwe3Cqzeg93owV1ZgrSzDVllGoKOCUouN7Kg2eIxG4o6kEVxZquXX5jePTo9Hr8etN+LWG/AYDHj0xqr/Gox49AYcATYqg+x4jWYMLicohSMkFHdIGLjdGByV6B0ODM7KqselhYTjCbaD24PO5UIN6M/gOY80aO7Wsv+WI2JCCCEa1fE3CeiNBhLP6a9Rmtopr5dgvZ7gPwwX5+RTnlOAI78QY6CNgPCqsZX5xXhdTiwhVcNZqzZQtmkryulEZzBUXTtnMKALCMAUFYkxOIiKvftRu/egczhQBgPKbkffNgG9yYx34wbsu3eh93pROh1GlxNLRRlKr6c4PBqXPRhLQT72wlzMLgdGtxujx4XZ7cLocWP2uquti0F5MXi8mD3V2xvSxrJSoGELsdZCCjEhhBDiOMcXizq9nuCYSIJjajlhmVR9sOoGkavPXLhTOP4mE4/LibvShdflwuNw4HW68bhceBwuvC4nnkonrsIiXLl5KLcbvTUApcCTlY23oABMJnRWKzprAHqrzfe4NFVcXFVkms0E9Dr1Y9dE7aQQE0IIIVoQnV6PJdBW1S9dZJjWccQpSCcyQgghhBAakUJMCCGEEEIjUogJIYQQQmhECjEhhBBCCI1IISaEEEIIoREpxIQQQgghNCKFmBBCCCGERqQQE0IIIYTQiBRiQgghhBAakUJMCCGEEEIjUogJIYQQQmhECjEhhBBCCI1IISaEEEIIoRGj1gHONK/XC0BmZqbGSYQQQghRV8f228f24y1Viy/EsrKyABg0aJDGSYQQQghRX1lZWbRr107rGGeMTimltA5xJrndbjZt2kRMTAx6fcOeiS0pKSE5OZmdO3dit9sbdNlNQUtfP5B1bAla+vqBrGNL0NLXDxp+Hb1eL1lZWfTt2xejseUeN2rxhdiZVFxcTEhICEVFRQQHB2sdp8G19PUDWceWoKWvH8g6tgQtff2gdazjmSAX6wshhBBCaEQKMSGEEEIIjUghdhosFgszZ87EYrFoHeWMaOnrB7KOLUFLXz+QdWwJWvr6QetYxzNBrhETQgghhNCIHBETQgghhNCIFGJCCCGEEBqRQkwIIYQQQiNSiAkhhBBCaEQKMSGEEEIIjUgh5qdXX32VpKQkAgIC6N+/PytWrNA6kl9mz57NwIEDsdvtREdHc/nll5OSklJtmilTpqDT6aq9zj77bI0S199jjz1WI39sbKxvvFKKxx57jPj4eKxWKyNGjGDHjh0aJq6/9u3b11hHnU7HHXfcATTPbbh8+XIuu+wy4uPj0el0fPnll9XG12W7ORwOpk2bRmRkJIGBgYwbN45Dhw414lqc2MnWz+Vy8be//Y1evXoRGBhIfHw8kyZNIiMjo9oyRowYUWO7XnPNNY28Jid2qm1Yl99lc92GQK1/kzqdjmeeecY3TVPfhnXZRzT3v0WtSSHmh08++YTp06fz8MMPs2nTJoYNG8aYMWNIS0vTOlq9LVu2jDvuuIPVq1fzww8/4Ha7ufjiiykrK6s23ejRo8nMzPS9Fi5cqFFi//To0aNa/m3btvnGzZkzh+eee46XX36ZdevWERsby0UXXURJSYmGietn3bp11dbvhx9+AOCqq67yTdPctmFZWRl9+vTh5ZdfrnV8Xbbb9OnT+eKLL/j444/55ZdfKC0t5dJLL8Xj8TTWapzQydavvLycjRs38uijj7Jx40bmz5/P7t27GTduXI1pp06dWm27vvHGG40Rv05OtQ3h1L/L5roNgWrrlZmZydtvv41Op+PKK6+sNl1T3oZ12Uc0979FzSlRb4MGDVK33nprtbZu3bqpBx98UKNEDSc7O1sBatmyZb62yZMnq/Hjx2sX6jTNnDlT9enTp9ZxXq9XxcbGqqeeesrXVllZqUJCQtTrr7/eSAkb3t133606duyovF6vUqr5b0NAffHFF77humy3wsJCZTKZ1Mcff+yb5vDhw0qv16vvv/++0bLXxfHrV5u1a9cqQB08eNDXNnz4cHX33Xef2XANpLZ1PNXvsqVtw/Hjx6vzzz+/Wltz2oZK1dxHtLS/RS3IEbF6cjqdbNiwgYsvvrha+8UXX8zKlSs1StVwioqKAAgPD6/WvnTpUqKjo+nSpQtTp04lOztbi3h+27NnD/Hx8SQlJXHNNdewf/9+AFJTUzly5Ei17WmxWBg+fHiz3Z5Op5P333+fG2+8EZ1O52tv7tvwj+qy3TZs2IDL5ao2TXx8PD179myW27aoqAidTkdoaGi19g8++IDIyEh69OjBfffd16yO5MLJf5ctaRtmZWWxYMECbrrpphrjmtM2PH4f0Rr/FhuaUesAzU1ubi4ej4eYmJhq7TExMRw5ckSjVA1DKcWMGTM499xz6dmzp699zJgxXHXVVSQmJpKamsqjjz7K+eefz4YNG5rFoywGDx7Me++9R5cuXcjKyuLJJ59k6NCh7Nixw7fNatueBw8e1CLuafvyyy8pLCxkypQpvrbmvg2PV5ftduTIEcxmM2FhYTWmaW5/q5WVlTz44INcd911BAcH+9qvv/56kpKSiI2NZfv27Tz00ENs2bLFd2q6qTvV77IlbcN3330Xu93OhAkTqrU3p21Y2z6itf0tnglSiPnpj0caoOoHenxbc3PnnXeydetWfvnll2rtEydO9L3v2bMnAwYMIDExkQULFtT4n0pTNGbMGN/7Xr16MWTIEDp27Mi7777ruzC4JW3Pt956izFjxhAfH+9ra+7b8ET82W7Nbdu6XC6uueYavF4vr776arVxU6dO9b3v2bMnnTt3ZsCAAWzcuJF+/fo1dtR68/d32dy2IcDbb7/N9ddfT0BAQLX25rQNT7SPgNbxt3imyKnJeoqMjMRgMNSo4rOzs2v8i6A5mTZtGl9//TVLliwhISHhpNPGxcWRmJjInj17GildwwoMDKRXr17s2bPHd/dkS9meBw8e5Mcff+Tmm28+6XTNfRvWZbvFxsbidDopKCg44TRNncvl4uqrryY1NZUffvih2tGw2vTr1w+TydRst+vxv8uWsA0BVqxYQUpKyin/LqHpbsMT7SNay9/imSSFWD2ZzWb69+9f47DxDz/8wNChQzVK5T+lFHfeeSfz58/n559/Jikp6ZTz5OXlkZ6eTlxcXCMkbHgOh4Ndu3YRFxfnOyXwx+3pdDpZtmxZs9ye8+bNIzo6mksuueSk0zX3bViX7da/f39MJlO1aTIzM9m+fXuz2LbHirA9e/bw448/EhERccp5duzYgcvlarbb9fjfZXPfhse89dZb9O/fnz59+pxy2qa2DU+1j2gNf4tnnEY3CTRrH3/8sTKZTOqtt95SO3fuVNOnT1eBgYHqwIEDWkert9tuu02FhISopUuXqszMTN+rvLxcKaVUSUmJuvfee9XKlStVamqqWrJkiRoyZIhq06aNKi4u1jh93dx7771q6dKlav/+/Wr16tXq0ksvVXa73be9nnrqKRUSEqLmz5+vtm3bpq699loVFxfXbNbvGI/Ho9q1a6f+9re/VWtvrtuwpKREbdq0SW3atEkB6rnnnlObNm3y3TVYl+126623qoSEBPXjjz+qjRs3qvPPP1/16dNHud1urVbL52Tr53K51Lhx41RCQoLavHlztb9Nh8OhlFJq79696vHHH1fr1q1TqampasGCBapbt26qb9++TWL9lDr5Otb1d9lct+ExRUVFymazqddee63G/M1hG55qH6FU8/9b1JoUYn565ZVXVGJiojKbzapfv37VuntoToBaX/PmzVNKKVVeXq4uvvhiFRUVpUwmk2rXrp2aPHmySktL0zZ4PUycOFHFxcUpk8mk4uPj1YQJE9SOHTt8471er5o5c6aKjY1VFotFnXfeeWrbtm0aJvbPokWLFKBSUlKqtTfXbbhkyZJaf5uTJ09WStVtu1VUVKg777xThYeHK6vVqi699NIms94nW7/U1NQT/m0uWbJEKaVUWlqaOu+881R4eLgym82qY8eO6q677lJ5eXnartgfnGwd6/q7bK7b8Jg33nhDWa1WVVhYWGP+5rANT7WPUKr5/y1qTaeUUmfoYJsQQgghhDgJuUZMCCGEEEIjUogJIYQQQmhECjEhhBBCCI1IISaEEEIIoREpxIQQQgghNCKFmBBCCCGERqQQE0IIIYTQiBRiQgghhBAakUJMCCGEEEIjUogJIYQQQmhECjEhhBBCCI38Px9CF3vevfGGAAAAAElFTkSuQmCC\n", "text/plain": [ "<Figure size 640x480 with 2 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "def plot_loss_mae(history, metric):\n", " \n", " fig,ax = plt.subplots()\n", " ax.plot(history.history[metric])\n", " ax.plot(history.history['val_' + metric])\n", " ax.set_ylabel(metric)\n", " ax2=ax.twinx()\n", " ax2.plot(history.history['loss'], c=\"red\")\n", " ax2.plot(history.history['val_loss'], c=\"green\")\n", " ax2.set_ylabel(\"loss\")\n", " plt.title('model accuracy')\n", " #plt.ylabel('accuracy')\n", " plt.xlabel('epoch')\n", " plt.legend(['train ' + metric, 'val ' + metric, 'train loss', 'val loss'], loc='upper left')\n", " plt.show()\n", " \n", "plot_loss_mae(history, \"mean_absolute_error\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. The IMDB movie review sentiment dataset\n", "\n", "Another pre-package toy dataset from Keras. Contains 25k reviews for a movies in IMDB, you want to predict whether the review is positive or negative.\n", "\n", "> each review is encoded as a list of word indexes (integers). For convenience, words are indexed by overall frequency in the dataset, so that for instance the integer \"3\" encodes the 3rd most frequent word in the data. This allows for quick filtering operations such as: \"only consider the top 10,000 most common words, but eliminate the top 20 most common words\".\n", "\n", "https://keras.io/api/datasets/imdb/" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load the dataset, set a couple of important parameters (max_features, maxlen). Also pad all reviews with less than 200 words so that they have all the same length." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "25000 Training sequences\n", "25000 Validation sequences\n" ] } ], "source": [ "import numpy as np\n", "from tensorflow import keras\n", "from tensorflow.keras import layers\n", "\n", "max_features = 20000 # Only consider the top 20k words\n", "maxlen = 200 # Only consider the first 200 words of each movie review\n", "\n", "(x_train, y_train), (x_val, y_val) = keras.datasets.imdb.load_data(\n", " num_words=max_features\n", ")\n", "print(len(x_train), \"Training sequences\")\n", "print(len(x_val), \"Validation sequences\")\n", "x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen, padding=\"post\")\n", "x_val = keras.preprocessing.sequence.pad_sequences(x_val, maxlen=maxlen, padding=\"post\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Since the dataset is pre-processed so that each word is represented by an integer, we have to build a reverse dictionary if we want to actually read some of the reviews:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "# Use the default parameters to keras.datasets.imdb.load_data\n", "start_char = 1\n", "oov_char = 2\n", "index_from = 3\n", "# Retrieve the word index file mapping words to indices\n", "word_index = keras.datasets.imdb.get_word_index()\n", "# Reverse the word index to obtain a dict mapping indices to words\n", "# And add `index_from` to indices to sync with `x_train`\n", "inverted_word_index = dict(\n", " (i + index_from, word) for (word, i) in word_index.items()\n", ")\n", "\n", "inverted_word_index[0] = \"\"\n", "# Update `inverted_word_index` to include `start_char` and `oov_char`\n", "inverted_word_index[start_char] = \"[START]\"\n", "inverted_word_index[oov_char] = \"[OOV]\"\n", "# Decode the first sequence in the dataset\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print([i for i in x_train[2]])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "decoded_sequence = \" \".join(inverted_word_index[i] for i in x_train[2])\n", "print(decoded_sequence)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How do we build a predictor for this task?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "model = Sequential()\n", "..." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }