Skip to content

Instantly share code, notes, and snippets.

@Kr0n0
Created June 10, 2019 03:35
Show Gist options
  • Save Kr0n0/e8a099a7cc6468ac553f0af10aa2b8f9 to your computer and use it in GitHub Desktop.
Save Kr0n0/e8a099a7cc6468ac553f0af10aa2b8f9 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 454
},
"colab_type": "code",
"id": "94z3PxaUrR4P",
"outputId": "cfa27460-bca8-44c3-a52b-9d85151f2d85"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already up-to-date: numpy in /usr/local/lib/python3.6/dist-packages (1.15.4)\n",
"Requirement already up-to-date: matplotlib in /usr/local/lib/python3.6/dist-packages (3.0.2)\n",
"Requirement already up-to-date: sklearn in /usr/local/lib/python3.6/dist-packages (0.0)\n",
"Requirement already up-to-date: tensorflow in /usr/local/lib/python3.6/dist-packages (1.12.0)\n",
"Requirement already satisfied, skipping upgrade: python-dateutil>=2.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib) (2.5.3)\n",
"Requirement already satisfied, skipping upgrade: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib) (2.3.0)\n",
"Requirement already satisfied, skipping upgrade: cycler>=0.10 in /usr/local/lib/python3.6/dist-packages (from matplotlib) (0.10.0)\n",
"Requirement already satisfied, skipping upgrade: kiwisolver>=1.0.1 in /usr/local/lib/python3.6/dist-packages (from matplotlib) (1.0.1)\n",
"Requirement already satisfied, skipping upgrade: scikit-learn in /usr/local/lib/python3.6/dist-packages (from sklearn) (0.19.2)\n",
"Requirement already satisfied, skipping upgrade: astor>=0.6.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (0.7.1)\n",
"Requirement already satisfied, skipping upgrade: tensorboard<1.13.0,>=1.12.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (1.12.0)\n",
"Requirement already satisfied, skipping upgrade: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (1.0.5)\n",
"Requirement already satisfied, skipping upgrade: wheel>=0.26 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (0.32.2)\n",
"Requirement already satisfied, skipping upgrade: protobuf>=3.6.1 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (3.6.1)\n",
"Requirement already satisfied, skipping upgrade: keras-applications>=1.0.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (1.0.6)\n",
"Requirement already satisfied, skipping upgrade: absl-py>=0.1.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (0.6.1)\n",
"Requirement already satisfied, skipping upgrade: termcolor>=1.1.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (1.1.0)\n",
"Requirement already satisfied, skipping upgrade: grpcio>=1.8.6 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (1.15.0)\n",
"Requirement already satisfied, skipping upgrade: six>=1.10.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (1.11.0)\n",
"Requirement already satisfied, skipping upgrade: gast>=0.2.0 in /usr/local/lib/python3.6/dist-packages (from tensorflow) (0.2.0)\n",
"Requirement already satisfied, skipping upgrade: setuptools in /usr/local/lib/python3.6/dist-packages (from kiwisolver>=1.0.1->matplotlib) (40.5.0)\n",
"Requirement already satisfied, skipping upgrade: werkzeug>=0.11.10 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.13.0,>=1.12.0->tensorflow) (0.14.1)\n",
"Requirement already satisfied, skipping upgrade: markdown>=2.6.8 in /usr/local/lib/python3.6/dist-packages (from tensorboard<1.13.0,>=1.12.0->tensorflow) (3.0.1)\n",
"Requirement already satisfied, skipping upgrade: h5py in /usr/local/lib/python3.6/dist-packages (from keras-applications>=1.0.6->tensorflow) (2.8.0)\n"
]
}
],
"source": [
"# Instalación de paquetes en entorno Google Colab \n",
"# NOTA : Si cambiamos entre TPU/GPU/None es necesario ejecutar este paso y relanzar el runtime!!\n",
"\n",
"!pip3 install --upgrade numpy matplotlib sklearn tensorflow"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "DsPh8VdNrq-a"
},
"outputs": [],
"source": [
"# Basic imports\n",
"import sys, cv2, os, glob, pprint\n",
"import numpy as np\n",
"\n",
"# Machine Learning Framework\n",
"import sklearn\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from sklearn.metrics import mean_squared_error\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Deep Learning Framework\n",
"import tensorflow as tf\n",
"from tensorflow.python import keras\n",
"from tensorflow.python.keras.models import Sequential\n",
"from tensorflow.python.keras.layers import Activation, Dense, Dropout, BatchNormalization\n",
"from tensorflow.python.keras.layers import Conv2D, MaxPooling2D, Flatten\n",
"from tensorflow.python.keras import backend as keras_backend\n",
"from tensorflow.python.keras.optimizers import Adadelta, Adam, RMSprop\n",
"from tensorflow.python.keras.preprocessing.image import ImageDataGenerator\n",
"\n",
"# Plotting\n",
"import matplotlib as matplot\n",
"from matplotlib import pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 295
},
"colab_type": "code",
"id": "Vj2-KNWOrwbm",
"outputId": "3b1a1e48-2926-4b04-e574-03b58fb879f4"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python system version : 3.6.6 (default, Sep 12 2018, 18:26:19) \n",
"[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]\n",
"Numpy version : 1.15.4\n",
"\n",
"Machine Learning Framework\n",
"==========================\n",
"Scikit-learn version : 0.19.2\n",
"\n",
"Deep Learning Framework\n",
"=======================\n",
"Tensorflow version : 1.12.0\n",
"Keras version : 2.1.6-tf\n",
"\n",
"Plotting Framework\n",
"==================\n",
"Matplotlib version : 3.0.2\n"
]
}
],
"source": [
"# Version check\n",
"print(\"Python system version : \" + str(sys.version))\n",
"print(\"Numpy version : \" + str(np.__version__))\n",
"print(\"\")\n",
"print(\"Machine Learning Framework\")\n",
"print(\"==========================\")\n",
"print(\"Scikit-learn version : \"+ sklearn.__version__)\n",
"print(\"\")\n",
"print(\"Deep Learning Framework\")\n",
"print(\"=======================\")\n",
"print(\"Tensorflow version : \" + str(tf.VERSION))\n",
"print(\"Keras version : \" + keras.__version__)\n",
"print(\"\")\n",
"print(\"Plotting Framework\")\n",
"print(\"==================\")\n",
"print(\"Matplotlib version : \" + str(matplot.__version__))\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
},
"colab_type": "code",
"id": "OKAZ7pfpsVUj",
"outputId": "0bc404fa-1c57-4936-89ca-d59f0c8263b6"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GPU support enabled.\n",
"Default GPU Device: /device:GPU:0\n"
]
}
],
"source": [
"# TENSORFLOW GPU SUPPORT\n",
"# ======================\n",
"if tf.test.gpu_device_name():\n",
" print(\"GPU support enabled.\")\n",
" print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))\n",
"else:\n",
" print(\"GPU support disabled.\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"colab_type": "code",
"id": "W_jyQmaLTxPT",
"outputId": "c6557709-2f69-42fc-b581-5e1899a2e0f3"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"TPU support disabled.\n"
]
}
],
"source": [
"# TENSORFLOW TPU SUPPORT\n",
"# ======================\n",
"HAS_TPU_SUPPORT=0\n",
"if 'COLAB_TPU_ADDR' not in os.environ:\n",
" print('TPU support disabled.')\n",
"else:\n",
" tpu_address = 'grpc://' + os.environ['COLAB_TPU_ADDR']\n",
" print ('TPU support enabled.')\n",
" HAS_TPU_SUPPORT=1\n",
" print ('TPU address is', tpu_address)\n",
"\n",
" with tf.Session(tpu_address) as session:\n",
" devices = session.list_devices()\n",
" \n",
" print('TPU devices:')\n",
" pprint.pprint(devices)"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "oIsYf9gyDtzV"
},
"outputs": [],
"source": [
"# RANDOM SEED\n",
"np.random.seed(202)"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "oEFzQgTgY1oC"
},
"outputs": [],
"source": [
"def plot_acc(history, title=\"Model Accuracy\"):\n",
" \"\"\"Imprime una gráfica mostrando la accuracy por epoch obtenida en un entrenamiento\"\"\"\n",
" plt.plot(history.history['acc'])\n",
" plt.plot(history.history['val_acc'])\n",
" plt.title(title)\n",
" plt.ylabel('Accuracy')\n",
" plt.xlabel('Epoch')\n",
" plt.legend(['Train', 'Val'], loc='upper left')\n",
" plt.show()\n",
" \n",
"def plot_loss(history, title=\"Model Loss\"):\n",
" \"\"\"Imprime una gráfica mostrando la pérdida por epoch obtenida en un entrenamiento\"\"\"\n",
" plt.plot(history.history['loss'])\n",
" plt.plot(history.history['val_loss'])\n",
" plt.title(title)\n",
" plt.ylabel('Loss')\n",
" plt.xlabel('Epoch')\n",
" plt.legend(['Train', 'Val'], loc='upper right')\n",
" plt.show()\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "QI274F8LQC59"
},
"source": [
"## Carga de los datos"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "tm36ajHbsoc0"
},
"source": [
"NOTA : Reemplazamos el uso de Keras stand-alone por el keras integrado en Tensorflow (tf.Keras) por coherencia con el resto de prácticas entregadas."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 106
},
"colab_type": "code",
"id": "D7tKOZ9BFfki",
"outputId": "3a7d0b92-c6f1-4369-881f-250516ea79d7"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Downloading data from https://onedrive.live.com/download?cid=C506CF0A4F373B0F&resid=C506CF0A4F373B0F%219337&authkey=AMzI92bJPx8Sd60\n",
"523796480/523789527 [==============================] - 35s 0us/step\n",
"Downloading data from https://onedrive.live.com/download?cid=C506CF0A4F373B0F&resid=C506CF0A4F373B0F%219341&authkey=ANnjK3Uq1FhuAe8\n",
"10665984/10658925 [==============================] - 0s 0us/step\n"
]
}
],
"source": [
"# Primero, bajamos los datos de entrenamiento\n",
"keras.utils.get_file(fname=\"simpsons_train.tar.gz\", \n",
" origin=\"https://onedrive.live.com/download?cid=C506CF0A4F373B0F&resid=C506CF0A4F373B0F%219337&authkey=AMzI92bJPx8Sd60\")\n",
"\n",
"# Descomprimimos el archivo\n",
"!tar -xzf /root/.keras/datasets/simpsons_train.tar.gz -C /root/.keras/datasets\n",
"\n",
"# Hacemos lo mismo con los datos de test\n",
"keras.utils.get_file(fname=\"simpsons_test.tar.gz\", \n",
" origin=\"https://onedrive.live.com/download?cid=C506CF0A4F373B0F&resid=C506CF0A4F373B0F%219341&authkey=ANnjK3Uq1FhuAe8\")\n",
"!tar -xzf /root/.keras/datasets/simpsons_test.tar.gz -C /root/.keras/datasets"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "hMFhe3COFwSD"
},
"outputs": [],
"source": [
"# Esta variable contiene un mapeo de número de clase a personaje.\n",
"# Utilizamos sólo los 18 personajes del dataset que tienen más imágenes.\n",
"MAP_CHARACTERS = {\n",
" 0: 'abraham_grampa_simpson', 1: 'apu_nahasapeemapetilon', 2: 'bart_simpson',\n",
" 3: 'charles_montgomery_burns', 4: 'chief_wiggum', 5: 'comic_book_guy', 6: 'edna_krabappel', \n",
" 7: 'homer_simpson', 8: 'kent_brockman', 9: 'krusty_the_clown', 10: 'lisa_simpson', \n",
" 11: 'marge_simpson', 12: 'milhouse_van_houten', 13: 'moe_szyslak', \n",
" 14: 'ned_flanders', 15: 'nelson_muntz', 16: 'principal_skinner', 17: 'sideshow_bob'\n",
"}\n",
"\n",
"# Vamos a standarizar todas las imágenes a tamaño 64x64\n",
"IMG_SIZE = 64"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "5bJ0NsbCbupF"
},
"outputs": [],
"source": [
"def load_train_set(dirname, map_characters, verbose=True):\n",
" \"\"\"Esta función carga los datos de training en imágenes.\n",
" \n",
" Como las imágenes tienen tamaños distintas, utilizamos la librería opencv\n",
" para hacer un resize y adaptarlas todas a tamaño IMG_SIZE x IMG_SIZE.\n",
" \n",
" Args:\n",
" dirname: directorio completo del que leer los datos\n",
" map_characters: variable de mapeo entre labels y personajes\n",
" verbose: si es True, muestra información de las imágenes cargadas\n",
" \n",
" Returns:\n",
" X, y: X es un array con todas las imágenes cargadas con tamaño\n",
" IMG_SIZE x IMG_SIZE\n",
" y es un array con las labels de correspondientes a cada imagen\n",
" \"\"\"\n",
" X_train = []\n",
" y_train = []\n",
" for label, character in map_characters.items(): \n",
" files = os.listdir(os.path.join(dirname, character))\n",
" images = [file for file in files if file.endswith(\"jpg\")]\n",
" if verbose:\n",
" print(\"Leyendo {} imágenes encontradas de {}\".format(len(images), character))\n",
" for image_name in images:\n",
" image = cv2.imread(os.path.join(dirname, character, image_name))\n",
" X_train.append(cv2.resize(image,(IMG_SIZE, IMG_SIZE)))\n",
" y_train.append(label)\n",
" return np.array(X_train), np.array(y_train)"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "NslxhnnDK6uA"
},
"outputs": [],
"source": [
"def load_test_set(dirname, map_characters, verbose=True):\n",
" \"\"\"Esta función funciona de manera equivalente a la función load_train_set\n",
" pero cargando los datos de test.\"\"\"\n",
" X_test = []\n",
" y_test = []\n",
" reverse_dict = {v: k for k, v in map_characters.items()}\n",
" for filename in glob.glob(dirname + '/*.*'):\n",
" char_name = \"_\".join(filename.split('/')[-1].split('_')[:-1])\n",
" if char_name in reverse_dict:\n",
" image = cv2.imread(filename)\n",
" image = cv2.resize(image, (IMG_SIZE, IMG_SIZE))\n",
" X_test.append(image)\n",
" y_test.append(reverse_dict[char_name])\n",
" if verbose:\n",
" print(\"Leídas {} imágenes de test\".format(len(X_test)))\n",
" return np.array(X_test), np.array(y_test)\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 347
},
"colab_type": "code",
"id": "WVWqKxFcbwTu",
"outputId": "5775ef7b-8f64-4012-ef5f-76e1e5b6a92f"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Leyendo 913 imágenes encontradas de abraham_grampa_simpson\n",
"Leyendo 623 imágenes encontradas de apu_nahasapeemapetilon\n",
"Leyendo 1342 imágenes encontradas de bart_simpson\n",
"Leyendo 1193 imágenes encontradas de charles_montgomery_burns\n",
"Leyendo 986 imágenes encontradas de chief_wiggum\n",
"Leyendo 469 imágenes encontradas de comic_book_guy\n",
"Leyendo 457 imágenes encontradas de edna_krabappel\n",
"Leyendo 2246 imágenes encontradas de homer_simpson\n",
"Leyendo 498 imágenes encontradas de kent_brockman\n",
"Leyendo 1206 imágenes encontradas de krusty_the_clown\n",
"Leyendo 1354 imágenes encontradas de lisa_simpson\n",
"Leyendo 1291 imágenes encontradas de marge_simpson\n",
"Leyendo 1079 imágenes encontradas de milhouse_van_houten\n",
"Leyendo 1452 imágenes encontradas de moe_szyslak\n",
"Leyendo 1454 imágenes encontradas de ned_flanders\n",
"Leyendo 358 imágenes encontradas de nelson_muntz\n",
"Leyendo 1194 imágenes encontradas de principal_skinner\n",
"Leyendo 877 imágenes encontradas de sideshow_bob\n",
"Leídas 890 imágenes de test\n"
]
}
],
"source": [
"# Cargamos los datos. Si no estás trabajando en colab, cambia los paths por\n",
"# los de los ficheros donde hayas descargado los datos.\n",
"DATASET_TRAIN_PATH_COLAB = \"/root/.keras/datasets/simpsons\"\n",
"DATASET_TEST_PATH_COLAB = \"/root/.keras/datasets/simpsons_testset\"\n",
"\n",
"X, y = load_train_set(DATASET_TRAIN_PATH_COLAB, MAP_CHARACTERS)\n",
"X_t, y_t = load_test_set(DATASET_TEST_PATH_COLAB, MAP_CHARACTERS)"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "2GY4vTFyfffv"
},
"outputs": [],
"source": [
"# Vamos a barajar aleatoriamente los datos. Esto es importante ya que si no\n",
"# lo hacemos y, por ejemplo, cogemos el 20% de los datos finales como validation\n",
"# set, estaremos utilizando solo un pequeño número de personajes, ya que\n",
"# las imágenes se leen secuencialmente personaje a personaje.\n",
"perm = np.random.permutation(len(X))\n",
"X, y = X[perm], y[perm]"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "llnXPyRgtw0r"
},
"source": [
"### Exploración de datos y creación de conjunto de validación\n",
"\n",
"- Conjunto de datos de entrenamiento : X,y (originales), x_train, y_train (con validación)\n",
"- Conjunto de datos de validación : x_val, y_val\n",
"- Conjunto de datos de test : X_t, y_t (originales), x_test, y_test (renombrados[link text](https://))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 347
},
"colab_type": "code",
"id": "YGAEFFywuyaR",
"outputId": "d233ca07-a034-42bd-ad08-46adf899153a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Número de imágenes de anterior training : 18992\n",
"Número de imágenes de training (80% de anterior train) : 15193\n",
"Número de imágenes de validación (20% de anterior train) : 3799\n",
"Número de imágenes de test : 890\n",
"====\n",
"Número de resultados de anterior training : 18992\n",
"Número de resultados de training (80% de anterior train) : 15193\n",
"Número de resultadoss de validación (20% de anterior train) : 3799\n",
"Número de resultados de test : 890\n",
"====\n",
"Dimensiones de training : (15193, 64, 64, 3)\n",
"Dimensiones de validation : (3799, 64, 64, 3)\n",
"Dimensiones de tests : (890, 64, 64, 3)\n",
"====\n",
"Canales de color para las imagenes : 3\n",
"Resolución imágenes de anterior training : 64x64\n",
"Resolución imágenes de training (80% de anterior train) : 64x64\n",
"Resolución imágenes de validación (20% de anterior train) : 64x64\n",
"Resolución imágenes de test : 64x64\n"
]
}
],
"source": [
"# Separamos el conjunto de datos de entrenamiento en train y val con 20% y random seed 202\n",
"x_train, x_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=202)\n",
"\n",
"# Copiamos el conjunto de test con otro nombre para mantener la nomenclatura del resto de prácticas\n",
"x_test = X_t\n",
"y_test = y_t\n",
"\n",
"# Variables con numero de elementos\n",
"x_train_num_elem = x_train.shape[0]\n",
"x_val_num_elem = x_val.shape[0]\n",
"x_test_num_elem = x_test.shape[0]\n",
"\n",
"# Dimensiones\n",
"img_rows = IMG_SIZE\n",
"img_cols = IMG_SIZE\n",
"img_channels = X.shape[3]\n",
"\n",
"# Número de categorías\n",
"num_categ = len(MAP_CHARACTERS)\n",
"\n",
"# Comprobamos que efectivamente los resultados son los esperados\n",
"print(\"Número de imágenes de anterior training : \" + str(X.shape[0]))\n",
"print(\"Número de imágenes de training (80% de anterior train) : \" + str(x_train_num_elem))\n",
"print(\"Número de imágenes de validación (20% de anterior train) : \" + str(x_val_num_elem))\n",
"print(\"Número de imágenes de test : \" + str(x_test_num_elem))\n",
"print(\"====\")\n",
"print(\"Número de resultados de anterior training : \" + str(y.shape[0]))\n",
"print(\"Número de resultados de training (80% de anterior train) : \" + str(y_train.shape[0]))\n",
"print(\"Número de resultadoss de validación (20% de anterior train) : \" + str(y_val.shape[0]))\n",
"print(\"Número de resultados de test : \" + str(y_test.shape[0]))\n",
"print(\"====\")\n",
"print(\"Dimensiones de training : \" + str(x_train.shape))\n",
"print(\"Dimensiones de validation : \" + str(x_val.shape))\n",
"print(\"Dimensiones de tests : \" + str(x_test.shape))\n",
"print(\"====\")\n",
"print(\"Canales de color para las imagenes : \"+ str(img_channels))\n",
"print(\"Resolución imágenes de anterior training : \" + str(X.shape[1]) + \"x\" + str(X.shape[2]))\n",
"print(\"Resolución imágenes de training (80% de anterior train) : \" + str(x_train.shape[1]) + \"x\" + str(x_train.shape[2]))\n",
"print(\"Resolución imágenes de validación (20% de anterior train) : \" + str(x_val.shape[1]) + \"x\" + str(x_val.shape[2]))\n",
"print(\"Resolución imágenes de test : \" + str(x_test.shape[1]) + \"x\" + str(x_test.shape[2]))"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "dIar8S75HKl-"
},
"outputs": [],
"source": [
"# Dependiendo del formato (llamada a backend de Keras) hacemos un reshape de forma : \n",
"# CANALES, FILAS, COLUMNAS\n",
"if keras_backend.image_data_format() == 'channels_first':\n",
" x_train = x_train.reshape(x_train.shape[0], img_channels, img_rows, img_cols)\n",
" x_val = x_val.reshape(x_val.shape[0], img_channels, img_rows, img_cols)\n",
" x_test = x_test.reshape(x_test.shape[0], img_channels, img_rows, img_cols)\n",
" input_shape = (img_channels, img_rows, img_cols)\n",
"# FILAS, COLUMNAS, CANALES\n",
"else:\n",
" x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, img_channels)\n",
" x_val = x_val.reshape(x_val.shape[0], img_rows, img_cols, img_channels)\n",
" x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, img_channels)\n",
" input_shape = (img_rows, img_cols, img_channels)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "KeKTS6mct6WS"
},
"source": [
"### Normalización de datos"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "cKOXTNQNuzUv"
},
"outputs": [],
"source": [
"# Normalizamos como float32 para poder dividirlos entre 0 y 1\n",
"x_train = x_train.astype('float32')\n",
"x_val = x_val.astype('float32')\n",
"x_test = x_test.astype('float32')\n",
"\n",
"# Valores entre 0..1\n",
"x_train /= 255\n",
"x_val /= 255\n",
"x_test /= 255\n",
"\n",
"# Categóricos para los resultados\n",
"y_train = keras.utils.to_categorical(y_train, num_categ)\n",
"y_val = keras.utils.to_categorical(y_val, num_categ)\n",
"y_test = keras.utils.to_categorical(y_test, num_categ)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "kz3dYNt16OrZ"
},
"source": [
"### Definición de banco de pruebas\n",
"\n",
"Vamos a trabajar con 5 modelos diferentes :\n",
"\n",
"T1 : Modelo de red con 2 capas convolucionales, función de activación Relu y optimizador Adadelta (el mismo del ejemplo de MNIST de Keras).\n",
"\n",
"T2 : Modelo de red fully connected.\n",
"\n",
"T3 : Modelo de red con 4 capas convolucionales, función de activación Relu y optimizador RMSProp.\n",
"\n",
"T4 : Modelo de red con 4 capas convolucionales, función de activación Relu y optimizador RMSProp con Data Augmentation.\n",
"\n",
"T5 : Modelo de red con 6 capas convolucionales, función de activación Relu, optimizador Adadelta y Batch Normalization."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "dB784-K7uIxX"
},
"source": [
"### Banco de pruebas - Modelo de red CNN T1\n",
"\n",
"T1 es un modelo de red básico igual que el usado en el ejemplo de CNNs con Keras en el dataset NMIST con 2 capas de convolución.\n",
"\n",
"- Arquitectura : 2x Conv2D, 1xMaxpool2d, 1xDropout, 1xFlatten, 1xDense, 1xDropout, 1xDense\n",
"- Funciones de activación : Relu\n",
"- Kernel size para Conv2D : 3x3\n",
"- Optimizador : Adadelta"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "nn-ekYnBRTXc"
},
"source": [
"#### T1 - Arquitectura de la red CNN"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 416
},
"colab_type": "code",
"id": "NzzYxb3du3yp",
"outputId": "51848836-951a-4825-badc-d081bbb0444c"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"t1_conv2d_1 (Conv2D) (None, 62, 62, 32) 896 \n",
"_________________________________________________________________\n",
"t1_conv2d_2 (Conv2D) (None, 60, 60, 64) 18496 \n",
"_________________________________________________________________\n",
"t1_maxpool2d_1 (MaxPooling2D (None, 30, 30, 64) 0 \n",
"_________________________________________________________________\n",
"t1_dropout_1 (Dropout) (None, 30, 30, 64) 0 \n",
"_________________________________________________________________\n",
"t1_flatten_1 (Flatten) (None, 57600) 0 \n",
"_________________________________________________________________\n",
"t1_dense_1 (Dense) (None, 128) 7372928 \n",
"_________________________________________________________________\n",
"t1_dropout_2 (Dropout) (None, 128) 0 \n",
"_________________________________________________________________\n",
"t1_dense_2 (Dense) (None, 18) 2322 \n",
"=================================================================\n",
"Total params: 7,394,642\n",
"Trainable params: 7,394,642\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"t1_keras_model = Sequential()\n",
"t1_keras_model.add(Conv2D(32, kernel_size=(3, 3), activation='relu',\n",
" input_shape=input_shape, name='t1_conv2d_1'))\n",
"t1_keras_model.add(Conv2D(64, kernel_size=(3, 3), activation='relu', \n",
" name='t1_conv2d_2'))\n",
"t1_keras_model.add(MaxPooling2D(pool_size=(2,2), name='t1_maxpool2d_1'))\n",
"t1_keras_model.add(Dropout(0.25, name='t1_dropout_1'))\n",
"t1_keras_model.add(Flatten(name='t1_flatten_1'))\n",
"t1_keras_model.add(Dense(128, activation='relu', name='t1_dense_1'))\n",
"t1_keras_model.add(Dropout(0.5, name='t1_dropout_2'))\n",
"t1_keras_model.add(Dense(num_categ, activation='softmax', name='t1_dense_2'))\n",
"\n",
"t1_keras_model.summary()\n"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "PaY3vQ-pu4lW"
},
"outputs": [],
"source": [
"# Definimos los parámetros del optimizador adadelta()\n",
"# https://keras.io/optimizers/#adadelta\n",
"\n",
"# - Learning Rate (lr) = 1.0\n",
"# - RHO (Decay factor) = 0.95\n",
"# - Epsilon (Fuzz Factor) = None\n",
"# - Decay (Learning rate decay over each update) = 0.0\n",
"adadelta = Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)\n",
"\n",
"# Compilamos el modelo\n",
"t1_keras_model.compile(loss='categorical_crossentropy',\n",
" optimizer=adadelta,\n",
" metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "m2VSEOdFUA7z"
},
"outputs": [],
"source": [
"# Si usamos TPU pasamos el modelo Keras a modelo TPU\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" t1_tpu_model = tf.contrib.tpu.keras_to_tpu_model(\n",
" t1_keras_model,\n",
" strategy=tf.contrib.tpu.TPUDistributionStrategy(\n",
" tf.contrib.cluster_resolver.TPUClusterResolver(\n",
" tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])\n",
" )\n",
" )\n",
" print(\"TPU Model\")\n",
" print(\"=========\")\n",
" t1_tpu_model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "3AG2OdCSuTlU"
},
"source": [
"#### T1 - Entrenamiento de la red"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 471
},
"colab_type": "code",
"id": "zIINTUVcOSBl",
"outputId": "094b2956-1c90-4d90-937c-756cfb485bca"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 15193 samples, validate on 3799 samples\n",
"Epoch 1/12\n",
"15193/15193 [==============================] - 14s 890us/step - loss: 2.8658 - acc: 0.1017 - val_loss: 2.6178 - val_acc: 0.2419\n",
"Epoch 2/12\n",
"15193/15193 [==============================] - 10s 643us/step - loss: 2.5173 - acc: 0.2105 - val_loss: 2.1398 - val_acc: 0.3843\n",
"Epoch 3/12\n",
"15193/15193 [==============================] - 10s 643us/step - loss: 2.1774 - acc: 0.3251 - val_loss: 1.7489 - val_acc: 0.5004\n",
"Epoch 4/12\n",
"15193/15193 [==============================] - 10s 639us/step - loss: 1.8489 - acc: 0.4326 - val_loss: 1.5270 - val_acc: 0.5607\n",
"Epoch 5/12\n",
"15193/15193 [==============================] - 10s 643us/step - loss: 1.6097 - acc: 0.5133 - val_loss: 1.3621 - val_acc: 0.5988\n",
"Epoch 6/12\n",
"15193/15193 [==============================] - 10s 640us/step - loss: 1.3670 - acc: 0.5821 - val_loss: 1.1869 - val_acc: 0.6625\n",
"Epoch 7/12\n",
"15193/15193 [==============================] - 10s 640us/step - loss: 1.1836 - acc: 0.6387 - val_loss: 1.1067 - val_acc: 0.6707\n",
"Epoch 8/12\n",
"15193/15193 [==============================] - 10s 639us/step - loss: 1.0140 - acc: 0.6806 - val_loss: 1.0325 - val_acc: 0.7018\n",
"Epoch 9/12\n",
"15193/15193 [==============================] - 10s 641us/step - loss: 0.8660 - acc: 0.7274 - val_loss: 0.9493 - val_acc: 0.7215\n",
"Epoch 10/12\n",
"15193/15193 [==============================] - 10s 646us/step - loss: 0.7408 - acc: 0.7645 - val_loss: 0.9733 - val_acc: 0.7347\n",
"Epoch 11/12\n",
"15193/15193 [==============================] - 10s 650us/step - loss: 0.6531 - acc: 0.7898 - val_loss: 0.8971 - val_acc: 0.7455\n",
"Epoch 12/12\n",
"15193/15193 [==============================] - 10s 641us/step - loss: 0.5728 - acc: 0.8131 - val_loss: 0.8819 - val_acc: 0.7594\n"
]
}
],
"source": [
"# Parametros de entrenamiento\n",
"t1_n_batch_size = 128\n",
"t1_n_epochs = 12\n",
"\n",
"\n",
"# Entrenamos el modelo con fit dependiendo si tenemos TPU o GPU/Normal\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" print(\"Training with TPU Model...\")\n",
" t1_model_history = t1_tpu_model.fit(x_train, y_train,\n",
" batch_size=t1_n_batch_size,\n",
" epochs=t1_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))\n",
"else:\n",
" # GPU o sin aceleración\n",
" t1_model_history = t1_keras_model.fit(x_train, y_train,\n",
" batch_size=t1_n_batch_size,\n",
" epochs=t1_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "uEpIhMHGub_y"
},
"source": [
"#### T1 - Análisis de loss/accuracy"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 571
},
"colab_type": "code",
"id": "Imqn7VQAu5UH",
"outputId": "21c98b45-e2ca-486a-93e0-f1dc4ebf160e"
},
"outputs": [
{
"data": {
"image/png": "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\nRK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"plot_acc(t1_model_history)\n",
"plot_loss(t1_model_history)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "cr9y53m7uiPx"
},
"source": [
"#### T1 - Estimación con conjunto de test"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 86
},
"colab_type": "code",
"id": "i-vOCrqfu6Lq",
"outputId": "3e567c34-07d5-4b36-ba89-c9ee9bf53d0a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"890/890 [==============================] - 0s 415us/step\n",
"Evaluación del modelo (Datos de test) - Loss : 0.36294691884115843\n",
"Evaluación del modelo (Datos de test) - Accuracy : 0.9134831453977006\n",
"Accuracy (Datos de test) en % : 91.34831453977006\n"
]
}
],
"source": [
"# Evaluamos sobre los datos de test\n",
"\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" t1_score = t1_tpu_model.evaluate(x_test, y_test, verbose=1)\n",
"else:\n",
" t1_score = t1_keras_model.evaluate(x_test, y_test, verbose=1)\n",
" \n",
"print(\"Evaluación del modelo (Datos de test) - Loss : \" + str(t1_score[0]))\n",
"print(\"Evaluación del modelo (Datos de test) - Accuracy : \" + str(t1_score[1]))\n",
"print(\"Accuracy (Datos de test) en % : \" + str(t1_score[1]*100))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "comyx48bajYC"
},
"source": [
"#### T1 - Conclusiones\n",
"\n",
"Empleando redes neuronales con 2 capas convolucionales, función de activación Relu y optimizador Adadelta (el mismo del ejemplo de MNIST de Keras), obtenemos los siguientes parametros de loss y accuracy en cada uno de los conjuntos empleados :\n",
"\n",
"* **Datos de entrenamiento**\n",
" * Loss : 0.5728\n",
" * Accuracy : 0.8131\n",
"\n",
"* **Datos de validación**\n",
" * Loss : 0.8819\n",
" * Accuracy : 0.7594\n",
"\n",
"* **Datos de test**\n",
" * Loss : 0.3629\n",
" * Accuracy : 0.9134\n",
"\n",
"\n",
"### Conclusiones\n",
"\n",
"Según los resultados obtenidos (y la teoría del curso) Los valores obtenidos con un accuracy superior al 85% requerido inicialmente aunque los valores de loss son un poco mas elevados de lo deseable."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "pdSuUJTKa8yh"
},
"source": [
"### Banco de pruebas - Modelo de red FC T2\n",
"\n",
"T2 es un modelo de red full-connected basado en el mejor caso estudiado de la actividad anterior.\n",
"\n",
"- Arquitectura : Fully Connected con 3 Dense, Dropout y Batch Normalization\n",
"- Funciones de activación : Relu\n",
"- Optimizador : Adam"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "HhT00heUakB7"
},
"source": [
"#### T2 - Arquitectura de la red FC"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 416
},
"colab_type": "code",
"id": "u5QbjOzTakB8",
"outputId": "8adf6608-ea37-40f0-98c1-90489dda47d3"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"t2_input_layer (Dense) (None, 64, 64, 128) 512 \n",
"_________________________________________________________________\n",
"t2_hidden_layer_1 (Dense) (None, 64, 64, 128) 16512 \n",
"_________________________________________________________________\n",
"t2_dropout_1 (Dropout) (None, 64, 64, 128) 0 \n",
"_________________________________________________________________\n",
"flatten (Flatten) (None, 524288) 0 \n",
"_________________________________________________________________\n",
"t2_hidden_layer_2 (Dense) (None, 128) 67108992 \n",
"_________________________________________________________________\n",
"t2_dropout_2 (Dropout) (None, 128) 0 \n",
"_________________________________________________________________\n",
"t2_batch_normalization_2 (Ba (None, 128) 512 \n",
"_________________________________________________________________\n",
"t2_output_layer (Dense) (None, 18) 2322 \n",
"=================================================================\n",
"Total params: 67,128,850\n",
"Trainable params: 67,128,594\n",
"Non-trainable params: 256\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"# Definimos la red - Modelo con función de activación Relu e inicialización por defecto \n",
"# con estrategia glorot uniform (relu_model)\n",
"t2_keras_model = Sequential()\n",
"\n",
"# Initializer - Por defecto con estrategia Glorot Uniform \n",
"model_initializer=keras.initializers.glorot_normal(seed=None)\n",
"\n",
"# 1x Input layer con inicialización a cero en bias y función kernel\n",
"t2_keras_model.add(Dense(128, activation='relu', input_shape=input_shape, \n",
" bias_initializer=model_initializer,\n",
" kernel_initializer=model_initializer,\n",
" name='t2_input_layer'))\n",
"\n",
"# 2x Hidden layers con inicialización a cero en bias y función kernel\n",
"t2_keras_model.add(Dense(128, activation='relu', \n",
" bias_initializer=model_initializer,\n",
" kernel_initializer=model_initializer,\n",
" name='t2_hidden_layer_1'))\n",
"t2_keras_model.add(Dropout(0.1, name='t2_dropout_1'))\n",
"t2_keras_model.add(Flatten())\n",
"t2_keras_model.add(Dense(128, activation='relu', \n",
" bias_initializer=model_initializer,\n",
" kernel_initializer=model_initializer,\n",
" name='t2_hidden_layer_2'))\n",
"t2_keras_model.add(Dropout(0.1, name='t2_dropout_2'))\n",
"t2_keras_model.add(BatchNormalization(name='t2_batch_normalization_2'))\n",
"\n",
"\n",
"# 1x Output layer\n",
"t2_keras_model.add(Dense(num_categ, activation='softmax', name='t2_output_layer'))\n",
"\n",
"t2_keras_model.summary()"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "qHosUa5hakB_"
},
"outputs": [],
"source": [
"# Definimos los parámetros del optimizador adam\n",
"# https://keras.io/optimizers/#adam\n",
"#\n",
"# - Learning Rate (lr) = 0.01\n",
"# - Beta 1 = 0.9\n",
"# - Beta 2 = 0.999\n",
"# - Epsilon (Fuzz Factor) = None\n",
"# - Decay (Learning rate decay over each update) = 0.0\n",
"# - amsgrad (apply the AMSGrad variant) = False\n",
"adam = Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)\n",
"\n",
"# Compilamos el modelo\n",
"t2_keras_model.compile(loss='categorical_crossentropy',\n",
" optimizer=adam,\n",
" metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "MaBPfy9sakCF"
},
"outputs": [],
"source": [
"# Si usamos TPU pasamos el modelo Keras a modelo TPU\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" t2_tpu_model = tf.contrib.tpu.keras_to_tpu_model(\n",
" t2_keras_model,\n",
" strategy=tf.contrib.tpu.TPUDistributionStrategy(\n",
" tf.contrib.cluster_resolver.TPUClusterResolver(\n",
" tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])\n",
" )\n",
" )\n",
" print(\"TPU Model\")\n",
" print(\"=========\")\n",
" t2_tpu_model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "SLRw3334akCI"
},
"source": [
"#### T2 - Entrenamiento de la red"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 471
},
"colab_type": "code",
"id": "5ppfnfKQakCJ",
"outputId": "4c165276-b464-443d-b5be-4b2266942d29"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 15193 samples, validate on 3799 samples\n",
"Epoch 1/12\n",
"15193/15193 [==============================] - 38s 2ms/step - loss: 2.2093 - acc: 0.3480 - val_loss: 2.1445 - val_acc: 0.3354\n",
"Epoch 2/12\n",
"15193/15193 [==============================] - 35s 2ms/step - loss: 1.3269 - acc: 0.6273 - val_loss: 1.7053 - val_acc: 0.5051\n",
"Epoch 3/12\n",
"15193/15193 [==============================] - 36s 2ms/step - loss: 0.9222 - acc: 0.7436 - val_loss: 1.3989 - val_acc: 0.6312\n",
"Epoch 4/12\n",
"15193/15193 [==============================] - 36s 2ms/step - loss: 0.6224 - acc: 0.8345 - val_loss: 1.1206 - val_acc: 0.6944\n",
"Epoch 5/12\n",
"15193/15193 [==============================] - 36s 2ms/step - loss: 0.3785 - acc: 0.9076 - val_loss: 1.0335 - val_acc: 0.7060\n",
"Epoch 6/12\n",
"15193/15193 [==============================] - 35s 2ms/step - loss: 0.2283 - acc: 0.9498 - val_loss: 0.9828 - val_acc: 0.7355\n",
"Epoch 7/12\n",
"15193/15193 [==============================] - 36s 2ms/step - loss: 0.1325 - acc: 0.9754 - val_loss: 1.0004 - val_acc: 0.7441\n",
"Epoch 8/12\n",
"15193/15193 [==============================] - 36s 2ms/step - loss: 0.0833 - acc: 0.9859 - val_loss: 1.0182 - val_acc: 0.7402\n",
"Epoch 9/12\n",
"15193/15193 [==============================] - 35s 2ms/step - loss: 0.0570 - acc: 0.9914 - val_loss: 1.0460 - val_acc: 0.7478\n",
"Epoch 10/12\n",
"15193/15193 [==============================] - 35s 2ms/step - loss: 0.0451 - acc: 0.9927 - val_loss: 1.0792 - val_acc: 0.7397\n",
"Epoch 11/12\n",
"15193/15193 [==============================] - 36s 2ms/step - loss: 0.0474 - acc: 0.9918 - val_loss: 1.1073 - val_acc: 0.7373\n",
"Epoch 12/12\n",
"15193/15193 [==============================] - 35s 2ms/step - loss: 0.0370 - acc: 0.9941 - val_loss: 1.1202 - val_acc: 0.7484\n"
]
}
],
"source": [
"# Parametros de entrenamiento\n",
"t2_n_batch_size = 128\n",
"t2_n_epochs = 12\n",
"\n",
"\n",
"# Entrenamos el modelo con fit dependiendo si tenemos TPU o GPU/Normal\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" print(\"Training with TPU Model...\")\n",
" t2_model_history = t2_tpu_model.fit(x_train, y_train,\n",
" batch_size=t2_n_batch_size,\n",
" epochs=t2_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))\n",
"else:\n",
" # GPU o sin aceleración\n",
" t2_model_history = t2_keras_model.fit(x_train, y_train,\n",
" batch_size=t2_n_batch_size,\n",
" epochs=t2_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "9J2GvaXQakCP"
},
"source": [
"#### T2 - Análisis de loss/accuracy"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 571
},
"colab_type": "code",
"id": "iHemU5njakCS",
"outputId": "f13598d0-3bc9-4849-f3af-e2fa80a02151"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"plot_acc(t2_model_history)\n",
"plot_loss(t2_model_history)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "tlD2r1E4akCZ"
},
"source": [
"#### T2 - Estimación con conjunto de test"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 86
},
"colab_type": "code",
"id": "CM7F-121akCZ",
"outputId": "e84d7780-3b9f-4ad7-f62f-173f751c1dea"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"890/890 [==============================] - 1s 774us/step\n",
"Evaluación del modelo (Datos de test) - Loss : 0.3105341935425662\n",
"Evaluación del modelo (Datos de test) - Accuracy : 0.9370786518193363\n",
"Accuracy (Datos de test) en % : 93.70786518193363\n"
]
}
],
"source": [
"# Evaluamos sobre los datos de test\n",
"\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" t2_score = t2_tpu_model.evaluate(x_test, y_test, verbose=1)\n",
"else:\n",
" t2_score = t2_keras_model.evaluate(x_test, y_test, verbose=1)\n",
" \n",
"print(\"Evaluación del modelo (Datos de test) - Loss : \" + str(t2_score[0]))\n",
"print(\"Evaluación del modelo (Datos de test) - Accuracy : \" + str(t2_score[1]))\n",
"print(\"Accuracy (Datos de test) en % : \" + str(t2_score[1]*100))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "0QbzW6KIbDq4"
},
"source": [
"#### T2 - Conclusiones\n",
"Empleando redes neuronales con un modelo de red fully connected pas convolucionales, función de activación Relu y optimizador Adadelta (el mismo del ejemplo de MNIST de Keras). \n",
"\n",
"* **Datos de entrenamiento**\n",
" * Loss : 0.0370\n",
" * Accuracy : 0.9941\n",
"\n",
"* **Datos de validación**\n",
" * Loss : 1.1202\n",
" * Accuracy : 0.7484\n",
"\n",
"* **Datos de test**\n",
" * Loss : 0.3105\n",
" * Accuracy : 0.9370\n",
" \n",
"### Conclusiones\n",
"\n",
"Según los resultados obtenidos los valores siguen siendo superiores a un accuracy del 85%, el requerido inicialmente, aunque los valores de loss en validacion son muy elevados incluso mas que en la versión previa de redes neuronales con 2 capas convolucionales."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "irUxB4CKbO8z"
},
"source": [
"### Banco de pruebas - Modelo de red CNN T3\n",
"\n",
"T3 es un modelo de red con 4 capas de convolución\n",
"\n",
"- Arquitectura : 2 bloques de 2xConv2D+2xActivation con Relu+1xMaxPool2D+1xDropout y un bloque de 1xFlatten+2xDense+2xActivation+1xDropout\n",
"- Funciones de activación : Relu\n",
"- Kernel size para Conv2D : 3x3\n",
"- Optimizador : RMSProp"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "vdQWJNaibO87"
},
"source": [
"#### T3 - Arquitectura de la red CNN"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 764
},
"colab_type": "code",
"id": "Vk8NETdXbO9B",
"outputId": "7d18e02b-cee2-498a-9807-3246b107f6c0"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"t3_input_conv2d_1 (Conv2D) (None, 64, 64, 32) 896 \n",
"_________________________________________________________________\n",
"t3_act_1 (Activation) (None, 64, 64, 32) 0 \n",
"_________________________________________________________________\n",
"t3_conv2d_2 (Conv2D) (None, 62, 62, 32) 9248 \n",
"_________________________________________________________________\n",
"t3_act_2 (Activation) (None, 62, 62, 32) 0 \n",
"_________________________________________________________________\n",
"t3_maxpool2d_1 (MaxPooling2D (None, 31, 31, 32) 0 \n",
"_________________________________________________________________\n",
"t3_dropout_1 (Dropout) (None, 31, 31, 32) 0 \n",
"_________________________________________________________________\n",
"t3_conv2d_3 (Conv2D) (None, 31, 31, 64) 18496 \n",
"_________________________________________________________________\n",
"t3_act_3 (Activation) (None, 31, 31, 64) 0 \n",
"_________________________________________________________________\n",
"t3_conv2d_4 (Conv2D) (None, 29, 29, 64) 36928 \n",
"_________________________________________________________________\n",
"t3_act_4 (Activation) (None, 29, 29, 64) 0 \n",
"_________________________________________________________________\n",
"t3_maxpool2d_3 (MaxPooling2D (None, 14, 14, 64) 0 \n",
"_________________________________________________________________\n",
"t3_dropout_2 (Dropout) (None, 14, 14, 64) 0 \n",
"_________________________________________________________________\n",
"t3_flatten_1 (Flatten) (None, 12544) 0 \n",
"_________________________________________________________________\n",
"t3_dense_1 (Dense) (None, 512) 6423040 \n",
"_________________________________________________________________\n",
"t3_act_5 (Activation) (None, 512) 0 \n",
"_________________________________________________________________\n",
"t3_dropout_3 (Dropout) (None, 512) 0 \n",
"_________________________________________________________________\n",
"t3_dense_2 (Dense) (None, 18) 9234 \n",
"_________________________________________________________________\n",
"t3_output_1 (Activation) (None, 18) 0 \n",
"=================================================================\n",
"Total params: 6,497,842\n",
"Trainable params: 6,497,842\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"t3_keras_model = Sequential()\n",
"t3_keras_model.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape, name='t3_input_conv2d_1'))\n",
"t3_keras_model.add(Activation('relu', name='t3_act_1'))\n",
"t3_keras_model.add(Conv2D(32, (3, 3), name='t3_conv2d_2'))\n",
"t3_keras_model.add(Activation('relu', name='t3_act_2'))\n",
"t3_keras_model.add(MaxPooling2D(pool_size=(2, 2), name='t3_maxpool2d_1'))\n",
"t3_keras_model.add(Dropout(0.25, name='t3_dropout_1'))\n",
"\n",
"t3_keras_model.add(Conv2D(64, (3, 3), padding='same', name='t3_conv2d_3'))\n",
"t3_keras_model.add(Activation('relu', name='t3_act_3'))\n",
"t3_keras_model.add(Conv2D(64, (3, 3), name='t3_conv2d_4'))\n",
"t3_keras_model.add(Activation('relu', name='t3_act_4'))\n",
"t3_keras_model.add(MaxPooling2D(pool_size=(2, 2), name='t3_maxpool2d_3'))\n",
"t3_keras_model.add(Dropout(0.25, name='t3_dropout_2'))\n",
"\n",
"t3_keras_model.add(Flatten(name='t3_flatten_1'))\n",
"t3_keras_model.add(Dense(512, name='t3_dense_1'))\n",
"t3_keras_model.add(Activation('relu', name='t3_act_5'))\n",
"t3_keras_model.add(Dropout(0.5, name='t3_dropout_3'))\n",
"t3_keras_model.add(Dense(num_categ, name='t3_dense_2'))\n",
"t3_keras_model.add(Activation('softmax', name='t3_output_1'))\n",
"\n",
"t3_keras_model.summary()\n"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "5CcrCaT8bO9P"
},
"outputs": [],
"source": [
"# Definimos los parámetros del optimizador RMSprop\n",
"# https://keras.io/optimizers/#rmsprop\n",
"#\n",
"# - Learning Rate (lr) = 0.01\n",
"# - rho (Gradient moving average) = 0.9\n",
"# - Epsilon = None\n",
"# - Decay = 0.0\n",
"rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)\n",
"\n",
"# Compilamos el modelo\n",
"t3_keras_model.compile(loss='categorical_crossentropy',\n",
" optimizer=rmsprop,\n",
" metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "PiDH7RfqbO9W"
},
"outputs": [],
"source": [
"# Si usamos TPU pasamos el modelo Keras a modelo TPU\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" t3_tpu_model = tf.contrib.tpu.keras_to_tpu_model(\n",
" t3_keras_model,\n",
" strategy=tf.contrib.tpu.TPUDistributionStrategy(\n",
" tf.contrib.cluster_resolver.TPUClusterResolver(\n",
" tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])\n",
" )\n",
" )\n",
" print(\"TPU Model\")\n",
" print(\"=========\")\n",
" t3_tpu_model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "wzBTGZqebO9c"
},
"source": [
"#### T3 - Entrenamiento de la red"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 471
},
"colab_type": "code",
"id": "5bR-nbm-bO9d",
"outputId": "2310f8bd-5ce8-4246-9397-12904af90565"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 15193 samples, validate on 3799 samples\n",
"Epoch 1/12\n",
"15193/15193 [==============================] - 12s 787us/step - loss: 2.3696 - acc: 0.2764 - val_loss: 1.6258 - val_acc: 0.5270\n",
"Epoch 2/12\n",
"15193/15193 [==============================] - 10s 670us/step - loss: 1.5543 - acc: 0.5333 - val_loss: 1.2867 - val_acc: 0.6328\n",
"Epoch 3/12\n",
"15193/15193 [==============================] - 10s 671us/step - loss: 1.1665 - acc: 0.6466 - val_loss: 1.0112 - val_acc: 0.6978\n",
"Epoch 4/12\n",
"15193/15193 [==============================] - 10s 671us/step - loss: 0.8628 - acc: 0.7396 - val_loss: 0.8380 - val_acc: 0.7544\n",
"Epoch 5/12\n",
"15193/15193 [==============================] - 10s 671us/step - loss: 0.6526 - acc: 0.7996 - val_loss: 0.7740 - val_acc: 0.7794\n",
"Epoch 6/12\n",
"15193/15193 [==============================] - 10s 670us/step - loss: 0.4981 - acc: 0.8476 - val_loss: 0.7040 - val_acc: 0.8049\n",
"Epoch 7/12\n",
"15193/15193 [==============================] - 10s 675us/step - loss: 0.3896 - acc: 0.8783 - val_loss: 0.9223 - val_acc: 0.7570\n",
"Epoch 8/12\n",
"15193/15193 [==============================] - 10s 670us/step - loss: 0.3055 - acc: 0.9015 - val_loss: 0.9056 - val_acc: 0.7763\n",
"Epoch 9/12\n",
"15193/15193 [==============================] - 10s 673us/step - loss: 0.2438 - acc: 0.9238 - val_loss: 0.7592 - val_acc: 0.8255\n",
"Epoch 10/12\n",
"15193/15193 [==============================] - 10s 685us/step - loss: 0.2076 - acc: 0.9339 - val_loss: 0.8234 - val_acc: 0.8168\n",
"Epoch 11/12\n",
"15193/15193 [==============================] - 10s 681us/step - loss: 0.1691 - acc: 0.9469 - val_loss: 0.8080 - val_acc: 0.8289\n",
"Epoch 12/12\n",
"15193/15193 [==============================] - 10s 676us/step - loss: 0.1593 - acc: 0.9500 - val_loss: 0.8121 - val_acc: 0.8305\n"
]
}
],
"source": [
"# Parametros de entrenamiento\n",
"t3_n_batch_size = 128\n",
"t3_n_epochs = 12\n",
"\n",
"\n",
"# Entrenamos el modelo con fit dependiendo si tenemos TPU o GPU/Normal\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" print(\"Training with TPU Model...\")\n",
" t3_model_history = t3_tpu_model.fit(x_train, y_train,\n",
" batch_size=t3_n_batch_size,\n",
" epochs=t3_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))\n",
"else:\n",
" # GPU o sin aceleración\n",
" t3_model_history = t3_keras_model.fit(x_train, y_train,\n",
" batch_size=t3_n_batch_size,\n",
" epochs=t3_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "c411m-hmbO9l"
},
"source": [
"#### T3 - Análisis de loss/accuracy"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 571
},
"colab_type": "code",
"id": "bDANX0U6bO9n",
"outputId": "263be9df-c450-4ae9-d446-ca8d81485fa6"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"plot_acc(t3_model_history)\n",
"plot_loss(t3_model_history)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "vW1ykDApbO9w"
},
"source": [
"#### T3 - Estimación con conjunto de test"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 86
},
"colab_type": "code",
"id": "u8nr3BPxbO9y",
"outputId": "2f628808-be45-409f-a763-80dbc9d38c7a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"890/890 [==============================] - 0s 475us/step\n",
"Evaluación del modelo (Datos de test) - Loss : 0.23298022181130526\n",
"Evaluación del modelo (Datos de test) - Accuracy : 0.9595505619316959\n",
"Accuracy (Datos de test) en % : 95.95505619316958\n"
]
}
],
"source": [
"# Evaluamos sobre los datos de test\n",
"\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" t3_score = t3_tpu_model.evaluate(x_test, y_test, verbose=1)\n",
"else:\n",
" t3_score = t3_keras_model.evaluate(x_test, y_test, verbose=1)\n",
" \n",
"print(\"Evaluación del modelo (Datos de test) - Loss : \" + str(t3_score[0]))\n",
"print(\"Evaluación del modelo (Datos de test) - Accuracy : \" + str(t3_score[1]))\n",
"print(\"Accuracy (Datos de test) en % : \" + str(t3_score[1]*100))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "EzWRmyatbO9-"
},
"source": [
"#### T3 - Conclusiones\n",
"Empleando redes neuronales similares a las del primer apartado subimos de 2 a 4 capas convolucionales y empleamos el optimizador RMSProp en lugar de Adadelta. \n",
"\n",
"Obtenemos los siguientes parametros de loss y accuracy en cada uno de los conjuntos empleados :\n",
"\n",
"* **Datos de entrenamiento**\n",
" * Loss : 0.1593\n",
" * Accuracy : 0.9500\n",
"\n",
"* **Datos de validación**\n",
" * Loss : 0.8121\n",
" * Accuracy : 0.8305\n",
"\n",
"* **Datos de test**\n",
" * Loss : 0.2329\n",
" * Accuracy : 0.9595\n",
"\n",
"\n",
"\n",
"### Conclusiones\n",
"\n",
"Según los resultados obtenidos los valores mantenemos un accuracy superiores al 85%, el requerido inicialmente.\n",
"Los valores de accuracy son elevados y similares el valor de loss en validacion nos indica que podriamos ajustar aun mas el rendimiento de la red empleando otro tipo de parametrizacion y optimización. "
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "E02DsnBvbRHy"
},
"source": [
"### Banco de pruebas - Modelo de red CNN T4\n",
"\n",
"T4 es un modelo de red igual que el anterior T3 pero utilizando data augmentation para generar nuevas imágenes e intentar ver si hay mejoras en el modelo.\n",
"\n",
"- Arquitectura : 2 bloques de 2xConv2D+2xActivation con Relu+1xMaxPool2D+1xDropout y un bloque de 1xFlatten+2xDense+2xActivation+1xDropout\n",
"- Funciones de activación : Relu\n",
"- Kernel size para Conv2D : 3x3\n",
"- Optimizador : RMSProp"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "OACGFnFqbRH9"
},
"source": [
"#### T4 - Arquitectura de la red CNN"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 764
},
"colab_type": "code",
"id": "cfDTaJq3bRIE",
"outputId": "ac0ddbd4-fa39-459b-b032-5e0e1d8b3533"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"t4_input_conv2d_1 (Conv2D) (None, 64, 64, 32) 896 \n",
"_________________________________________________________________\n",
"t4_act_1 (Activation) (None, 64, 64, 32) 0 \n",
"_________________________________________________________________\n",
"t4_conv2d_2 (Conv2D) (None, 62, 62, 32) 9248 \n",
"_________________________________________________________________\n",
"t4_act_2 (Activation) (None, 62, 62, 32) 0 \n",
"_________________________________________________________________\n",
"t4_maxpool2d_1 (MaxPooling2D (None, 31, 31, 32) 0 \n",
"_________________________________________________________________\n",
"t4_dropout_1 (Dropout) (None, 31, 31, 32) 0 \n",
"_________________________________________________________________\n",
"t4_conv2d_3 (Conv2D) (None, 31, 31, 64) 18496 \n",
"_________________________________________________________________\n",
"t4_act_3 (Activation) (None, 31, 31, 64) 0 \n",
"_________________________________________________________________\n",
"t4_conv2d_4 (Conv2D) (None, 29, 29, 64) 36928 \n",
"_________________________________________________________________\n",
"t4_act_4 (Activation) (None, 29, 29, 64) 0 \n",
"_________________________________________________________________\n",
"t4_maxpool2d_3 (MaxPooling2D (None, 14, 14, 64) 0 \n",
"_________________________________________________________________\n",
"t4_dropout_2 (Dropout) (None, 14, 14, 64) 0 \n",
"_________________________________________________________________\n",
"t4_flatten_1 (Flatten) (None, 12544) 0 \n",
"_________________________________________________________________\n",
"t4_dense_1 (Dense) (None, 512) 6423040 \n",
"_________________________________________________________________\n",
"t4_act_5 (Activation) (None, 512) 0 \n",
"_________________________________________________________________\n",
"t4_dropout_3 (Dropout) (None, 512) 0 \n",
"_________________________________________________________________\n",
"t4_dense_2 (Dense) (None, 18) 9234 \n",
"_________________________________________________________________\n",
"t4_output_1 (Activation) (None, 18) 0 \n",
"=================================================================\n",
"Total params: 6,497,842\n",
"Trainable params: 6,497,842\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"t4_keras_model = Sequential()\n",
"t4_keras_model.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape, name='t4_input_conv2d_1'))\n",
"t4_keras_model.add(Activation('relu', name='t4_act_1'))\n",
"t4_keras_model.add(Conv2D(32, (3, 3), name='t4_conv2d_2'))\n",
"t4_keras_model.add(Activation('relu', name='t4_act_2'))\n",
"t4_keras_model.add(MaxPooling2D(pool_size=(2, 2), name='t4_maxpool2d_1'))\n",
"t4_keras_model.add(Dropout(0.25, name='t4_dropout_1'))\n",
"\n",
"t4_keras_model.add(Conv2D(64, (3, 3), padding='same', name='t4_conv2d_3'))\n",
"t4_keras_model.add(Activation('relu', name='t4_act_3'))\n",
"t4_keras_model.add(Conv2D(64, (3, 3), name='t4_conv2d_4'))\n",
"t4_keras_model.add(Activation('relu', name='t4_act_4'))\n",
"t4_keras_model.add(MaxPooling2D(pool_size=(2, 2), name='t4_maxpool2d_3'))\n",
"t4_keras_model.add(Dropout(0.25, name='t4_dropout_2'))\n",
"\n",
"t4_keras_model.add(Flatten(name='t4_flatten_1'))\n",
"t4_keras_model.add(Dense(512, name='t4_dense_1'))\n",
"t4_keras_model.add(Activation('relu', name='t4_act_5'))\n",
"t4_keras_model.add(Dropout(0.5, name='t4_dropout_3'))\n",
"t4_keras_model.add(Dense(num_categ, name='t4_dense_2'))\n",
"t4_keras_model.add(Activation('softmax', name='t4_output_1'))\n",
"\n",
"t4_keras_model.summary()\n"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "JrqkKNepbRIT"
},
"outputs": [],
"source": [
"# Definimos los parámetros del optimizador RMSprop\n",
"# https://keras.io/optimizers/#rmsprop\n",
"#\n",
"# - Learning Rate (lr) = 0.01\n",
"# - rho (Gradient moving average) = 0.9\n",
"# - Epsilon = None\n",
"# - Decay = 0.0\n",
"rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)\n",
"\n",
"# Compilamos el modelo\n",
"t4_keras_model.compile(loss='categorical_crossentropy',\n",
" optimizer=rmsprop,\n",
" metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "J42M6k5mbRIZ"
},
"outputs": [],
"source": [
"# Si usamos TPU pasamos el modelo Keras a modelo TPU\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" t4_tpu_model = tf.contrib.tpu.keras_to_tpu_model(\n",
" t4_keras_model,\n",
" strategy=tf.contrib.tpu.TPUDistributionStrategy(\n",
" tf.contrib.cluster_resolver.TPUClusterResolver(\n",
" tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])\n",
" )\n",
" )\n",
" print(\"TPU Model\")\n",
" print(\"=========\")\n",
" t4_tpu_model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "W2tZo0Jengxj"
},
"source": [
"#### T4 - Data Augmentation"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "PGYnTdRSnf_d"
},
"outputs": [],
"source": [
"idgen_rotation_range=10 # Rotación de las imágenes\n",
"idgen_width_shift_range=0.1 # Shift de imagen horizontal\n",
"idgen_height_shift_range=0.1 # Shift de imagen vertical\n",
"\n",
"IDGen = ImageDataGenerator(rotation_range=idgen_rotation_range,\n",
" width_shift_range=idgen_width_shift_range,\n",
" height_shift_range=idgen_height_shift_range,\n",
" horizontal_flip=True,\n",
" vertical_flip=False,\n",
" featurewise_center=False,\n",
" samplewise_center=False,\n",
" featurewise_std_normalization=False,\n",
" samplewise_std_normalization=False,\n",
" zca_whitening=False)\n",
" \n",
"IDGen.fit(x_train)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "gub8mm5tbRIf"
},
"source": [
"#### T4 - Entrenamiento de la red"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 454
},
"colab_type": "code",
"id": "KSqTS3ANbRIg",
"outputId": "5c9ab6c6-5fb4-49bd-cc7a-e8a030cadd13"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/12\n",
"119/119 [==============================] - 25s 209ms/step - loss: 2.5397 - acc: 0.2260 - val_loss: 1.9163 - val_acc: 0.4364\n",
"Epoch 2/12\n",
"119/119 [==============================] - 22s 187ms/step - loss: 1.9105 - acc: 0.4283 - val_loss: 1.4363 - val_acc: 0.5638\n",
"Epoch 3/12\n",
"119/119 [==============================] - 22s 189ms/step - loss: 1.5212 - acc: 0.5436 - val_loss: 1.1501 - val_acc: 0.6518\n",
"Epoch 4/12\n",
"119/119 [==============================] - 22s 183ms/step - loss: 1.2775 - acc: 0.6146 - val_loss: 0.9289 - val_acc: 0.7212\n",
"Epoch 5/12\n",
"119/119 [==============================] - 22s 188ms/step - loss: 1.1246 - acc: 0.6626 - val_loss: 0.8558 - val_acc: 0.7491\n",
"Epoch 6/12\n",
"119/119 [==============================] - 22s 187ms/step - loss: 0.9962 - acc: 0.6980 - val_loss: 0.7306 - val_acc: 0.7876\n",
"Epoch 7/12\n",
"119/119 [==============================] - 22s 187ms/step - loss: 0.9075 - acc: 0.7249 - val_loss: 0.7108 - val_acc: 0.7915\n",
"Epoch 8/12\n",
"119/119 [==============================] - 22s 186ms/step - loss: 0.8368 - acc: 0.7503 - val_loss: 0.6709 - val_acc: 0.8049\n",
"Epoch 9/12\n",
"119/119 [==============================] - 22s 185ms/step - loss: 0.7785 - acc: 0.7646 - val_loss: 0.6493 - val_acc: 0.8071\n",
"Epoch 10/12\n",
"119/119 [==============================] - 22s 185ms/step - loss: 0.7082 - acc: 0.7846 - val_loss: 0.6152 - val_acc: 0.8205\n",
"Epoch 11/12\n",
"119/119 [==============================] - 22s 186ms/step - loss: 0.6886 - acc: 0.7929 - val_loss: 0.5477 - val_acc: 0.8484\n",
"Epoch 12/12\n",
"119/119 [==============================] - 23s 193ms/step - loss: 0.6371 - acc: 0.8075 - val_loss: 0.5577 - val_acc: 0.8386\n"
]
}
],
"source": [
"# Parametros de entrenamiento\n",
"t4_n_batch_size = 128\n",
"t4_n_epochs = 12\n",
"\n",
"\n",
"# Entrenamos el modelo con fit dependiendo si tenemos TPU o GPU/Normal\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" print(\"Training with TPU Model...\")\n",
" t4_model_history = t4_tpu_model.fit_generator(IDGen.flow(x_train, y_train,\n",
" batch_size=t4_n_batch_size),\n",
" epochs=t4_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))\n",
"else:\n",
" # GPU o sin aceleración\n",
" t4_model_history = t4_keras_model.fit_generator(IDGen.flow(x_train, y_train,\n",
" batch_size=t4_n_batch_size),\n",
" epochs=t4_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "yFZ73haKbRIn"
},
"source": [
"#### T4 - Análisis de loss/accuracy"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 571
},
"colab_type": "code",
"id": "saq1hz9GbRIq",
"outputId": "81d8ff50-dff9-4c99-d516-48bcc0884286"
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEVCAYAAADpbDJPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xl8lNW9+PHPJJN9J5kkJIQtgS9L\ngACCoCKbe+11w6WuuFar/fX2rv3de3/t7XLb219/1lu1tS5Vi1Wrdbe1ahVREFcgQFiOEPYsZLLv\nyyy/P2YCIYQwkMxMZub7fr14MfPM88zzPSSc73nOc55zLG63G6WUUpEnKtgBKKWUCg5NAEopFaE0\nASilVITSBKCUUhFKE4BSSkUoTQBKKRWhNAGoEU1E3CLy0gDbnxCRUx7D7D3uP0+yz0oReW+Qz60i\nslNE3j3V8ys1kmgCUKFgpoik9r4RkVhgXhDjuQhYDWSLSH4Q41BqSKzBDkApH3wAXAH83vv+QuAL\nYGbvDiJyNfADPL/TlcCdxphyEckEngcmAduBduCQ95hpwCPAaKALuNUY86UP8dwC/AY4CNwI/LxP\nHP8KfBNwAH8G/tEY4x5ou/d7bjTGnOc9dmXvexF5GqgHzgN+DPwFeAooAWKBl40x/+Q9biLwNJAH\nNHjPsxC42BhzqXefKKAKuNAYU+pDGVUE0CsAFQpeBK7v8/4bwJ9634jIWOBx4HJjzBQ8leWj3o//\nFbAbYyYA9+JJHr0V4mvAKmPMZOBu4HURGbRRJCKj8FTCa4Dn8CSA3s/OAe4AZgHFwDnAihNt96Hc\ny4H5xpg/AfcAKcAUYA6w0vu9AI8BzxtjioD/Ap7x/vss8yZAgLOBBq38VV+aAFQoWANMF5FsEUkE\nzgLe7/P5+cAHxpjd3vdPAEu9lfm5eBIIxph9wIfefaYA2cCT3s8+Buze7x7MdXha325jzH6gXkTm\nej+7BPiLMabFGNMNLAFeGWT7ybxvjOn0xnc/cJn3vA3ANmCiiMQDS/Fc5QC8DpxpjKkB1nI00VwB\nvODDOVUE0S4gNeIZY5wi8gpwDVADvGOMcYhI7y42PF0fvfs3iYgFyAJGAU19vq53v3QgEdjR53tS\ngUwGtxKYIiJ3e9/H4unK2eA9X2WfONoBRORE209yKup7X4jIJOCXIjIFcAIFeLqERuFpyDV5v9sN\ntHoPex64Fc/V0GXA1092QhVZNAGoUPFH4Kd4Wum/6ffZYTx93gCISAbgAmrxVPhpffa1AXvwVMjN\n3i6jY3j74o8jIlOBVGNM3xvSWcBWEflH7/my+nzWm0xOtN0JRPc5RcZA5/X6NZ4kc7k3IX7s3V4H\nuPEkrlpv4isEyoFXgV+LyCVAuzFm+yDfryKQdgGpUPEJnpu1xRztxun1N+Bc781Q8PTnv2uMcXiP\nuwJARArx9L8D7AcOicgK72dZIvK8iCQNEsNKPPcNjjDG1AJfARcDbwB/JyIZ3u6n1/DcczjR9irP\nqSXe27U12H2BbGCTt/I/H89N7WRjTBfwrjc2vN/7lrerqAl4G0/C1O4fdRxNACokeLs2XgXeM8a4\n+n12CM9N1tdFZCeefv9vej/+GTBORPYCD+Hte/d+33XAfd5jPsLT59420PlFJBrPDd/XBvj4VeBm\nY8ynwC+AUjwjjjbiuTk74HY8o5s+w5NA/oqn//5EfgLcLyJlwGLgh8APReRsb9m/LiJ7vPv1vWH+\nPDAOTQBqABZdD0Cp8CUi84GHjTHzgx2LGnn0CkCpMOXtbvo+8GCwY1EjkyYApcKQiMzGcyO4Eng2\nyOGoEUq7gJRSKkLpFYBSSkWokHkOwG5vOe1LlYyMRBoa2ocznBElnMunZQtd4Vy+UCqbzZZiOdFn\nEXEFYLVGn3ynEBbO5dOyha5wLl+4lC0iEoBSSqnjaQJQSqkIpQlAKaUilCYApZSKUJoAlFIqQmkC\nUEqpCKUJQCmlIlTIPAimlFLBVt12mFJ7GZ3724lzJZIRn0Z6XBoZ8elkxKURGx0b7BBPiSaAIXjo\noQcwZgf19XV0dnaSl5dPamoaP/3pLwY97q233iQpKZnFi5cGKFKl1Olwu90caDlEqb2MzfYyDrfb\nB90/yZpIenwaGXFppHuTQkZc+pFEkR6XTmx0TICiPzlNAEPw7W9/F/BU6Hv2lHPffX/v03GXXKJL\nsyo1UrncLsob97HZXkapvYyGrkYAYqJiKLEVM8tWzIyCIvZWV9HQ1UhjZxMNXU00djXR0NlIbUcd\nFa1VJ/z+pJjEPknBkyR6ryLS4zzJIyZASUITwDDbuPFL/vjHP9De3s59932XTZs2sGbN+7hcLhYu\nPJvbbruL3/3uUdLT05kwoZBXXnkRiyWK/fv3smTJcm677a5gF0GpiONwOTAN5Wy2b2WzfRutPZ6F\n4RKs8czLmUNJdjHTRk0+0sVjS08hoSd1wO9yu910Ojtp6E0MnY00dDV6X3u21XTUcqi18oTxJMck\n9bmKSGdR/gLyknOHvdxhkwBeXL2bL3bWDPhZdLQFp/PU55KbNyWba5YVnfJx5eW7ef75V4iNjWXT\npg385jdPEBUVxTXXXMa1115/zL7bt2/juedexuVycfXVX9cEoFSAdDm72VFnKLWXUVa3gw5HJwAp\nMcmcnXcmJbZiJmcUYo06tWrSYrGQYE0gITnhhJW22+2mw9FBg/eqobGrqd/rRqrb7Rz0Jom46Fgu\nL7pkaAUeQNgkgJGkqGgSsbGelkJ8fDz33XcX0dHRNDY20tzcfMy+IlOIj48PRphKRZz2ng7K6nZQ\nai9je52hx9UDwKj4DBaOnscsWzET08YRZfHvAEmLxUJiTCKJMYnkJ48ecB+32027o4Pm7hZsCZl+\niSNsEsA1y4pO2Fq32VKw21sCFktMjKf/rrq6ihdeeJYnn3yWxMREbrrpmuP2jY4Oj1kFlRqpmrtb\n2GLfRqm9DNOwG5fbBUBuYranTz+7mILkfCyWE86aHBQWi4WkmESSYhL9do6wSQAjUWNjIxkZGSQm\nJmLMTqqrq+np6Ql2WEqFvbqOeu9N3G3sadqHG08X8NiUfGbZZlBim05uUk6Qoww+TQB+NGnSZBIS\nErnnntuYMaOEyy67kvvv/zkzZ84KdmhKhZ3eMfql9jIOtlQAYMHCxLTxlGQXMyurmMyEjCBHObKE\nzJrAQ1kRLNBdQIEWzuXTsoUuf5Wv29mDvaOW6rYaatrtVLfXcLCl4sgY/ShLFJJRRImtmJm26aTG\npgx7DKH0sxtsRTC9AlBKjThut5um7mYOt9k53G7ncHuN9287DZ2NR7p0esVGxTDLVkyJrZjizKkk\nxiQEKfLQoglAKRU0va35w+12DrcdreRr2u10OruO2z8tNoWi9AnkJNrIScr2/J2Yzaj4dL+P3AlH\nmgCUUn7V25qvabdT3WY/0m1T026nfoDWvDXKSnZCFtmJNnITbZ6/k7LJTswiwaot++Hk1wQgIg8A\nCwA38B1jzBd9PrsXuBFwAl8aY3ybR0EpNazcbjcOtxOny+H924nD5cThdnhe9/7tcuJ0O3Ec2c8x\nwDbvsa4eWstbOVBfecLWfGrf1nyfFv2o+IyIb823dvRQWdtGRW0bNQ3tnDkth/G5Az95PBR+SwAi\nshiYZIxZKCJTgSeBhd7PUoF/BoqMMQ4ReVdEFhhjPvVXPEpFCqfLSW1nPTXe7pTerpXm7pZ+Fbun\nwna6nX6LxWqJJtvbij9a0Xv+1tY8tHc6vBV9KxW1bZ7X9jaa2rqP2c8aHRVaCQBYDrwGYIzZISIZ\nIpJqjGkGur1/kkWkFUgE6v0Yi1Jhp62n/Uif+eEjI2Ls1HbUHVepW7CQEptMTJSVhOh4rBYr0VHR\nWC3RWKOsRFuisUZFEx1lHWBbdJ/9rX22RffbZj1mW2FeHrTHRnxrHqCjy0FlXRuVdk+rvreyb2g5\n/sooMzWOGRMzybclkZ+VRF5WEuNyh38kE/g3AeQCG/q8t3u3NRtjOkXkh8AeoAP4ozHmKz/G4hff\n/OatfPe7/8KUKVOPbPvtbx8mLS2db3zjxmP23bjxS1555UV+8pP/G+gwVQhzupzUddb3qeiPjojp\nnbCsrwRrAgUp+cd1q2QlZBJzinPaDJUtOQV7R2gMlRwuXd1OKus8rfjKIxV9K3XNx1f0GSlxFE8Y\nRV6Wt6K3JZGXmURCXOB+ToH8jTgyFtXbBfRvwGSgGVgtIrOMMZtPdHBGRiJW6+lPm2CzDX8GveKK\ny/j00w9ZtGj+kW3r1q1h1apVx50vPT2RuLgYv8QB/infSBEJZWvtbqOy+TCVLZ4/Fc3VVLYcprrV\njtPVrzVvsZCTlMXkrAnkpeaSl5JDXkoO+ak5pMaljKgpDcL1Z9fV46Spy8mB6hYOVDdz4HALB6pb\nOFzffty+o1LjKJlkY2xuiudPTioFuSkkJwR/XQB/JoBKPC3+XnlA7yTZU4E9xphaABFZC8wFTpgA\nGhqO/4f1lb8e2jjzzHO5557bWbnybgB27txBRkYmGzZs5Ykn7iUmJoaUlBR+9KP/prGxna6uHr/E\nEUoPpZyqUCmby+2ix+Wgy9lFl6Obble357Wz2/PH0eXd1vunC3e0g/31VRxurzlxaz65T2ve26I/\nUWu+uwVqW1oDUVyfhMrPrq+ubidNbV00tXXT1Nrt+butq8/rbprbumls7aL/M7SpiTFMHZdxtEWf\nlUS+LYmk+OMr+o7WTjpaOwNSpsGSsD8TwLvAD4FHRWQOUGmM6f1t2AdMFZEEY0wHcAbw1lBO9sru\nP7OpZuuAn0VHWXC6Tv1B4tnZM7iy6NITfp6RMYq8vHy2by9j2rRiVq/+G+effxEtLS384Ac/IS8v\nnx//+Pt89tknJCb6b0InNXQut4vdjXto6Gw6UkF396msu5w9dPet0Pt+7uqm29l98pMMwIKFzIRR\njE8t8A57zPbcME2ykRKTPKJa86HK6XLR0t7jrcSPrcw9FX3Xkddd3YPfEI+1RpGWHMv0iZnY0uLJ\n71PZpySG1nKQ4McEYIxZLyIbRGQ94ALuFZGVQJMx5lUR+QXwgYg4gPXGmLX+isWfzj//It5//29M\nm1bMxx9/xCOPPMnu3V/x85//BKfTSWVlBXPnztMEMEJ1Obv5rOpLPji0jpr2Wp+OibJEERcdS1x0\nHIkxCaRHpxEXHUusd5vnM8/r2KhY4qze91GxxFmPbsu3ZUJHXMD75sOJ2+2mpqGD/YdbaOxfwbd2\n09zWRUt7D4M1/ywWSE2MJSc9gdTkWNKT4khLjiU1KZa03j/JcaQlxRIfG43FYgnJq5uB+PU3zxjz\nvX6bNvf57FHg0eE615VFl56wte7PH9bixUtZtepJzj//QgoKxpKamsrPfvZjfvGL/2H8+An88pc/\n98t51dA0dDby4aH1fFz5Ge2ODqyWaBbknsHE9HHHV+L9Xlst0cPSMrelpmDvCv1KJJC6e5zsq26h\nvKKJXYea2F3RRGvHwDPsJsRFk5oUx+jMpH4VuqeC763YUxJiiIqKzCstbXoMUWJiEoWFk1i16inO\nP/8iANraWsnJyaWlpYWNGzdQWDgpyFGqXvuaD7D6wFo22bficrtIjknikvHnsWjMQr9MGqaGprG1\ni93ein53RRP7q1uO6c7NTI1j2vhsJualkZkaf6RiT02KJS5G19o4GU0Aw+D88y/iJz/5AT/4wY8B\nuPLKq7nnntspKBjLDTfczJNPPsZdd30ryFFGLqfLyebabXxwcC17mvYDkJeUy9KCRczLKQnYAtxq\ncE6Xiwp7G7sONVHurfBrm47eKI2OsjA2J4Wi/DSKxqRRmJfKqFRdTW8odDroMBDO5RtK2TocHXxc\n+TkfHlpPfWcDANMzp7CsYBGSURT0G6zh/HODk5evvbOH8srmIy38PVXNx9yETU6IoSg/jcL8VIry\n0xg/OnXEtOpD6Wen00GriGJvr2PNoXV8UvUFXc5uYqJiOCd/AUvHnENuUnaww4tIvTdre7tydlc0\nUWlvO+bm7OjMRCaNSaMwP42i/DRyRyUGPUmHO00AKiy43W52N+7lg4Nr2VK7HTdu0uPSuGjccs7O\nP9Ov66qq4/U4nGzbU8eGbVVHKvyW9qM3a2NjopCx6RSN8VT2E/PSRsSDUZFGE4AKaQ6Xgw2HN/PB\noXVHlgEcmzKGZQWLmJM9k+iokdFlEK56HE6q6tqprG07OgVCXTs1De3HPCiVmRrH/KnZR/rvx9iS\nsUbrHEHBpglAhaTW7jbWVX7KR4fW09TdggULJbZilhYsojBtvHYdDLOuHifVx1X0bdgbO457IjYp\n3kphfhrTJmSSNyqBovw0vVk7QmkCUCGluu0wqw+u4/PqDfS4HMRHx7GsYBGLx5xNVsKoYIcX8non\nM+ut6Cu9FX1tY+dxD1MlJ8QwaUw6eVlJ5GUmHnkiNjUpNqwelgpnmgDUiOd2u9lR/xUfHFzH9noD\nQGb8KJYUnM3C0fNIsGrr8lR1dDmO6bqp9E5P3HfYZa+UxBhkbDqjszyzVfat6FVo0wSgRqxuZw/v\nla/jjR3vUd12GIDCtPEsK1jETNt0nWfeR+2dPWzb10B5RROVdW1U1bYNOD1xWlKsZzKzzN6piRMZ\nnZVEagjOcaN8owlAjSgdjk621e6gtHYb2+p20u3sJsoSxbyc2SwtOIdxqQXBDnHEc7vdVNa2saW8\nji3ldew61ISrT0d9enIs08b3reg9LXodhRN5NAGooGvpbmVr7XZK7WWY+l04vKtZ2RIyWTRhHnMz\n5pIelxbkKEe2rh4nO/Y3sKW8jq3ltUda+BZgQl4qMydmMmVcxgmnJ1aRSROACoqGzkY227dRat/K\n7sa9uL23GPOTR1NiK6bENoPRSTlkZ6fqjcQTqGnsYMvuWrbsqWPn/kYcThcAiXFW5k/NZmZhJsUT\nMrWvXp2QJgAVMDXtdkrtZZTay9jffPDI9gmp4yjJLmZWVjG2xMwgRjiyOZwuvjrYeKRrp7rP6lNj\nbMnMLMxkZmEmhfmpREfp/RF1cpoAlN+43W4qWqsotZex2V5GZVs14JlPXzKKKLEVM9M2Xbt3BtHQ\n0sXWPZ4Kf9u++iNz5cTGRFFSlMXMokxmTszUcfbqtGgCUMPK5Xaxr/kgpfatbK4po7azHgBrlJUZ\nWdOYZStmRtZUkmOSghzpyORyudlT2czm8lq2ltdxoOboEo85GQnMmJnJrMIsJhekE2PVVr4aGk0A\nasicLie7Gvew2dvSb+r29NnHRccyN3sWJdkzmDZqMvE6Xn9ArR09bN1Tx9byOrbuqaOt0wGANdrC\n9PEZzCzMYmZhJjmjdD4jNbw0AajT0uPsYWfDLkprythau502h6c/OikmkYWj51FiK0YyinSu/QG4\n3W4q7G2s3lzJJ1sq2VPZfGQ6hYyUOM6Yks3MiZlMHZ9BfKz+F1X+o79dymdOl5NS+1ZK7WWUecfo\nA6THpbE49yxKbMUUpk3QCdgG4HS52H2oiY1f1bJpl/3IE7cWCxTlp3lv4GYxxpak8xipgNEEoHzS\n3N3CE1v/QHnTXgCyEjKZbZvBLFsx41LH6FO5A+jqdlK2t57SXXY2l9cdWbs2Pjaa+VOzOXdOAeNs\niTouXwWNJgB1UnubDvBE2TM0djUx2zaDiyecR15SrrZUB9Dc1k3p7lpKd9WybV89PQ7P2Pz05FiW\nzs5n9qQsZGwGMdYonSxNBZ0mADWo9ZWf84J5FafbxeWFl3De2MVa8fdzuL6dTbtq2bjLTvmhpiOz\nZuZnJVEyKYs5k22My00hSv/d1AijCUANyOFy8Kddb7Cu4lOSrIncWnw9U0dNDnZYI4LL7WZfVQub\ndtnZtKuWyto2wNOfP2lMGiWTbMyenEVOho7aUSObXxOAiDwALADcwHeMMV94t+cDz/bZdSLwPWPM\nc/6MR/mmqauZJ8qeYU/TfvKTR3PXjFsifq79HoeLnQca2LTLcxO3qdVzAzzG6nkga/bkLGYVZenM\nmSqk+C0BiMhiYJIxZqGITAWeBBYCGGMqgCXe/azAGuANf8WifLenaT9PbF1FU3cLZ+SUcMOUFcRG\nR2al1t7Zw5byOjbtqmXrnjo6vU/hJifEcPaMXGZPsjF9/CjiYnXUkwpN/rwCWA68BmCM2SEiGSKS\naoxp7rffSuBlY0xr/y9QgbWu4lNe/Op1XG4XVxZdyrKCRRHX31/f3HmklW8ONOJ0eXr0benxnDsr\nj9mTsigak6Zz7aiw4M8EkAts6PPe7t3WPwHcAVxwsi/LyEjEaj39lpbNlnLax4aCoZSvx9nDkxtf\n5P0960iJTeK7Z91Bcc6UYYxuaPz9s+vocvDRpkO8+9l+vjrQeGR7UUE6C6bnsqB4NGNzU/ySDPX3\nMnSFQ9kCeRP4uP89IrIQ2DnAVcFxGhraT7bLCYX7cLuhlK+xq4nHtz7DvuYDFCTnceeMW8iMyhgx\n/17+/NkdONzCmtJKPt1WTWe3kyiLZ+qF2ZNtlBRlHTPBWm3t8F+g6u9l6Aqlsg2WqPyZACrxtPh7\n5QFV/fa5FHjPjzGoQexu3MsTZc/Q0t3KvJw5XD/lKmLDfOqGrh4nX+yoYU1pBXsqPe2OjJQ4Lpo/\nlkWz8shIiQtyhEoFjj8TwLvAD4FHRWQOUGmM6Z8y5wF/9GMMagBut5u1FZ/wp12e++4rJv0dS8ac\nHdb9/RW1bXy4qYL1ZdW0dzmwADMLM1lSks+MwlHap68ikt8SgDFmvYhsEJH1gAu4V0RWAk3GmFe9\nu40GavwVgzpej7OHP371Kp9WfUlyTBK3F9/I5IzCYIflFz0OJ18aO2s2VbDrUBMAacmxXDp3POfO\nGk1WWkKQI1QquPx6D8AY871+mzb3+3yGP8+vjtXQ2cjjW59hf8tBxqbkc+eMmxkVnxHssIZddX07\na7yt/d75d6ZPGMWSkjxmFWVhjdbWvlKgTwJHjF0N5TxR9gdae9o4M3cu18mVYdXf73C62PiVp7W/\n0zuSJyUxhosXjGXxrDyy9alcpY6jCSDMud1u1hz6mFd2/xmAayZfzrn5C8Omv7+msYOPSitZt6WS\n5nZPa3/K2HSWzM5nzmSbtvaVGoQmgDDW7ezhefMyn1dvJCUmmTtm3ERR+oRghzVkDqeLzbvrWFNa\nwba9niUnk+KtXDCvgMUleYzO1OUmlfKFJoAwVdfRwONlqzjYUsG41ALuLL6JjPj0YIc1JHVNnXy0\nuZKPtlQemYtn0pg0lpTkc8YUGzFDeFBQqUikCSAMfdWwm9+VPUtrTxtnjZ7HNZMvD9mlGZ0uN6W7\na/lwUwVb9tThdkNCnJXlc8ewpCSPfFtysENUKmRpAggjbrebDw6u5dXyt7Bg4Tq5knPyzgzJ/v4e\nh5P3N1SwelMFtY0dAEzMS2VxSR7zp+YQF6OtfaWGShNAmOh2dvPszpf48nApqbEp3DnjJiamjQ92\nWKfM5Xbz2fbDvPLhHuqaO0mIi2bJ7HyWlOQxNif0515RaiTRBBAGalpruX/DIxxqrWRC6jjumHEj\n6XFpwQ7rlO3Y38CLH+xmf3UL1mgLF80fyy1fn05HW1ewQ1MqLGkCCHE763fx1PbnaO1u45y8M1kx\n+TJiokLrx1pR28afPtjNlvI6ABZMy+HKcyeSlZ5AcmKsJgCl/CS0agp1jI01W3hq23NEWaK4Xq7i\n7Pwzgx3SKWls7eK1tXtZu6USt9szfv/qpUVMGJ0a7NCUigiaAELUppqtPLXtOWKjYvi3xd8mk+xg\nh+Szzm4Hb392gHc+P0hXj5O8rCSuXlLIzMLMkLxhrVSo0gQQgkprtvLktmeJibJyb8kdTLEVhsTc\n5E6Xi7Vbqnh97V6a2rpJS4rluuVFnDNztM7GqVQQaAIIMZvtZfyut/KfdQcT08YFO6STcrvdbN5d\nx5/W7Kaqrp24mGguO2cCF84vID5WfwWVChb93xdCNtu38UTZH7BGWfnWrNspTB8f7JBOam9VMy+u\n3o052IjFAotL8rjsnAmkJ+vCK0oFmyaAELG1dju/K/sDVks035p524if06e2sYOXP9rDZ9sPAzCr\nMJMVSwr1yV2lRhBNACGgrHYHT2x9hmhLFN+adRuTMiYGO6QTauvs4c/r9/H+hkM4nG7G5aZwzdIi\npo4Lv3UHlAp1mgBGuG11O3l86yoslijumXUrk0bo6l09DherNx7iz+v30dbpIDM1nqsWT2T+tByi\ndGSPUiOSJoARbFud4bGtq7BYLNwz81YmZxQFO6TjuNxuPt/hmbqhtqmTxDgr1ywtYvncfJ2dU6kR\nThPACLWj7ise2/p7LMDdM29FRo28yt8c8EzdsLeqhegoCxfMK+DSs8aTnBCaM48qFWk0AYxAO+q/\n4tGtTwPwzRkrmTJqUnAD6qeyto2X1pRTursWgPlTs7lycSHZ6brIulKhRBPACLOzfhePbnkaN/DN\nGbcwNXNysEM6oq2zh5fXlPPR5ipcbjeTx6RxzbJJTMzTqRuUCkWaAEaQrxp289stT+N2u7lr5i1M\ny5Rgh3REhb2Vh17eSk1jB7mjErl6SSElk7J06galQpgmgBHiq4ZyfrP5KdxuF3fOuJnpmVOCHdIR\nm3bZeezN7XR1O/nawnFcds4EXWxdqTDg1wQgIg8ACwA38B1jzBd9PisAngdigY3GmLv9GctItqth\nD49sfhKX28WdM26iOGtqsEMCPFM4/PmT/bz20R5irFHcfdl05k/NCXZYSqlh4rdmnIgsBiYZYxYC\ntwMP9tvlfuB+Y8x8wCkiY/0Vy0i2u3Evv9nyJE63izuKb2RG1rRghwRAV7eTR17fxqsf7WFUahz/\ndtNcrfyVCjP+vAJYDrwGYIzZISIZIpJqjGkWkShgEfAN7+f3+jGOEau8cR+/3vw7HC4HdxTfyEzb\n9GCHBEBtUwcPvbyVgzWtTB6TxreumEFqUmyww1JKDbOTJgARmWKM2Xka350LbOjz3u7d1gzYgBbg\nARGZA6w1xvzvwb4sIyMR6xAeLLLZRtZ6sqa2nN9s+R1Ol4N/OOtO5o8pGdL3DVf5yspr+dmqDTS3\ndXPRwvHcdfkMYqzB7e8faT+74RTOZYPwLl84lM2XK4CXRaQB+B3wgjGm/TTPZen3Oh/4FbAP+IuI\nfM0Y85cTHdzQcLqn9fygRtLJzxwGAAAZ6ElEQVR8+Xub9vNw6RN0u3q4bfoNTIgb2nz+w1W+DzZV\n8NzfvgLgpguFpbPzaWxoG/L3DsVI+9kNp3AuG4R3+UKpbIMlqpM27Ywx04G7gQnAGhF5TETm+XDe\nSjwt/l55QJX3dS2w3xhTboxxAu8DI6P/w8/2Nh3g4dLf0e3q4dbp1zM7e0awQ8LhdLHq7Z08844h\nIc7KP11XwtLZ+cEOSynlZz5d2xtjyowx3wf+AZgKvCEiH4nIYI+ovgusAPB281QaY1q83+cA9vQ5\nfi5gTrMMIWNf8wEeLn2CLmcXK6ddx5zsmcEOiea2bv7f85tYU1pJQXYy3195BjJWZ+5UKhL4cg9g\nHLASzw3b7cB/Ae8A84A/AAOuRG6MWS8iG0RkPeAC7hWRlUCTMeZV4O+Bp703hLcCbw65NCPY/uaD\nx1T+c3OG1uc/LDFVt/DwK1uoa+7ijCnZ3H7JVOJidQI3pSKFL/cA1uDp/19mjKnss/1zEfl8sAON\nMd/rt2lzn892A+f4GGdIO9ByiIdKn6DT0cUt067jjNzZwQ6Jz3cc5sm/7KDb4eKKcydy6cJx+lSv\nUhHGly6gWcBXvZW/iNwtIskAxphv+zO4cHCwpYKHNj1Op6OTm6ddy7wgV/4ut5uXPyznt69vIyrK\nwrevmsHXzxqvlb9SEciXK4CngA/7vE8EngGu8EtEYeRgSyUPbXqcDkcnN029hvm5c4IaT0eXg8fe\n2Mbm8jqy0xP49oqZ5GclBTUmpVTw+HIFMMoYc+QpXmPML4F0/4UUHg61VPLQpsdod3Rww9SrOXP0\n3KDGc7i+nZ+s+pLN5XVMH5/Bf9xyhlb+SkU4XxJAnIgcmZxGRObimb9HnUBFaxUPlj5Gm6Od66es\nYOHoM4IaT9neOn78+y+pqmvngnkF/P01s3TRFqWUT11A3wVeF5E0IBrPE703+TWqEFbZWs2Dmx6j\nraed66dcxVl5vjwy4R9ut5t3vzjIix/sJjoqitu/NpWzZ4wOWjxKqZHlpAnAGPMZMFlEMgG3MaZe\nRM7yf2ihp9PRyW+3PEVrTxvfkCs5O2/AEbIB0eNw8vRfDZ9sqyYtOZb7rpxBYV5a0OJRSo08vjwH\nkArcCGR538cBt+J5slf18fKuP1PX2cCF45ZxTv6CoMXR0NLFw69sYW9VCxNGp3LflTPISIkLWjxK\nqZHJly6gF4D9wIXAS8AFwD3+DCoUldXuYH3V54xJzuOSCecFLY7yiiYefnUrTa3dnFWcyy0XCTFD\nmERPKRW+fLkJHO9drGW/MeafgaXANf4NK7S09rTx7M6XsFqiuWXadVijgrPQ2rotVfz8uY00t3Vz\n3fJJ3P61qVr5K6VOyJeaKk5EkoAoEck0xtSJSKG/AwslL5hXae5u4fLCS8hLzj35AcPM6XTx3Htf\n8d6Xh0iKt3L3ZcVMnzAq4HEopUKLLwlgFXAn8ASwQ0TswC6/RhVCvjxcysaaLUxMG8/ysecG/Pyt\nHT08+PinlO6yMzozkf+1YiY5GYkBj0MpFXp8SQCPGmPcACLyPpANlPo1qhDR2NXEC+ZVYqNiuGnq\nNURZArtwSnN7Nz99ZgM1DR2UFGVx59enkRAXnO4npVTo8aW2WI2n3x9jTAVQ4deIQoTb7ebZnS/R\n7ujg2slXkJ2YFdDzu9xunnhzOzUNHVy+uJBLF4wlSufzUUqdAl8SQKmI/AhYD3T3bjTGrPZbVCFg\nfeXnbK8zTB01mUVBGPL51if7Kdtbz8zCTG69dDp1da0Bj0EpFdp8SQC9E9cv6rPNjefKICLVdtTx\n0u43SbAmcMOUFQGfSXPn/gZeXbuHjJQ4bv/aVKKitOWvlDp1vjwJvDQQgYQKl9vFqu0v0u3s5pZp\n15ERH9h58Zraunn0jW1EWSzcc1kxKYk6LZNS6vT48iTwWjwt/mMYYwI/5GUEWH1wLeVNeymxzWBe\nTmDn9ne53Dz2xjaa2rq5ZmkRRWN0agel1OnzpQvoP/q8jgWWARHZ4VzZWs2be94hJSaZ6+SKgHf9\nvPHxXnbsb6CkKIsL5xcE9NxKqfDjSxfQh/02/U1E3vJTPCOW0+Vk1Y4XcLgcXD/9KlJikwN6/m37\n6nnz431kpsZz+6VTdQUvpdSQ+dIFNLHfpgJA/BPOyPX2vvc52FLBgtwzmGmbHtBzN7Z28fgbniUc\n77m8mKR4nctfKTV0vnQBvd/ntRtoBv7TL9GMUPubD/L2/tVkxKWzYvLXA3pup8vFo69vo7m9h2+c\nN4mJeakBPb9SKnz50gU0QUSijDEuABGJMcb0+D+0kaHb2cPvt7+Ay+3ipqnXkGBNCOj5X1u7F3Ow\nkbli47y5YwJ6bqVUeDvp3AUichXwep9Na0Vkhf9CGlne3PM2h9trWDLmbGRUUUDPvXVPHX/5ZD+2\n9HhuvVj7/ZVSw8uXLqB/BC7u8/4C4B08awMMSkQeABbg6Tr6jjHmiz6f7QMOAk7vphu8U02MGLsa\nyvng4DqyE7O4rPDikx8wjOqbO3n8ze1Yoy186/IZJMbrHD9KqeHlS61iMcY09b4xxjSLiOtkB4nI\nYmCSMWahd1H5J4GF/Xa72BgzIoeUdjo6eWbHiwDcPPU6YqMD98CVw+nit29so7Wjh5sumMy43JSA\nnVspFTl8SQBfisgLwBo8XUYXARt8OG458BqAMWaHiGSISKoxpvl0gw2k3uUdLxq3jAlpYwN67lc+\n2sPuQ03Mn5rNktn5AT23Uipy+JIA/hdwA3Amnq6cPwB/8uG4XI5NFHbvtr4J4LciMh5YB/zv3mmn\nB5KRkYh1CKtb2Wy+t6I3Vm5lfdXnjE8fw83zrsAaHbjul8+3V/P2ZwfItyXxjzeeQaKPQz5PpXyh\nRssWusK5fOFQNl9qtkSg2xjzbQARudu77VS7bvrfwfw+8DZQj+dK4SoGua/Q0NB+iqc7ymZLwW5v\n8Wnf1p42fvPZM1gt0Vw/+Woa6jtO+7ynqrapg18+u4EYaxR3fX06bS2dtLV0nvS4UylfqNGyha5w\nLl8olW2wROXLCiar8LTceyUCz/hwXGW/4/KAqt43xphVxpgaY4wDeAuY4cN3+l3v8o5fm3gB+cmj\nA3Zeh9PFb1/fRlungxvOn0xBdmCfNFZKRR5fEsAoY8yDvW+MMb8EfJkC811gBYCIzAEqjTEt3vdp\nIvKOiPTeWV0MlJ1S5H5wdHnHcZw3dnFAz/2nD8rZU9nMwum5LJoZuMSjlIpcviSAOO8oHgBE5Aw8\nk8INyhizHtggIuuBB4F7RWSliFzhHVX0FvCpiHyM5/7ASYeV+tOxyzteG9DlHTcYO3/78iCjMxO5\n+ULR8f5KqYDw5R7Ad4HXRSQNT8KoBW7y5cuNMd/rt2lzn89+BfzKxzj9KpjLO9Y0dvDkWzuIjYni\nW5cXExd7+je6lVLqVJy0mWuM+cwYMxk4A89DYZXAG/4OLJA+rvwsKMs79jhcPPJaGR1dDm66QMi3\nab+/UipwfJkNdAFwK3AtnoRxF/Cyn+MKmNqOOl7e/WcSrPEBX97xhdW72F/dwjkzR3P2DO33V0oF\n1gkTgIj8C7ASSMIzEugM4E/GmD8GJjT/C+byjp/vOMzqjRXk25K44fzJATuvUkr1GuwK4L+AbcC9\nxpgPAETkhA9qhaKjyzsWB3R5x8P17Tz9153ExUR7+v1jtN9fKRV4gyWAAuAWPE/rRgNP48Pon1Bx\n7PKOVwas66e7x8lvXiujs9vJXV+fxujMpICcVyml+jvhTWBjTLUx5ufGGAFuA4qAcSLypohcErAI\n/eCY5R2nBHZ5x+ff38XBmlaWlOSxYHruyQ9QSik/8WmwuzHmI2PMSjxP8/4ZzzQOIeuvQVre8dNt\n1XxYWsnY7GS+cd6kgJ1XKaUGckqznHmf5H3U+yck7W8+yDtBWN6xqq6N379tiI+N5p4riokZwsR2\nSik1HAL3uOsIEKzlHbu8/f5dPU5uvWQqORmJATmvUkoNJqISQO/yjosDvLzjs+9+RYW9jeVzxjBv\nSnbAzquUUoOJmATQd3nHywO4vOO6LVWs21rF+NwUrlkW2DWFlVJqMBGRANp7OoKyvOMheyt/eNeQ\nEGflnsuLibFGxD+3UipERESNtGrTS9R1NnDhuKUBW96xs9vBI6+V0e1wcfvXpmJLD8z9BqWU8lXY\nJ4DdjXtZvXc9Y5LzuHjCeQE5p9vt5pl3DFV17Vwwr4A5k20BOa9SSp2KwC12GyRRliiKRo3n2qIr\nsUYFprhrt1TxybbDTMxLZcWSwoCcUymlTlXYJ4CJaeP46fn/GrD1Ow8cbuEP735FUryVey4rxhod\n9hdZSqkQpbXTMHK73Tz11504nC7uuHQamWnxwQ5JKaVOSBPAMNp1qIn91S3MFRuzigK3qphSSp0O\nTQDD6L0NhwA4/4yCIEeilFInpwlgmNQ3d7LR2BmbncykMWnBDkcppU5KE8AwWb2xApfbzXlnFAR0\nWUmllDpdmgCGQXePkw9LK0hOiOHMaTrXj1IqNPh1GKiIPAAsANzAd4wxXwywz8+AhcaYJf6MxZ8+\n3X6Ytk4Hl541Tqd5VkqFDL9dAYjIYmCSMWYhcDvw4AD7TAPO9VcMgeB2u3nvy4NEWSwsnT0m2OEo\npZTP/NkFtBx4DcAYswPIEJHUfvvcD/y7H2PwO3OgkUP2Ns6YYiMjJS7Y4SillM/8mQByAXuf93bv\nNgBEZCXwIbDPjzH4Xe/Qz/N06KdSKsQEciqII0NjRGQUcCtwHpDvy8EZGYlYh9C/brOlnPaxJ3K4\nvp3SXXaKCtJZMCs/qKN//FG+kULLFrrCuXzhUDZ/JoBK+rT48SwoX+V9vQywAWuBOKBQRB4wxnz3\nRF/W0NB+2oHYbCl+mQvopQ9243LDklmjqa1tHfbv95W/yjcSaNlCVziXL5TKNlii8mcX0LvACgAR\nmQNUeheVxxjzkjFmmjFmAXAFsHGwyn8k6up28lFpJamJMcybkhPscJRS6pT5LQEYY9YDG0RkPZ4R\nQPeKyEoRucJf5wykT7ZV097lYMnsfF3pSykVkvx6D8AY871+mzYPsM8+YIk/4xhubreb9zYcIjrK\nwpLZPt3CUEqpEUebrqdhx/4GKmvbmDc1m/RkHfqplApNmgBOw3tfeod+ztWhn0qp0KUJ4BTVNLSz\neXctE/NSmZjX/7k2pZQKHZoATtHqjRW4gfPm6rQPSqnQpgngFHR2O1i7pZK05FjOmKKzfiqlQpsm\ngFOwvqyaji4nS2fn62LvSqmQp7WYj1xuN+99eQhrtIXFJTr0UykV+jQB+Gj73nqq69uZPzWHtKTY\nYIejlFJDpgnAR0dn/dSbv0qp8KAJwAeH69vZUl5H0Zg0xufq0E+lVHjQBOCD93tb/zr0UykVRjQB\nnERHl4N1W6vISIljzmRbsMNRSqlhowngJNZtraKzW4d+KqXCj9Zog3C53by/4RDW6CjOLckLdjhK\nKTWsNAEMomxPHTUNHSyYnkNqog79VEqFF00Agzg666fe/FVKhR9NACdQVddG2d56JhekMzYn9Bd/\nVkqp/jQBnMB7OvRTKRXmNAEMoL2zh/Vbq8lMjWP25Kxgh6OUUn6hCWAA67ZU0dXjZNmcMURH6T+R\nUio8ae3Wj8vlWfA91hrFolk69FMpFb40AfSzubyW2qZOFkzPJTkhJtjhKKWU32gC6EeHfiqlIoXV\nn18uIg8ACwA38B1jzBd9PrsTuB1wApuBe40xbn/GczIV9lZ27G9gyth0xmQnBzMUpZTyO79dAYjI\nYmCSMWYhnor+wT6fJQLXAYuMMWcDU4CF/orFV72zfp5/RkGQI1FKKf/zZxfQcuA1AGPMDiBDRFK9\n79uNMcuNMT3eZJAGVPsxlpNq7ehhfVk1WWnxzCrSoZ9KqfDnzy6gXGBDn/d277bm3g0i8j3gO8D/\nGGP2DPZlGRmJWK3Rpx2MzTb407xrP9hFt8PF351bSE5O6C36crLyhTItW+gK5/KFQ9n8eg+gH0v/\nDcaY/xaRXwFvicg6Y8zHJzq4oaH9tE9ss6Vgt7ec8HOny8UbH5UTGxPF7MJRg+47Ep2sfKFMyxa6\nwrl8oVS2wRKVP7uAKvG0+HvlAVUAIjJKRM4FMMZ0AH8FzvZjLIMq3VVHXXMXZxWPJileh34qpSKD\nPxPAu8AKABGZA1QaY3pTZgzwtIj0DrWZDxg/xjKo9748CMByHfqplIogfusCMsasF5ENIrIecAH3\nishKoMkY86qI/Aj4QEQceIaBvuGvWAZz4HAL5mAj08dnkJ+VFIwQlFIqKPx6D8AY871+mzb3+exp\n4Gl/nt8XvUM/l+vQT6VUhInoJ4Fb2rv5dPthstMTmFmYGexwlFIqoCI6AXy0uZIeh4tlc8cQZTlu\nkJJSSoW1iE0ADqeL1RsriIuN5pwZo4MdjlJKBVzEJoBNu2ppaOninOLRJMYH8nEIpZQaGSI2AfQO\n/Vw2Nz/IkSilVHBEZALYX93CrkNNFE8cxehMHfqplIpMEZkA3tvgaf2fN1eHfiqlIlfEJYDmtm4+\n236YnFGJFE8cFexwlFIqaCIuAXxYWoHD6eY8HfqplIpwEZUAHE4XqzdVEB8bzVnFuSc/QCmlwlhE\nJYANxk5TazfnzBxNQpwO/VRKRbaISgDvfXkQCzrrp1JKQQQlgD2VzZRXNjOjMJOcjMRgh6OUUkEX\nMQngfe/QT13wXSmlPCIiATQ0d/L5jhpGZyYybXxGsMNRSqkRISISwNuf7MPp8gz9tOjQT6WUAiIg\nAfQ4XLz1yT4S4qws1KGfSil1RNgngC3ltTS2dLFo5mjiY3Xop1JK9Qr7BJCTkciZ03O56MyxwQ5F\nKaVGlLBPAGOyk/mP284kPTku2KEopdSIEvYJQCml1MA0ASilVITSBKCUUhHKr8NiROQBYAHgBr5j\njPmiz2dLgZ8BTsAAdxhjXP6MRyml1FF+uwIQkcXAJGPMQuB24MF+uzwGrDDGnA2kABf5KxallFLH\n82cX0HLgNQBjzA4gQ0RS+3w+1xhzyPvaDmT6MRallFL9+LMLKBfY0Oe93butGcAY0wwgIqOBC4D/\nM9iXZWQkYrVGn3YwNlvKaR8bCsK5fFq20BXO5QuHsgXy0djjJuERkWzgTeBbxpi6wQ5uaGg/7RPb\nbCnY7S2nffxIF87l07KFrnAuXyiVbbBE5c8EUImnxd8rD6jqfePtDvor8O/GmHdP9mU2W8qQZnEL\nh2w9mHAun5YtdIVz+cKhbP68B/AusAJAROYAlcaYvinzfuABY8zbfoxBKaXUCVjcbrffvlxE/hs4\nF3AB9wKzgSbgHaAB+KTP7s8ZYx7zWzBKKaWO4dcEoJRSauTSJ4GVUipCaQJQSqkIpQlAKaUilCYA\npZSKUGG/RuJgE9KFAxH5v8AiPD/LnxljXglySMNKRBKAMuDHxpingxzOsBGRG4B/ARzA940xfwly\nSMNCRJKBVUAGEAf80BjzTnCjGjoRKQZexzN0/WERKQCeAaLxPN90kzGmK5gxno6wvgLwYUK6kOad\nUbXYW76LgP8Jckj+8B9AfbCDGE4ikgn8ADgHuBS4LLgRDauVgDHGLMXzHNCvghvO0IlIEvAQ8H6f\nzT8Cfm2MWQTsBm4LRmxDFdYJgJNPSBfqPgKu9r5uBJJE5PQnTBphRGQKMA0Ii9ZxH+cB7xljWowx\nVcaYu4Id0DCq5ejEjhne96GuC7gEz+wGvZYAb3hfv4nnZxpywj0B5OKZhK5X74R0YcEY4zTGtHnf\n3g68ZYxxBjOmYXY/8A/BDsIPxgOJIvKGiKwVkeXBDmi4GGP+CIwVkd14Gij/FOSQhswY4zDGdPTb\nnNSny6cGGB3gsIZFuCeA/oY0n9BIJSKX4UkA9wU7luEiIjcDnxhj9gY7Fj+w4GklX4mny+QpEQmL\n300RuRE4YIwpApYBDwc5pEAI2Z9duCeAQSekCwciciHw78DFxpimYMczjL4GXCYinwJ3AP9HRELy\nMnsAh4H13pZlOdAC2IIc03A5G89ULxhjNgN54dQt2Uerd4ACQD7Hdg+FjHBPACebkC6kiUga8Avg\nUmNMWN0oNcZca4yZZ4xZADyBZxTQe8GOa5i8CywTkSjvDeFkwqOvHDw3RM8EEJFxQGuYdUv2eg+4\nyvv6KiAkJ7UM62Ggxpj1IrJBRNZzdEK6cHItkAW8KCK92242xhwIXkjqZIwxFSLyEvCpd9O3w2g9\n7EeBJ0XkQzz1y91BjmfIRGQunvtR44EeEVkB3AA8LSLfBPYDvw9ehKdPJ4NTSqkIFe5dQEoppU5A\nE4BSSkUoTQBKKRWhNAEopVSE0gSglFIRKqyHgSp1KkRkPGA4dq1qgL8YY34xDN+/BPiJMeacoX6X\nUsNBE4BSx7IbY5YEOwilAkETgFI+EBEH8GNgKZ4nd1caY8pE5Ew8Dwn14Flz4j5jzHYRmQQ8jqeb\ntRO41ftV0SLyCDAbzyyTXzPGtAa2NEp56D0ApXwTDZR5rw4ewTMfPHgWP/mud/77XwK/9m7/LfAL\nY8y5wJMcnbZ7KvCf3ikueoALAxO+UsfTKwCljmUTkTX9tv2L9+/ela0+Bv5ZRNKBnD6rzK0B/uh9\nfab3fe8Uyb33AHYaYw579zkEpA9v+Er5ThOAUsca8B6Ad66l3itmC57unv7zqFj6bHMz8BW2Y4Bj\nlAoK7QJSynfLvH+fA2zxTr9d5b0PAJ5VoXoneFuPZ5lORORaEflpQCNVygd6BaDUsQbqAupdlGa2\niNyDZ6nDm73bbgZ+KSJOwAnc491+H/CYiNyLp6//NqDQn4Erdap0NlClfCAibiDGGNO/C0epkKVd\nQEopFaH0CkAppSKUXgEopVSE0gSglFIRShOAUkpFKE0ASikVoTQBKKVUhPr/iIhX3napwnwAAAAA\nSUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEVCAYAAAAPRfkLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xd8XNWZ+P/PNLVRG3VLliy5Hbni\nggED7tgYML0lIWEJJBAWCN/sL7vf5JtsNtlsQhI2IT1ACCH0jiFUGxdssI0rxjbWsS3LlizJlqze\n6/z+mCshC0nWSLoa3dHzfr380swtc5+HO+jRPefce2xerxchhBACwB7oAIQQQowcUhSEEEJ0kqIg\nhBCikxQFIYQQnaQoCCGE6CRFQQghRCcpCmJUUEp5lVIv97D8MaWU3+Oyjf1+fJZtblNKvd/D8kyl\nVKu/xxRiOEhREKPJTKVUdMcbpVQIMC+A8Qgx4jgDHYAQw2gDcC3wD+P9pcAOYGbHBkqpG4H/wvf/\nRhHwTa11rlIqHngOmAR8BtQDJ4x9pgJ/AcYATcDXtdY7BxKgUioOeBg4B2gD/qG1/qWx7n+AGwGb\nceyvaq2Lels+kOMLIVcKYjR5EfhKl/dfBl7qeKOUygD+Clyjtc4G3gIeMVb/X6BUa50F3IOvoKCU\nsgOrgSe11pOBbwGvK6UG+gfXz4EKrbUCLgb+VSl1sVJqGnATMN04zmvAJb0tH+CxhZCiIEaVjcA0\npVSSUioCuBBY12X9cmCD1vqI8f4xYInxC34hvqKC1voY8IGxTTaQBDxurPsIKDU+eyCuAP5sfFY5\n8CqwAqgEEoFblFIerfUftNZP9rFciAGRoiBGDa11G75fsjcBq4D3tNZdO3wTgYou21fha5JJAOKA\nqi7bdmwXC0QAB5VSOUqpHHxFIn6AYZ4Rg/E6SWtdCFyHr5koXyn1llIqvbflAzy2ENKnIEad5/E1\n0ZRi/EXexSlgfscbpZQHaAdO4/vlHNNl20TgKL5+h2qjuekMSqnbBhDfKXwFJd94H28sQ2u9Adig\nlHID/wv8Arilt+UDOLYQcqUgRp2t+DqEp/N5E1CHtcBCpdR44/23gDXG1cRWfJ3UKKUm4GvvBzgO\nnFBK3WCsS1BKPWf8gh6IN4E7Oz4L31XAW0qpFUqpPyml7FrrOmAv4O1t+QCPLYRcKYjRRWvtVUq9\nBri11u3d1p1QSn0DX0exC8jD+AUNPAA8r5TKAw7ia4bq+LwvAQ8bo4Dagd9oreuUUn2F4jCamrq6\nDPgh8BdjXTvwC631dqVUGL6O8UNKqSagBLgD35VKT8uFGBCbzKcghBCigzQfCSGE6CRFQQghRCcp\nCkIIITpJURBCCNHJ8qOPSktrBtxT7vFEUFFRP5ThjBjBnBsEd36Sm3VZKb/ExChbT8tH9ZWC0+kI\ndAimCebcILjzk9ysKxjyG9VFQQghxJmkKAghhOgkRUEIIUQnKQpCCCE6SVEQQgjRSYqCEEKITlIU\nhBBCdLL8zWsDtUuX4Myr4JwsT6BDEUKIEWPUFoUNewrJOV7BA3fNJzE2PNDhCCFGmT/84SG0Pkh5\neRmNjY2kpqYRHR3Dz3/+YJ/7vf32P3G7I1m0aIkpcZlaFJRSvwIWGMd5QGv9apd1x4ACoM1YdIvW\nulAp9RBwAb7Zo+7XWu8wI7aLpo/hs2MVrNt1gi8tm2TGIYQQolf33fcdwPdL/ujRXO699//0a7/L\nL7/SzLDMKwpKqSXAdK31fKVUPLAHY7aqLi7TWtd22WcRMMnYZwrwOF3mzB1K86Yk8cqmXDbtLeLq\ni7MIDx21F01CiBFi9+6dPP/809TX13Pvvd9hz55dbNy4jvb2dubPv4jbb7+Tv/3tEWJjY8nKmsCr\nr76IzWbn+PE8Fi9exu2333n2g5yFmb8JNwHbjdeVgFsp5dBat/WxzzJgNYDW+qBSyqOUitZaVw91\ncE6HnVUXj+fJtw+yeW8RK87LGOpDCCEs4sX1R9iRUzLoz3E4bLS1+Z7ROS87iZuWTvT7M3Jzj/Dc\nc68SEhLCnj27+POfH8Nut3PTTVdz881fOWPbzz47wLPPvkJ7ezs33njlyC4Kxi//OuPtHcDbPRSE\nh5VSmcCHwPeBFGBXl/WlxrJei4LHEzHgh1CtnB/K82sPsX5PIV9aOQWHI7gGYyUmRgU6BFMFc36S\n2/AKjwjB4ejxoaF+6/ic8IiQfuUaFRVGhLFtbGwEU6dOIS0tHoCEhBi+8527cTqdVFVV4nS24XaH\nEhkZRmxsBDNmTCc9PREAm802JP9tTW8zUUpdja8orOi26kfAu0A5vquD63vY/axnaTCPqU1MjOKi\n6Sls2FPImi15nJudNODPGmkSE6MoLa0JdBimCeb8JLfhd+UFGVx5weBbC7rn159ca2oaqa9vprS0\nhsrKerxeG6WlNZw8Wczf/vY4jz/+DBEREXztazdRXl5HXV0TLlcjlZX1tLV5O4/h9Xr9+m/bWwEx\n9U9jpdSlwA/w9R1UdV2ntX5Sa12itW4F3gZmAEX4rgw6pALFZsZ4ybljAXhvR76ZhxFCCL9UVlbi\n8XiIiIhA6xxOnjxJS0uL6cc1rSgopWKAB4FVWuvy7uuUUu8ppUKMRYuA/cAa4AZjmzlAkdba1D8r\nxsS7OWdCPLmF1eQWVp19ByGEGAaTJk0mPDyCu+++nXXr1nD11dfx61//0vTj2rzeAU9c1iel1J3A\nj4FDXRavB/ZprV9TSt0P/AvQgG9k0n1aa69S6hfAQqAduEdrvbev4wxm5rWOS72Dx8p58PlPmJed\nxN3XTB/ox40oI/UyfagEc36Sm3VZKb/eZl4zs6P5UeDRPtb/DvhdD8u/Z1ZMvcke5yE9KZKduoTT\nVQ0kxMjNbEKI0Sm4htsMkM1mY8W8dLxeWLfrRKDDEUKIgJGiYDhvSjIx7hA27S2ioak10OEIIURA\nSFEwuJx2ls5Jo6GpjQ8/NXXAkxBCjFhSFLpYPDsNl9PO2p0FtLeb0wEvhBAjmRSFLqIiQrhwegqn\nqxrZc7g00OEIIcSwk6LQzfJz0wF4b0dBgCMRQgSzu+76Ojk5B89Y9vDDf+S5557+wra7d+/khz/8\nj2GJS4pCN6kJbmaMj+fIiSqOFg35c/iEEAKA5csvZf36tWcs27hxPZdc0v2JQMNLikIPVpznu1pY\nI4++EEKYZNmyFWzatKHzfU7OQRITEzl2LI+77vo69957J9///v83LI+26EomEejB1HEexia62ZlT\nSvmSRuKiwwIdkhDCRK8eeZM9JfsG/TkOu402Y5DK7KQZXDdxVa/bejxxpKam8dln+5k6dTrr169l\n+fKV1NTU8F//9T+kpqbx05/+iI8/3kpERMSgY+svuVLogc1mY/m8dNq9Xt6Xm9mEECZZvnwl69b5\nmpA++mgTixcvIzY2ll/+8n+499472bNnF9XVw/tMNrlS6MUFU5N5ZWMuH3xSxFUXZRIWIv+phAhW\n101c1edf9f3l77OPFi1awpNPPs7y5ZeSnp5BdHQ0DzzwUx588LdkZmbxm9+Y/wC87uRKoRcup4Ol\nc8bS0NQqN7MJIUwREeFmwoRJPPnk31m+fCUAdXW1JCenUFNTw+7du4a9T0GKQh8Wz07D6bDz/s4T\ncjObEMIUy5evZMeOj7n44oUAXHfdjdx99x386lc/45ZbbuXpp5+grOz0sMVj2qOzh8tQPDq7L0+8\nc5BNe4u597oZzJmcONBDDTsrPcJ3III5P8nNuqyUX2+PzpYrhbPouJltjdzMJoQYBaQonEVaYiTT\ns+I4VFDJsZNyM5sQIriZOqRGKfUrYIFxnAe01q92WbcEeABoAzTwDXwzrr0EHDA226e1vs/MGPtj\nxXnp7M8rZ82OAu68clqgwxFCCNOYOUfzEmC61no+sBL4bbdNHgVu0FpfBEQZ2wB8oLVebPwLeEEA\nmJYZR1qCmx0HS6ioaQp0OEIIYRozm482ATcarysBt1LK0WX9XK11x51hpUC8ibEMSsfNbG3tXpmZ\nTQgR1IZl9JFS6k5ggdb6az2sGwNsBs4HZgB/Bo4AccBPtNZru+/TVWtrm9fpdPS1yZBobmnj9v9Z\nQ1ubl7//5wrCQuVmNiGEpfU4+sj032xKqauBO4AvPPpPKZUE/BP4V611mVLqMPAT4EVgPLBBKTVR\na93c2+dXVNQPODa/7z48J5U3PjrG6xsPs3TO2AEfdzhYaWjcQARzfpKbdVkpv8TEqB6Xmzr6SCl1\nKfAD4DKtdVW3ddHAO8APtdZrALTWhVrrF7TWXq11LnASSDMzRn8smTMWp8PG2h0FtFv8/g4hhOiJ\nmR3NMcCDwCqtdXkPm/waeEhr/W6XfW5RSn3XeJ0CJAOFZsXorxh3CBdMS+FURQOfHikLdDhCCDHk\nzGw+uhlIAF5USnUsWw/sA94DbgUmKaW+Yax7FngOeNZocgoB7u6r6SgQVpybzoefFrNmRz6zJiUE\nOhwhhBhSphUFrfWj+Iad9ia0l+VXmhDOkBmbFMm0TA8HjlVw/GQN41J6bpcTQggrkjuaB2D5vAxA\nHn0hhAg+UhQGYPr4OMbER7D94Cm5mU0IEVSkKAyAvcvNbOt3y81sQojgIUVhgC6clkJkuIuNewpp\namkLdDhCCDEkpCgMUIjLweLZadQ1trJl/8lAhyOEEENCisIgLJuTJjezCSGCihSFQYiJDOX8Kcmc\nLK9nX67czCaEsD4pCoO0fJ7MzCaECB5SFAYpIzmKKeM8HDxeQf4pazwISwgheiNFYQisMK4W1u6U\nqwUhhLVJURgCMybEkxIXwcefnaKqVm5mE0JYlxSFIdBxM1trm5f1u0fMQ12FEMJvUhSGyIXTU3CH\nOdmwp5BmuZlNCGFRUhSGSKhxM1ttQwtbD8jNbEIIa5KiMISWzhmLw25jzY4ChmPuayGEGGpSFIaQ\nJyqU86YkU1xWz/68niabE0KIkc3MmddQSv0KWGAc5wGt9atd1l0C/BxoA97WWv/UWP4QcAHgBe7X\nWu8wM8ahtmJeOlsPnGTN9nxmjI8PdDhCCOEXM+doXgJM11rPB1YCv+22ye+B64GLgBVKqalKqUXA\nJGOfO4xtLGVcShTZGbEcOFbBidLaQIcjhBB+MbP5aBNwo/G6EnArpRwASqnxQLnWukBr3Q68DSwz\n/q0G0FofBDxKqWgTYzSFPPpCCGFVZs7R3AbUGW/vwNdE1DFWMwUo7bJ5CTABSAB2dVleamxb3dtx\nPJ4InE7HgONMTBz6OZYviY/k5Q+O8vFnp7jzupl4osKG/Bj9YUZuI0kw5ye5WZfV8zO1TwFAKXU1\nvqKwoo/NbH4u71RRUT+QsADfySstNed5RUtnp/HM2kO8vFZzzYLxphyjL2bmNhIEc36Sm3VZKb/e\nipepo4+UUpcCPwAu01pXdVlVhO8KoEOasaz78lSg2MwYzXLxjDGdN7O1tMrNbEIIazCzozkGeBBY\npbU+Y3ym1voYEK2UylRKOYFVwBrj3w3G/nOAIq21NcpuN6EhDhbOSqWmvoWtB04FOhwhhOgXM5uP\nbsbXR/CiUqpj2Xpgn9b6NeBu4Dlj+Qta60PAIaXULqXUFqAduMfE+Ey3bM5Y1mwvYO2OAhbMHIPN\ndtbWMCGECCgzO5ofBR7tY/0mYH4Py79nVkzDLS46jHlTkth24BQHjpUzPUvuWxBCjGxyR7PJOuZa\nWLNdhqcKIUa+UVsUthbv5J8575t+nMyUaCanx7I/r5xCuZlNCDHCjdqi8EnJPp7a+wqHKnJNP1bH\n1cIrHxyVB+UJIUa0UVsULs+6BICXD79BW7u5Q0ZnTUpApcfyyZHTfLC3yNRjCSHEYIzaojAuOp3F\nmfMprC3mo6Ltph7LbrPxzSun4g5z8vz7hykuqzv7TkIIEQCjtigAfGXm1YQ5Qnnz6HvUtQz8zuj+\niIsO419WZtPc2s4jbxygpbXd1OMJIcRAjOqiEBsew8rMZdS11vNW3lrTj3dudhIXzxxD/qlaXtt0\n1PTjCSGEv0Z1UQBYkn4xSeEJbC7cSlGt+dNofuWSSSR7wnl3ez4HjslEPEKIkWXUFwWn3cn1k66k\n3dvOy4ffMH10UFiIkzuvmobDbuOxNz+jpr7Z1OMJIYQ/Rn1RAJgWn83UOIWuOMLe0wdMP17WmGiu\nWZBFVW0zT7yTI8NUhRAjhhQFwGazcf2kK7Hb7Lx6+E1a2lpMP+Zl548jOyOWPYdP88EnMkxVCDEy\nSFEwpLiTWDz2Isoay1lXsNn049ntNr6xyhimuu4wRadlmKoQIvCkKHRxedYlRLkiee/4eiqbqs6+\nwyB1Hab6qAxTFUKMAFIUugh3hnPVhJU0tzWz+sjbw3LMc7OTWDBzDPkltby6yfxHbgghRF+kKHRz\nwZhzSY9KY8epPRytOjYsx/yyMUz1ve0FHMiTYapCiMCRotCN3WbnxklXA/DSoddp95rfpHPGMNW3\nZJiqECJwzJx5DaXUdOB14CGt9R+7LE8Dnumy6Xjge0AI8FOgox1lrdb6Z2bG2JMJsZmcmzyLnac+\nYVvxLi5MnWf6MbPGRHPtwvG8vDGXv7+dw33Xz5CZ2oQQw860oqCUcgN/ANZ1X6e1LgQWG9s5gY3A\nG/jmZ35Ba/1ds+Lqr2smXM6npQd4I/cdZidNJ9wZbvoxV56fwf6jZXxy5DQbPyliyew0048phBBd\nmdl81ARcDpxtEP5twCta6xE1A40nLJZLM5dS01LLO3lfqGumsNs+H6b6ggxTFUIEgM3su2mVUj8G\nTndtPuq2fhuwQmtdrZS6DbgHKANcwHe11nv6+vzW1jav0+kY2qANza3NfOfd/6a8voJfr/xPUqNT\nTDlOd1s+LeKBf+wgKzWaX9+/EJdJ+QkhRrUe26dN7VM4G6XUfCBHa11tLNoGlGqt3zLWPQnM6Osz\nKioG/sjrxMQoSktr+tzmmqzL+ev+p/jr9hf413NuH/Cx/DFpTBQLzxnDpr3FPPzyXr60bJLfn9Gf\n3KwsmPOT3KzLSvklJkb1uDzQo49WAZ0TJWutc7TWbxmvtwKJSqmA/pl8TuJ0JnsmcqAsh/2nDw7b\ncb+8bDLJcRGs2VHA/ryyYTuuEGJ0C3RRmAfs7XijlPoPpdSXjdfT8V01mDtX5lnYbDZunHQVdpud\nV478k9b21mE5bmiIg7uumorDbuNvbx6kWoapCiGGgWlFQSk1Vym1EV9H8v1KqY1KqX9TSl3bZbMx\nQEmX988CdyqlPgAeAe4wKz5/pEamsCDtAkrqT7PxxEfDdtzMlGiuWzieqrpmnnhbnqYqhDCfaX0K\nWutdGMNO+9hmRrf3J4AlZsU0GFdkrWDnyU94J+99zkuZQ3RIz+1xQ+3S8zPYn1fuG6a6p5Alc8YO\ny3GFEKNToJuPLMPtimDV+BU0tjXxRu67w3bcrsNUn19/hEIZpiqEMJEUBT9clHo+qe4UthXv5Hh1\nwbAd1xMVym2XTaFFnqYqhDCZFAU/OOwObpx8FV68vHTI/Kk7u5qrEll4TioFJbW88oE8TVUIYQ4p\nCn6a7JnIrMQZ5FUfZ8epPu+rG3JfXjaJFBmmKoQwkRSFAbhu4hW47E5WH3mbxtamYTuub5jqNBmm\nKoQwjRSFAYgPj+OSjEVUNVez5viGYT32uJQorlvkG6b697cOyjBVIcSQ6ldRMO45WGW8/plSap1S\naoG5oY1sy8ctITY0hnUFmzjdMLxNOZeel8GUcR725paxYU/hsB5bCBHc+nul8HtAG4VgHnAf8BPT\norKAUEcI1068gtb2Vl49/OawHvuMp6nKMFUhxBDqb1Fo1FofBq4CHtVafwaM+nGRc5POYUJMJntP\nHyCn/PCwHtsTFcrXL5dhqkKIodXfouBWSt0IXAusUUrFAR7zwrIGm83GjZOvxoaNlw+/QVv78D6m\nac7kRBbNkmGqQoih09+i8H3gFuD/GY+5/jbwG9OispD0qDQuTJ1Hcd0pNhduG/bjf2mpDFMVQgyd\nfhUFrfUG4Fat9YtKqWR8U2w+Z2pkFnLl+JWEO8N4M28Ntc3D274vw1SFEEOpv6OP/gDcaDQbbQHu\nBf5iZmBWEhUSyeVZy2lobeDNvDXDfvxxKVFcv2iCDFMVQgxaf5uPZmut/wbcBDyhtb4ZmGheWNaz\nKO1CkiOS+LBwGydqzjYt9dBbcV46UzNlmKoQYnD6WxQ65vJcBfzTeB069OFYl8Pu4IZJV+LFy8uH\nh/e5SOAbpnrHFVOJDHfxwvojHD9ZffadhBCim/4WhUNKqc+AKK31J0qpW4Hys+2klJqulMpVSt3b\nw7pjSqnNxuQ7G5VSacbyh5RSW5VSW5RS8/zKJsCmxitmJEzhcOVR9pTuG/bje6JC+fpl2bS0tvO/\nT++iqTmgk9YJISyov0XhG8BXgOXG+wPArX3toJRyA3/A1yndm8u01ouNf4VKqUXAJK31fHyzrv2+\nn/GNGNdNvBKnzcGrh9+kua1l2I8/e3Iii2encay4ml89t5uqOul4FkL0X3+LQjhwJfCyUup1YAVw\ntifBNQGXA/40sC8DVgNorQ8CHqVUtB/7B1xSRAJL0hdQ0VTJ+/kbAxLDVy6ZxLJ56eQV1/CzJ3dS\nXCZ3PAsh+qe/03H+FTiBb95kG3CJseyrve2gtW4FWpVSfX3uw0qpTOBDfPdCpAC7uqwvNZb12kDu\n8UTgdDr6lURPEhOHflrNr8ZezY6S3azN38gV0xaT4I4b8mOczf03zybZE8GzazS/eGY3P/j6+Uwb\nHz/scZjJjHM3Ukhu1mX1/PpbFJK11l/u8v5NpdTGQR77R8C7+PomVgPX97CNrYdlZ6ioqB9wAImJ\nUZSW1gx4/75cmbWSpw6+yN+2v8jt028x5Rh9SUyM4pI5aYQ57fzj3Rx++PAWvnnlVOZlJw17LGYw\n89wFmuRmXVbKr7fi5c9jLiI63hj9BWGDCUhr/aTWusS4ongbmIGvqSmly2apQPFgjhMo56XMYVx0\nOrtK9nK44mjA4rh45hjuv3EmToeNv6zez7sf58t9DEKIXvW3KDwC5CilXlVKvQp8Bvx5oAdVSsUo\npd5TSoUYixYB+4E1wA3GNnOAIq21NcpuN3abnRsnXQ3Ay4ffoN0buAfWTc+K53u3zMETFcqLG47w\n7NrDtLdLYRBCfFF/H3PxOHAR8A/gCeBCYGpf+xhzMGwEbgPuN4ad/ptS6lqtdRW+q4NtSqmP8PUd\nvKy13gLsUkptwTfy6J4BZTVCZMVkcH7KXE7UFrGlaHtAY8lIjuIHX5vL2EQ363af4E+v7aOpRYas\nCiHOZBtoU4JSar3WeukQx+O30tKaAf/JOxztf1VN1fxk269w2V381wX/ToQr4uw7DYHecqtvbOVP\nr+3j4PEKssZEc/8NM4l2h/TwCSObldpu/SW5WZeV8ktMjOqxz3Yw03GetRNYQExoNCszl1HbUsez\n+tWANiMBRIQ5+c5N53DR9BTyiqv52VM7OVk+8M56IURwGUxRkEbpflqSvoAJMZnsKfmUpw++FPDC\n4HTYuf2KKVx1USallY387MmdHD5RGdCYhBAjQ59DUpVSBfT8y98GJJgSURBy2Z3cfc7t/PGTx/j4\n5C4cNgdfzr4Ou20wNXlwbDYb1ywYT3x0GP94V/Pgc59w55VTOTdIhqwKIQbmbPcpXDwsUYwC4c4w\n7jnnDn7/yaNsKd6Ow+7g5snXYLMFthVuwTmpeKJC+dPq/fxl9X5uWjqRFfPSAx6XECIw+iwKWuvj\nwxXIaBDhCue+Wd/kd3seYXPhVpw2B9dPujLgv4Cnj4/n+7fM4bcv7eWF9Uc4XdXIl5dNwm6XwiDE\naBO49otRyu2K4L5Z3yTFncyGEx/yeu47I+JmsozkKH5467mkJbpZt0uGrAoxWklRCICokEi+PetO\nkiISWJu/kbcCMFtbT+Kiw/j+LXOYMs7DnsOnefC5PTK9pxCjjBSFAIkJjeL+2XeREB7PO8fW8U5e\nX08YHz4RYS6+c9M5zJ+WwtGian7+5C4ZsirEKCJFIYBiQ2O4f/adxId5eDPvPdYe3xjokADfkNVv\nrJrClRdmUlLZwM+f2sWRE1WBDksIMQykKARYXJiHb8++i9jQGFbnvs36gs2BDgnwDVm9duF4brss\nm/rGVh58fg87c0oCHZYQwmRSFEaAhPA47p99FzEhUbxy+J9sOrEl0CF1WnhOKvffOBO73feU1TU7\nCgIdkhDCRFIURoikiAS+PfsuolyRvHBoNR8VfRzokDrNGB/P974yh+jIEJ5fd5hn3z8kT1kVIkhJ\nURhBUtxJfHv2nbhdETyX8yofF+86+07DZFxKFD/82rmkJbh5f+cJ/rx6P80yZFWIoCNFYYRJjUzh\nvll3Eu4M46mDL7Lz1CeBDqlTfEwY3//qHLIzYtl9qFSGrAoRhKQojEDpUancO+sbhDpC+cdnz7On\nZF+gQ+oUEebi326exfxpyeQaQ1ZPyZBVIYKGFIURalx0OvfOugOX3cnjB57h09IDgQ6pk2/I6lRW\nXTiOksoGfvbULnnKqhBBYsCT7PSHUmo68DrwkNb6j93WLQEeANoADXwDWAi8BHT8Btyntb6vr2OM\n9El2ButIZR5/+uQx2rzt3DXzX5gWn92v/YYrtw8+KeSp9w7h9Xq5cEYK1y4YT1z0oKbv7hcrnLuB\nktysy0r5mTHJTp+UUm7gD0Bvt+o+Ctygtb4IiAJWGss/0FovNv71WRBGg4mxWdx9ztex22w8uu9J\ncsoPBzqkMyyalcZ3vzSLtEQ3H+07yfcf3cbLG3Opb2wNdGhCiAEws/moCbgcKOpl/Vyt9QnjdSkQ\nb2IsljbZM5G7ZtwGXi8Pf/oEhytyAx3SGbLHefjx18/j9sunEBnu4u1tx/neI1tZu6OA1rbATigk\nhPCPqc1HAEqpHwOnuzcfdVk/BtgMnA/MAP4MHAHigJ9ordf29fmtrW1ep9MxpDGPVLuL9vHgR4/g\ntDv5wcL7yE6cEOiQvqCxuZV/bj7Ky+sPU9/YSkp8BLdeNpWLZ6UG/BHhQogz9Pg/ZECLglIqCXgb\n+H9a6zVKqTR8E/u8CIwHNgATtda9jnsM9j6F7vaW7uex/U8TYndx76xvkhWT0eN2gc6tpr6Zf245\nxobdhbS1e8kaE8VNSyaiMjxZNMG9AAAezElEQVRD8vmBzs9Mkpt1WSm/Ye9TOBulVDTwDvBDrfUa\nAK11odb6Ba21V2udC5wE0gIV40h0TuJ0vj7tKzS1NfOnvY+RX3Pi7DsFQFRECF+5ZDI/++b5zMtO\nIq+4hl8+u4ffvbSXwtLaQIcnhOhFIIek/hrfqKR3OxYopW5RSn3XeJ0CJAOFAYpvxJqTNJN/mfol\nGlub+OOexzhR01u3TeAleSK4+5rp/ODWuUxOj2Vvbhk/enw7T7xzkIqapkCHJ4ToxrTmI6XUXHy/\n+DOBFny/3N8A8oD3gApga5ddngWeM37GAiH4+hTe7us4o635qKutxTt5+uCLRLrc3D/7LlIjUzrX\njcTcvF4ve4+U8dLGIxSX1RPitLPivAwuOz+D8NCzTRd+ppGY31CR3KzLSvn11nxkep+C2UZzUQD4\nsHAbz+lXiQqJ5Duzv0WyOwkY2bm1tbfz4afFrN6cR1VdM1ERLq66KItFs1JxOvp38TqS8xssyc26\nrJTfiOtTEEPj4rQLuHHy1dQ01/K7PY9SUn860CGdlcNuZ9GsNH5x13yuWZBFc2s7z6w9xH8+9jE7\nc0pGxJzVQoxWUhSCwOKxF3H9xFVUNVfz+z2PUtZQHuiQ+iU0xMFVF2Xxi7vms2ROGqWVjfx59X5+\n/rQ8NkOIQJGiECSWZizk6vGXUdFUye/2PMrpemsUBoAYdwhfW6H46TfOY+7kRHILq3ng6d388dV9\nFJfVBTo8IUYVKQpBZEXmEq7IWk5ZYzn/veG3lNaXBTokv4yJd3PPdTP4f1+dy8S0GHYfKuU/H9vO\nU+9pqurkEd1CDAcpCkHmssxLWJm5jJO1pfxy5+85UKYDHZLfJo6N4ftfncO9180g0RPOhj2FfO/h\nrbzxYR6NzfJMJSHMJKOPLDJSwF/7a/bx113P0dbexqrxK1gxbgl2m/X+Bmhta2fz3iJe/zCP6voW\nYtwhXL0gi+uWTqa8PDibloL5exnMuYG18pMhqT2w0gn0V2JiFDtzP+Ov+56ioqmScxKm8bWpNxPu\nNP+x1mZoaGrlve35vLs9n+aWdpLiIlg2J40FM8cQFuLfPQ4jXbB/L4M1N7BWflIUemClE+ivjtxq\nmmt5fP8zHKrMJTkiiTtn3EqKcS+DFVXWNvHmlmN8uO8kzS1tuMOcLJmTxrK56cS4QwId3pAYDd/L\nYGWl/KQo9MBKJ9BfXXNra2/j9dx3WFewiTBHKLdOvZlzEqcHOMLBCQkP4cU1OazfXUhtQwtOh50L\np6dw6XnpjIl3Bzq8QRkt38tgZKX8pCj0wEon0F895bbz1Cc8c/AlmttbWDluKVeMX2HJfgb4PL+m\nljY+2lfMmu0FlFQ2YANmTUpg5fkZTBobG+gwB2S0fS+DiZXy660oBFdjrOjTucmzGONO5tFP/8G7\nx9eTX1PI16d9mQhXRKBDG7BQl4Olc8ayeFYauw+V8s7H+ew5fJo9h08zIS2aleeNY/akBOx2mctB\niP6QKwWLVHV/9ZVbfUs9f//sOT4r0ySExXHnzH8hLXLMMEc4OL3l5/V6OVRQybsf57M313efRrIn\nnEvPy+DC6SmEuEb+hEyj9XsZDKyUnzQf9cBKJ9BfZ8ut3dvOW3lreffYOkLsLm6ZciPnJs8axggH\npz/nrvB0He9tz2fbgZO0tnmJinCxbO5Yls4ZS2S4a5gi9d9o/l5anZXyk6LQAyudQH/1N7e9pft5\n8rMXaGxrYmn6Aq6ZcDkOe3D9NV1Z28T7O0+wYU8hDU2thLjsLJiRyorz0kmMDTc5Uv/J99K6rJSf\nFIUeWOkE+suf3E7WlfDovic5VV/C5NgJ3D79FqJCIk2OcHAGcu4amlrZvLeINTsLKK9uwmaDedlJ\nrDw/g8yUaJMi9Z98L63LSvlJUeiBlU6gv/zNraG1kacOvsje0v14QmP55oyvMS463cQIB2cw5661\nrZ0dOSW8+3E+BSW+qUGzM2JZef44ZoyPw2YLbKe0fC+ty0r5BaQoKKWmA6/jm3bzj93WXQL8HGgD\n3tZa/9RY/hBwAeAF7tda7+jrGFIUejaQ3Nq97aw5vpE3j76Hw+7gS5OvZX7qPJMiHJyhOHder5fP\njlXw7sfHOXCsAoC0RDcrz8vg/KnJ/Z7wZ6jJ99K6rJTfsA9JVUq5gT8A63rZ5PfApfim6fxAKfUK\nkAhM0lrPV0pNAR4H5psVoziT3WZnZeZS0qPSeOLAszyd8xLHa05ww6QrcdqDb/SyzWZjWlYc07Li\nyD9Vw7vb89n+WQl/e+sgr246yiXnjmXROWlEhAVf7kL0xsw/hZqAy4EvzCqvlBoPlGutC7TW7cDb\nwDLj32oArfVBwKOUGjmNvaPEtHjF/533bdIix7C5cCu/2/MIlU1VgQ7LVBnJUdx55TR++a35rJiX\nTn1TKy9tyOW7f/6IF9Yf5vjJGpkRTowKpvcpKKV+DJzu2nyklLoQ+Het9bXG+zuACUAC8JbW+nVj\n+WbgDq31od4+v7W1zet0jvzRMlbU2NrEIzue5qP8ncSGRfNvF95JduKEQIc1LGrrm3ln6zH+ufko\nFTVNACTFRXDhjDHMnzGG7HFxckOcsLoRfUdzb/93nfX/uoqK+gEf1Ertf/4aqty+POFGUkJSeC33\nbX684TfcOOkqFqTNHxWdsYtnjuGiqcnsPXKa3YdK2Zt7mtUf5LL6g1xi3CHMnpzI3MmJqIzYIe1/\nkO+ldVkpv8TEqB6XB6ooFAEpXd6nGcuauy1PBYqHMS7Rjc1mY2nGQsZGpfK3/c/wwqHVHK8+wc3q\nWkIcI/cGsKHicto5NzuJc7OTaGlt5+DxCnYfKmH3odNs3FPIxj2FRIQ6mTUpgTmTE5mWFUeoBe6a\nFqI3ASkKWutjSqlopVQmcAJYBdyCr/noJ8AjSqk5QJHW2hplN8hN9kzke/Pu59F9T7Lt5E6K6or5\n5oxbiQvzBDq0YeNy2pk5IZ6ZE+L52qXtHDlRxS5dyq5DpWzZf5It+08S4rIzY3w8cycnMnNCgnRS\nC8sxrU9BKTUX+DWQCbTgG2X0BpCntX5NKbUQ+KWx+Sta6/819vsFsBBoB+7RWu/t6zgyJLVnZuXW\n0tbCC4dWs7V4B5EuN7dPuwUVN3HIj3M2I+nceb1ejp2s6SwQp8p9TZoOu42pmXHMVYnMmpRAdET/\n5nsYSbkNtWDODayVn9y81gMrnUB/mZmb1+vlw6JtvHToDdq97Vwz8XKWpS8c1n6GkXruvF4vRWX1\n7NYl7DpUSv4p381xNhtMHhvLHOXrh4iL7n0GvJGa21AI5tzAWvlJUeiBlU6gv4Yjt6NVx3ls35NU\nNdegPBOZmTiNbM9EkiOSTC8QVjl3pZUN7D7ku4LIPVFFx5c1a0wUcyYnMlclkRJ35qPLrZLbQARz\nbmCt/KQo9MBKJ9Bfw5VbVVM1fz/wLIcrj3YuiwmJZrJnIipuItmeiXjChn6yGyueu8raJvYcPs1u\nXUJOfiVt7b6vblqC2ygQiaQnRZKUFG253PrLiufNH1bKT4pCD6x0Av013LmVNZSjK474/pUfoaal\ntnNdUkQCyjMJ5ZnIZM8E3EMwqY/Vz11tQ0vnUNf9eeW0tLYDkBATxvyZqWQmupmcEYs7LLhGeFn9\nvJ2NlfKTotADK51AfwUyN6/XS1Hdyc4CcaTyKI1tvhvAbNgYG5WK8kwk2zOJCbGZhDj61wHbVTCd\nu8bmVvYfLWfXoVL2HjlNY3Mb4LtJJz05kuwMD9njPEweG2v50UzBdN56YqX8pCj0wEon0F8jKbe2\n9jaO15xAlx9BVxwmr+o4rV7fLz6nzUFWzDiU0dw0Liq9X/M5jKT8hlJLazvl9S1s+7SInOMV5BZV\n0drm+4rbbJCZEkV2hgeV4WHS2BjCQ61VJIL1vHWwUn5SFHpgpRPor5GcW3NbM7mVx4zmpsMU1BTh\nNbpgwxyhTIzNQsX5mptS3Sk9dlqP5PwGq2tuzS1t5BZVk3O8gpz8Co4WVXf2RdhtNrLGRJE9zoPK\niGVSWiyhISP7xrlgPm9grfykKPTASifQX1bKra6lnsMVueiKI+RUHKak/nTnuihXJJM9E1BxE1Ge\nSSSExwHWys9ffeXW1NzGkcIqcvIryDleQV5xDe3G/8MOu42s1GiyMzxMyYhlQlrMiJuTOpjPG1gr\nPykKPbDSCfSXlXOraKw8o9O6qrm6c118WBzZcRO5RF1EIj1fRVidP+euoanVVySMK4ljJ2vo+F/a\n6bAxPjWG7IxYpozzMD41BpczMHNEdLDy97I/rJSfFIUeWOkE+itYcvN6vZyqLzUKxGEOVR6lobUB\ngPSoNJamL2Bu0jmWmFe6vwZz7uobWzl0orKzSBScqu28N8LltDMhNZrscR6yMzyMT40e9omEguV7\n2Rsr5SdFoQdWOoH+Ctbc2r3tHK06ztaSj/n4xB68eIkNjWHx2Iu4KPV8IlzhgQ5x0Iby3NU1tnAo\nv5KD+RXkHK/kROnnQ4VDXHYmpcUwIS2GrDHRZI2JJtrt/0gwfwTr97KDlfKTotADK51AfwVzbuDL\n72D+MTYUfMiW4h00tzUT6gjhwtTzWDL2YuKNvgcrMvPc1dQ3c6igkpzjleTkV1B4uu6M9fHRYWSl\nRpM1JorxY6LJSI4a0hFOo+F7aZX8pCj0wEon0F/BnBucmV99Sz0fFn3MxoKPqGquxoaN2UkzWJq+\nkKyYjABH6r/hPHfV9c3kFVWTV1zNsZM1HC2qprahpXO9DUhNcJNpFInMMdGkJ0UOuNlpNH0vRzop\nCj2w0gn0VzDnBj3n19reyu6ST1mXv4kTtb5ZYMfHZLIsYyEzE6ZitwW2k7W/An3jYVlVI0eLqzlW\nXMPR4mqOn6yhqaWtcxunw0Z6UhRZY6I6m51S4iOw96PTfzR+L0eq3oqCte58EaIPTruT81LmMC95\nNocqcllXsIkDZTkc3XeMhPB4lqYv4IIx5xI6gDuoRwubzUZCbDgJseGcNyUZgPZ2L0VldeQVV5NX\nXENecTX5p3w/fU/Eh/BQB+OSo3xNTynRjE+NxhMVGpSjw4KdXClYpKr7K5hzg/7nd7LuFOsLNvPx\nyd20trcS4Qzn4rQLWDz2ImJCo4chUv9Z4dy1tLaRX1Lru5ooqubYyWqKy86cGjfaHWI0OX1+RZGV\nETficxsMK5y7DtJ81AMrnUB/BXNu4H9+Nc21bDqxhU2FW6ltqcNhc3Bu8iyWZSwkLXKMiZH6z6rn\nrr6xleMnq89oeqqoaTpjmzHxbiakRZOdEYtK9xAf0/u8ElZkpXMXkKKglHoIuADwAvdrrXcYy9OA\nZ7psOh74HhAC/BTINZav1Vr/rK9jSFHoWTDnBgPPr7mthe0nd7G+YDOn6ksByPZMYmnGQqbGTR4R\nzR3BdO6qapvIMwrEseJq8k7WUNelIzsxNgyV4QmaImGlczfsRUEptQj4d631KqXUFOBxrfX8HrZz\nAhuBlcANwHSt9Xf7exwpCj0L5txg8Pm1e9v5rEyzLn8Thyp9f4OMcSezNH0h81Jm47IHrrstmM9d\nXHwkew4Uo/MryMmv5FBBJfVNrZ3rrV4krHTuAtHRvAxYDaC1PqiU8iilorXW1d22uw3fHM21SikT\nwxHic3abnekJU5ieMIX8mhOsz9/MrpK9PJPzEm8cfYdFaRexYOwFRLrcgQ41qDjsNsalRDEuJYoV\n52XQ3u6loKT2jCLx4afFfPhpMWD9ImFFZl4pPAq8pbV+3Xi/GbhDa32o23bbgBVa62ql1G3APUAZ\n4AK+q7Xe09dxWlvbvE5n8DziQAROWX0F7xzewPu5H1Lf0kCIw8WizAtYOWkxKZGJuBzBNeHNSNTW\n7uV4cTX7ck+z78hp9h8tO6O5KSU+ghkTEpg+IYHpE+JJ8gx+wqZRLOBDUr8QgFJqPpDT5ephG1Cq\ntX7LWPckMKOvD62oqO9rdZ+sdKnnr2DODczKz8mlqctZlLSALcU72FDwIWtzN7M2dzMAIXYXEa4I\n3K4I3M4I43U4bpebCGc4bpexzBlhvA7H7Yzwu5gE87nrT25RIXYunJLEhVOSaG/3cqK0lpz8SnR+\nBTq/krXb81m7Pd/3eSPsSsJK5y4xMarH5WYWhSIgpcv7VKC42zargPc73mitc4Ac4/VWpVSiUsqh\ntW5DiGES5gxjafoCFqVdyN7TB9hbup/a5jrqW+upa6mnrKGCwrbuX+XedS0mvuLhxu0KJ8IoHp8X\nk3AiXBGERtvwer0jotM70Ox2GxnJUWQkR7FiXnqPRUKam4aWmUVhDfAT4BGl1BygSGvdvYTOA57v\neKOU+g+gQGv9nFJqOr6rBikIIiAcdgdzkmYyJ2nmF9a1tbdR39pAXUt9Z7Goa6mnvqWeutYG38+O\nZa311LU0+FVMwp3hJIbHkxSRQGJ4PInhCSRGJJAUnoDbFTFqC4a/RSIy3IU73EVkmBN3uAt3mAt3\nuJPIMN/yM16HOYkMdxEW6uzX3dnByrSioLXeopTapZTaArQD9xh9BlVa69eMzcYAJV12exZ4Sin1\nLSO2O8yKT4jBcNgdRIVEEhUS6dd+PRWT+pYG6lrqqDOWN3jrOFF5kqLaYvJrTnzhM6RgfO5sReJk\neT11ja2crmzonLHubGw2fMXDKCSRRsFwG8Wj833XIhPustzUqL2Rm9cs0v7nr2DODYI7v47c2r3t\nVDRWUdpwmtKG05TU+36W1pdxuqGsc57rrkZ6wQjUefN6vTS1tFHb0EJdQyt1jS3UNbYa71t87xuM\n98a6uoYWahta/ComY+LdpMZHkJ4USXpSFBnJkSP2cR/y7CMhLMZusxMf7iE+3EM2k85Y11fB8PcK\nIyYkmsgQNyF214j85TUUbDYbYSFOwkKcJMT0f7+OYtJRSHxFo7WzkHQtMjX1LZwsr6fodB07dWnn\nZ7jDnKQnRTI2KZL0pEgykqJITXAHfBa83khREMKChrpgALjsTqMTPIJIl5tIlxu3y02kKwJ3iPuL\ny1xuQoJ8mG7XYtKfTuuEhEh07mkKSmopKKkxftai8yvJya/s3M5ht5HSeUXhKxTpSZGmT3LUH1IU\nhAgy/hSM0voyqptrfX0aLfXUttRR1lBOYW3/OsRD7C5fkQjpKBgR3X4axSTEt8zTZv2Z8fpis9mI\njwkjPiaMWZMSOpc3NrdyorSus0gUlNRwoqSOwtI6th041bldjDuks1CkJ0WSnhxFSlw4DvvwXVVI\nURBiFOmrYHTV0t76eaForqOu1fjZUket8c83uqqO2pZ6TtWXUtBW2K8YokOiiAvzEBcWS1yYh/gw\nj/HetyzMGXzDSMNCnExMi2Fi2udtV+1eL6UVDRSU1JJfUssJo1jszytnf15553Yup53UBHeXqwrf\nz4gwc67SpCgIIb7AZXcSGxpDbGj/G+Cb21rOuOLoKBgdr30jq+o5VVNGQU0hx6rze/ycCGf4FwpF\nXJiHuHDfe7cz8B3mQ8Fus5EcF0FyXATnZid1Lq9taDEKRK1RMGooLK3l+MkzO+hTE9x890uziI0M\nHdK4pCgIIYZEiMNFiCMWT1hsr9t0HVlV3VxDeWMF5Q0VlDdWUtZYTnljJeWNFb4rD2P2vC8eJ6Sz\nWMSHxX1eNIxl0SFRlpllryeR4S6yx3nIHufpXNba1s7J8vrPm59O1VDX2NrHpwycFAUhxLCz2+yd\nVyLjYzK/sN7r9VLbUucrGt0KRse/k3WnvvjBgNPmwGMUihR3EhNjxzMhJouY0J4f62AFToedsYmR\njE2MZP40k49l7scLIYT/bDZb582B46LTe9ymobWhs1CUNXxeLMqMn7riCLriCB+c2AJAUngCE2Oz\nmBg7nomxWcSFeYKiGWqoSVEQQlhSuDOctMjwXmfOa25r5kRtEUcq8jhcdZSjlcfYUryDLcU7APCE\nxhpFwlcokiMSpUggRUEIEaRCHCGMj8lkfEwmK1hCu7fdVyQq8zhSmUduZR47Tu1hxynf0/kjXe7O\nq4iJseNJi0yxdN/EQElREEKMCnabnYyosWREjWVp+gK8Xi+n6ks4XJnHkcqjHKnM45PSfXxSug+A\ncGcYE2IyOwtFRtRYHPbgn7tFioIQYlSy2WykuJNJcSezIO0CvF4vZY0VnQXiSOVR9pflsL8sB/Dd\nqJcVM67zSiIzOiMo7+iWoiCEEPiKREJ4HAnhcVww5lwAKpuqyDWam45U5nV2XgM4bA7GRY/tvJIY\nH5OJ1xtJa3srLe0tNLe1nPGzpb2VlrYWmttbaGlrptnYrqW95fPlXbfv2N/Yz/e6mZY2336hjhD+\nz5xvERfm6Sstv0lREEKIXsSGxjA3eRZzk2cBUNtSx9HKY51F4lh1AUerjrPm+AZs2MDmG0471Ow2\nOyF2Fy67C5fDRaTLTXRoNCH2oX9WkhQFIYTop0iXm5mJ05iZ6LtZoLG1kbyqfI5UHuVodT52hxfa\n7LgcrjN+ibvsTt97RwghdqexzPcvpMtrl8NJiD2ky3InLrtrWPsyTC0KSqmHgAsAL3C/1npHl3XH\ngAKg46Hwt2itC/vaRwghRpIwZxhT4iczJX4yEBzzfJhWFJRSi4BJWuv5SqkpwOPA/G6bXaa1rvVz\nHyGEECYxcxDuMmA1gNb6IOBRSkWbsI8QQoghYmbzUQqwq8v7UmNZdZdlDyulMoEPge/3cx8hhBAm\nGc6O5u73j/8IeBcox3d1cH0/9vkCjycCp3PgnTCJidZ9SNbZBHNuENz5SW7WZfX8zCwKRfj+yu+Q\nCnRO56S1frLjtVLqbWDG2fbpSUVF/YADDIZOod4Ec24Q3PlJbtZlpfx6K15m9imsAW4AUErNAYq0\n1jXG+xil1HtKqY5BtouA/X3tI4QQwnymXSlorbcopXYppbYA7cA9SqnbgCqt9WvG1cE2pVQDsAd4\nWWvt7b6PWfEJIYT4IpsZd98Np9LSmgEnYKVLPX8Fc24Q3PlJbtZlpfwSE6N67LO1fFEQQggxdEbf\nw8KFEEL0SoqCEEKITlIUhBBCdJKiIIQQopMUBSGEEJ2kKAghhOgkRUEIIUSnUTvzWjBP5qOU+hWw\nAN/5fUBr/WqAQxpSSqlwfI9F+anW+okAhzOklFK3AP8BtAI/0lq/FeCQhoRSKhJ4EvAAocBPtNbv\nBTaqwVNKTQdeBx7SWv9RKZUOPAU48D237Wta66ZAxuivUXml0HUyH+AO4PcBDmnIKKWWANON3FYC\nvw1wSGb4Ib6n6wYVpVQ88F/AxcAq4OrARjSkbgO01noJvueb/S6w4QyeUsoN/AFY12XxfwN/0lov\nAI4AtwcitsEYlUWB4J7MZxNwo/G6EnArpYZvgleTKaWygalAUPwF3c0lwPta6xqtdbHW+s5ABzSE\nTgPxxmuP8d7qmoDL8T3ducNi4A3j9T/xnVNLGa1FIQXfBD4dOibzsTytdZvWus54ewfwtta6ra99\nLObXwL8FOgiTZAIRSqk3lFKblVLLAh3QUNFaPw9kKKWO4PvD5bsBDmnQtNatWuuGbovdXZqLSoAx\nwxzWoI3WotDdWSfzsRql1NX4isK9gY5lqCilbgW2aq3zAh2LSWz4/pq+Dl9zy9+VUkHx3VRKfRXI\n11pPBJYCfwxwSMPBkudutBYFvyfzsRKl1KXAD4DLtNZVgY5nCF0BXK2U2gZ8A/hPpZTlLs/7cArY\nYvwFmgvUAIkBjmmoXAS8B6C13gukBlOzZhe1xkAIgDTObFqyhNFaFIJ2Mh+lVAzwILBKax1UnbFa\n65u11vO01hcAj+EbffR+oOMaQmuApUopu9HpHElwtL2Dr9P1fACl1DigNsiaNTu8z+dTC1+Pb8ph\nSxmVQ1J7mgAo0DENoZuBBOBFpVTHslu11vmBC0n0h9a6UCn1MrDNWHSf1ro9kDENoUeAx5VSH+D7\nvfOtAMczaEqpufj6uDKBFqXUDcAtwBNKqbuA48A/AhfhwMh8CkIIITqN1uYjIYQQPZCiIIQQopMU\nBSGEEJ2kKAghhOgkRUEIIUSnUTkkVQh/KKUyAQ1s7bbqLa31g0Pw+YuB/9FaXzzYzxJisKQoCNE/\npVrrxYEOQgizSVEQYhCUUq3AT4El+O5Avk1rvV8pdT6+G5ta8M3Zca/W+jOl1CTgr/iabhuBrxsf\n5VBK/QWYje/pm1dorWuHNxshpE9BiMFyAPuNq4i/4HuePvgmlPmOMX/Ab4A/GcsfBh7UWi8EHufz\nx5xPAX5sPMKjBbh0eMIX4kxypSBE/yQqpTZ2W/Yfxs+OGcQ+Av5dKRULJHeZzW8j8Lzx+nzjfcfj\npDv6FHK01qeMbU4AsUMbvhD9I0VBiP7psU/BeL5UxxW3DV9TUfdnx9i6LPPS8xV6aw/7CDHspPlI\niMFbavy8GPjUeFx5sdGvAL7ZtzoecrcF3zSpKKVuVkr9fFgjFeIs5EpBiP7pqfmoY7Kf2Uqpu/FN\nM3mrsexW4DdKqTagDbjbWH4v8KhS6h58fQe3AxPMDFwIf8hTUoUYBKWUF3Bprbs3/whhSdJ8JIQQ\nopNcKQghhOgkVwpCCCE6SVEQQgjRSYqCEEKITlIUhBBCdJKiIIQQotP/DzORy/1b/q/qAAAAAElF\nTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"plot_acc(t4_model_history)\n",
"plot_loss(t4_model_history)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "wNukq6ClbRIz"
},
"source": [
"#### T4 - Estimación con conjunto de test"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 86
},
"colab_type": "code",
"id": "OZwctxV2bRI0",
"outputId": "a4dcc868-f855-4e75-d5f7-cf39f16c5062"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"890/890 [==============================] - 0s 275us/step\n",
"Evaluación del modelo (Datos de test) - Loss : 0.3911445013592752\n",
"Evaluación del modelo (Datos de test) - Accuracy : 0.8853932586948523\n",
"Accuracy (Datos de test) en % : 88.53932586948522\n"
]
}
],
"source": [
"# Evaluamos sobre los datos de test\n",
"\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" t4_score = t4_tpu_model.evaluate(x_test, y_test, verbose=1)\n",
"else:\n",
" t4_score = t4_keras_model.evaluate(x_test, y_test, verbose=1)\n",
" \n",
"print(\"Evaluación del modelo (Datos de test) - Loss : \" + str(t4_score[0]))\n",
"print(\"Evaluación del modelo (Datos de test) - Accuracy : \" + str(t4_score[1]))\n",
"print(\"Accuracy (Datos de test) en % : \" + str(t4_score[1]*100))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "-ghj4fldbRI_"
},
"source": [
"#### T4 - Conclusiones\n",
"Empleando redes neuronales similares a las del apartado anterior con 4 capas convolucionales, introducimos Data Augmentation, manteniendo tambien el optimizador RMSProp.\n",
"\n",
"Obtenemos los siguientes parametros de loss y accuracy en cada uno de los conjuntos empleados :\n",
"\n",
"* **Datos de entrenamiento**\n",
" * Loss : 0.6371\n",
" * Accuracy : 0.8075\n",
"\n",
"* **Datos de validación**\n",
" * Loss : 0.5577\n",
" * Accuracy : 0.8386\n",
"\n",
"* **Datos de test**\n",
" * Loss : 0.3911\n",
" * Accuracy : 0.8853\n",
"\n",
"\n",
"### Conclusiones\n",
"\n",
"Según los resultados obtenidos, mantenemos los valores de accuracy justo por encima del 85%, el requerido inicialmente.\n",
"Los valores de accuracy y loss empeoran respecto a los casos previos, pero si nos fijamos en las graficas vemos que las curvas comparativas de loss y accuracy entre valores de entrenamiento y validación son mas similares entre ellas que en casos anteriores."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "WAgjHZbBbTJ5"
},
"source": [
"### Banco de pruebas - Modelo de red CNN T5\n",
"\n",
"T5 es un modelo de red básico que #TODO\n",
"\n",
"- Arquitectura : \n",
"- Funciones de activación : \n",
"- Kernel size para Conv2D : \n",
"- Optimizador : ![alt text](https://)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "-poUSof0bTKE"
},
"source": [
"#### T5 - Arquitectura de la red CNN"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1215
},
"colab_type": "code",
"id": "p3ziZiRkbTKK",
"outputId": "bcc9c0b6-4693-4646-e2d7-f5906b2a661c"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"t5_input_conv2d_1 (Conv2D) (None, 64, 64, 32) 896 \n",
"_________________________________________________________________\n",
"t5_act_1 (Activation) (None, 64, 64, 32) 0 \n",
"_________________________________________________________________\n",
"t5_batchnormalization_1 (Bat (None, 64, 64, 32) 128 \n",
"_________________________________________________________________\n",
"t5_conv2d_2 (Conv2D) (None, 62, 62, 32) 9248 \n",
"_________________________________________________________________\n",
"t5_act_2 (Activation) (None, 62, 62, 32) 0 \n",
"_________________________________________________________________\n",
"t5_batchnormalization_2 (Bat (None, 62, 62, 32) 128 \n",
"_________________________________________________________________\n",
"t5_maxpool2d_1 (MaxPooling2D (None, 31, 31, 32) 0 \n",
"_________________________________________________________________\n",
"t5_dropout_1 (Dropout) (None, 31, 31, 32) 0 \n",
"_________________________________________________________________\n",
"t5_conv2d_3 (Conv2D) (None, 31, 31, 64) 18496 \n",
"_________________________________________________________________\n",
"t5_act_3 (Activation) (None, 31, 31, 64) 0 \n",
"_________________________________________________________________\n",
"t5_batchnormalization_3 (Bat (None, 31, 31, 64) 256 \n",
"_________________________________________________________________\n",
"t5_conv2d_4 (Conv2D) (None, 29, 29, 64) 36928 \n",
"_________________________________________________________________\n",
"t5_act_4 (Activation) (None, 29, 29, 64) 0 \n",
"_________________________________________________________________\n",
"t5_batchnormalization_4 (Bat (None, 29, 29, 64) 256 \n",
"_________________________________________________________________\n",
"t5_maxpool2d_2 (MaxPooling2D (None, 14, 14, 64) 0 \n",
"_________________________________________________________________\n",
"t5_dropout_2 (Dropout) (None, 14, 14, 64) 0 \n",
"_________________________________________________________________\n",
"t5_conv2d_5 (Conv2D) (None, 14, 14, 256) 147712 \n",
"_________________________________________________________________\n",
"t5_act_5 (Activation) (None, 14, 14, 256) 0 \n",
"_________________________________________________________________\n",
"t5_batchnormalization_5 (Bat (None, 14, 14, 256) 1024 \n",
"_________________________________________________________________\n",
"t5_conv2d_6 (Conv2D) (None, 12, 12, 256) 590080 \n",
"_________________________________________________________________\n",
"t5_act_6 (Activation) (None, 12, 12, 256) 0 \n",
"_________________________________________________________________\n",
"t5_batchnormalization_6 (Bat (None, 12, 12, 256) 1024 \n",
"_________________________________________________________________\n",
"t5_maxpool2d_3 (MaxPooling2D (None, 6, 6, 256) 0 \n",
"_________________________________________________________________\n",
"t5_dropout_3 (Dropout) (None, 6, 6, 256) 0 \n",
"_________________________________________________________________\n",
"t5_flatten_1 (Flatten) (None, 9216) 0 \n",
"_________________________________________________________________\n",
"t5_dense_1 (Dense) (None, 1024) 9438208 \n",
"_________________________________________________________________\n",
"t5_act_7 (Activation) (None, 1024) 0 \n",
"_________________________________________________________________\n",
"t5_batchnormalization_7 (Bat (None, 1024) 4096 \n",
"_________________________________________________________________\n",
"t5_dropout_5 (Dropout) (None, 1024) 0 \n",
"_________________________________________________________________\n",
"t5_dense_2 (Dense) (None, 18) 18450 \n",
"_________________________________________________________________\n",
"t5_output_1 (Activation) (None, 18) 0 \n",
"=================================================================\n",
"Total params: 10,266,930\n",
"Trainable params: 10,263,474\n",
"Non-trainable params: 3,456\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"t5_keras_model = Sequential()\n",
"t5_keras_model.add(Conv2D(32, (3, 3), padding='same', input_shape=input_shape, name='t5_input_conv2d_1'))\n",
"t5_keras_model.add(Activation('relu', name='t5_act_1'))\n",
"t5_keras_model.add(BatchNormalization(name='t5_batchnormalization_1'))\n",
"t5_keras_model.add(Conv2D(32, (3, 3), name='t5_conv2d_2'))\n",
"t5_keras_model.add(Activation('relu', name='t5_act_2'))\n",
"t5_keras_model.add(BatchNormalization(name='t5_batchnormalization_2'))\n",
"t5_keras_model.add(MaxPooling2D(pool_size=(2, 2), name='t5_maxpool2d_1'))\n",
"t5_keras_model.add(Dropout(0.25, name='t5_dropout_1'))\n",
"\n",
"t5_keras_model.add(Conv2D(64, (3, 3), padding='same', name='t5_conv2d_3'))\n",
"t5_keras_model.add(Activation('relu', name='t5_act_3'))\n",
"t5_keras_model.add(BatchNormalization(name='t5_batchnormalization_3'))\n",
"t5_keras_model.add(Conv2D(64, (3, 3), name='t5_conv2d_4'))\n",
"t5_keras_model.add(Activation('relu', name='t5_act_4'))\n",
"t5_keras_model.add(BatchNormalization(name='t5_batchnormalization_4'))\n",
"t5_keras_model.add(MaxPooling2D(pool_size=(2, 2), name='t5_maxpool2d_2'))\n",
"t5_keras_model.add(Dropout(0.25, name='t5_dropout_2'))\n",
"\n",
"t5_keras_model.add(Conv2D(256, (3, 3), padding='same', name='t5_conv2d_5'))\n",
"t5_keras_model.add(Activation('relu', name='t5_act_5'))\n",
"t5_keras_model.add(BatchNormalization(name='t5_batchnormalization_5'))\n",
"t5_keras_model.add(Conv2D(256, (3, 3), name='t5_conv2d_6'))\n",
"t5_keras_model.add(Activation('relu', name='t5_act_6'))\n",
"t5_keras_model.add(BatchNormalization(name='t5_batchnormalization_6'))\n",
"t5_keras_model.add(MaxPooling2D(pool_size=(2, 2), name='t5_maxpool2d_3'))\n",
"t5_keras_model.add(Dropout(0.25, name='t5_dropout_3'))\n",
"\n",
"t5_keras_model.add(Flatten(name='t5_flatten_1'))\n",
"t5_keras_model.add(Dense(1024, name='t5_dense_1'))\n",
"t5_keras_model.add(Activation('relu', name='t5_act_7'))\n",
"t5_keras_model.add(BatchNormalization(name='t5_batchnormalization_7'))\n",
"t5_keras_model.add(Dropout(0.5, name='t5_dropout_5'))\n",
"t5_keras_model.add(Dense(num_categ, name='t5_dense_2'))\n",
"t5_keras_model.add(Activation('softmax', name='t5_output_1'))\n",
"\n",
"t5_keras_model.summary()\n"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "C2ZSb_CrbTKY"
},
"outputs": [],
"source": [
"# Definimos los parámetros del optimizador adadelta()\n",
"# https://keras.io/optimizers/#adadelta\n",
"\n",
"# - Learning Rate (lr) = 1.0\n",
"# - RHO (Decay factor) = 0.95\n",
"# - Epsilon (Fuzz Factor) = None\n",
"# - Decay (Learning rate decay over each update) = 0.0\n",
"adadelta = Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)\n",
"\n",
"# Compilamos el modelo\n",
"t5_keras_model.compile(loss='categorical_crossentropy',\n",
" optimizer=adadelta,\n",
" metrics=['accuracy'])"
]
},
{
"cell_type": "code",
"execution_count": 0,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "JyAf_0GabTKi"
},
"outputs": [],
"source": [
"# Si usamos TPU pasamos el modelo Keras a modelo TPU\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" t5_tpu_model = tf.contrib.tpu.keras_to_tpu_model(\n",
" t5_keras_model,\n",
" strategy=tf.contrib.tpu.TPUDistributionStrategy(\n",
" tf.contrib.cluster_resolver.TPUClusterResolver(\n",
" tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])\n",
" )\n",
" )\n",
" print(\"TPU Model\")\n",
" print(\"=========\")\n",
" t5_tpu_model.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "ngAFWc6UbTKo"
},
"source": [
"#### T5 - Entrenamiento de la red"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 471
},
"colab_type": "code",
"id": "6CULdIYebTKq",
"outputId": "971f5327-12ea-422d-9741-55b5614c1b1b"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 15193 samples, validate on 3799 samples\n",
"Epoch 1/12\n",
"15193/15193 [==============================] - 23s 1ms/step - loss: 2.1696 - acc: 0.4549 - val_loss: 4.6204 - val_acc: 0.0395\n",
"Epoch 2/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 1.2653 - acc: 0.6455 - val_loss: 3.6270 - val_acc: 0.1311\n",
"Epoch 3/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.8402 - acc: 0.7505 - val_loss: 2.9950 - val_acc: 0.2432\n",
"Epoch 4/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.5756 - acc: 0.8267 - val_loss: 1.8778 - val_acc: 0.4612\n",
"Epoch 5/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.4179 - acc: 0.8720 - val_loss: 0.8853 - val_acc: 0.7528\n",
"Epoch 6/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.3122 - acc: 0.9034 - val_loss: 0.5518 - val_acc: 0.8502\n",
"Epoch 7/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.2208 - acc: 0.9315 - val_loss: 0.6242 - val_acc: 0.8226\n",
"Epoch 8/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.1638 - acc: 0.9502 - val_loss: 0.5734 - val_acc: 0.8605\n",
"Epoch 9/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.1293 - acc: 0.9610 - val_loss: 0.6683 - val_acc: 0.8278\n",
"Epoch 10/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.0892 - acc: 0.9731 - val_loss: 0.7692 - val_acc: 0.8126\n",
"Epoch 11/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.0864 - acc: 0.9731 - val_loss: 0.4670 - val_acc: 0.8823\n",
"Epoch 12/12\n",
"15193/15193 [==============================] - 20s 1ms/step - loss: 0.0598 - acc: 0.9821 - val_loss: 0.4705 - val_acc: 0.8815\n"
]
}
],
"source": [
"# Parametros de entrenamiento\n",
"t5_n_batch_size = 128\n",
"t5_n_epochs = 12\n",
"\n",
"\n",
"# Entrenamos el modelo con fit dependiendo si tenemos TPU o GPU/Normal\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" print(\"Training with TPU Model...\")\n",
" t5_model_history = t5_tpu_model.fit(x_train, y_train,\n",
" batch_size=t5_n_batch_size,\n",
" epochs=t5_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))\n",
"else:\n",
" # GPU o sin aceleración\n",
" t5_model_history = t5_keras_model.fit(x_train, y_train,\n",
" batch_size=t5_n_batch_size,\n",
" epochs=t5_n_epochs,\n",
" verbose=1,\n",
" validation_data=(x_val, y_val))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "-zJthz82bTKy"
},
"source": [
"#### T5 - Análisis de loss/accuracy"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 571
},
"colab_type": "code",
"id": "ZXix1hv-bTKz",
"outputId": "9b64f719-ac9a-4e2e-f1c0-16612dc19947"
},
"outputs": [
{
"data": {
"image/png": "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\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"plot_acc(t5_model_history)\n",
"plot_loss(t5_model_history)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "XjN74SkXbTK8"
},
"source": [
"#### T5 - Estimación con conjunto de test"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 86
},
"colab_type": "code",
"id": "Yz9WnBkibTK-",
"outputId": "be6603cd-9272-482b-d50c-3a7442bac248"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"890/890 [==============================] - 1s 626us/step\n",
"Evaluación del modelo (Datos de test) - Loss : 0.14019935775673792\n",
"Evaluación del modelo (Datos de test) - Accuracy : 0.9629213484485498\n",
"Accuracy (Datos de test) en % : 96.29213484485498\n"
]
}
],
"source": [
"# Evaluamos sobre los datos de test\n",
"\n",
"if (HAS_TPU_SUPPORT == 1):\n",
" # TPU\n",
" t5_score = t5_tpu_model.evaluate(x_test, y_test, verbose=1)\n",
"else:\n",
" t5_score = t5_keras_model.evaluate(x_test, y_test, verbose=1)\n",
" \n",
"print(\"Evaluación del modelo (Datos de test) - Loss : \" + str(t5_score[0]))\n",
"print(\"Evaluación del modelo (Datos de test) - Accuracy : \" + str(t5_score[1]))\n",
"print(\"Accuracy (Datos de test) en % : \" + str(t5_score[1]*100))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "4zhhY1YHbTLJ"
},
"source": [
"#### T5 - Conclusiones\n",
"Empleando redes neuronales similares a las del apartado anterior pero con 6 capas convolucionales en lugar de 4 y Batch Normalization después de las funciones de activación.\n",
"\n",
"Obtenemos los siguientes parametros de loss y accuracy en cada uno de los conjuntos empleados :\n",
"\n",
"* **Datos de entrenamiento**\n",
" * Loss : 0.0598\n",
" * Accuracy : 0.9821\n",
"\n",
"* **Datos de validación**\n",
" * Loss : 0.4705\n",
" * Accuracy : 0.8815\n",
"\n",
"* **Datos de test**\n",
" * Loss : 0.1401\n",
" * Accuracy : 0.9629\n",
"\n",
"\n",
"### Conclusiones\n",
"\n",
"Mejoramos los resultados obtenidos, incremnetando los valores de accuracy por encima del 85%, según se requiere.\n",
"Los valores de accuracy y loss empeoran inicialmente , pero a partir de la epoch 4 mejoran sustancialmente aproximandose cada vez mas al optimo, dando lugar a una accuracy del 96.2%, la mayor del estudio, con un valor de Loss de 0.14"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "GRosv_Jh9F82"
},
"source": [
"## Conclusiones de las pruebas\n",
"\n",
"Para este banco de pruebas podemos comentar lo siguiente :\n",
"\n",
"1. El modelo de Fully Connected es el peor de todos, teniendo unos valores de Loss en el conjunto de validación MUY elevados.\n",
"2. El utilizar la técnica de Data Augmentation no hace que necesariamente mejore el modelo de la red (T4 comparado con T3).\n",
"3. El incremento de capas convolucionales en este caso hasta 6 hace que el modelo se ajuste mejor (T5 vs T4)\n",
"4. El uso de batch normalization en CNNs después de las capas de activación es muy recomendado como puede comprobarse por la gráfica del apartado correspondiente (T5)."
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"collapsed_sections": [],
"name": "Laboratorio 1 - CNNs.ipynb",
"provenance": [],
"toc_visible": true,
"version": "0.3.2"
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment