{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "mnist_autoencoder.ipynb", "provenance": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "I36wQ6WNyb39" }, "source": [ "# MNIST Auto-Encoder" ] }, { "cell_type": "markdown", "metadata": { "id": "eOCjEtiVyeid" }, "source": [ "## Pre-requisites" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "o5-bGurjyUwO", "outputId": "779c6bab-a05f-423f-c3aa-c7592886839d" }, "source": [ "! pip3 install cloudmesh-installer\n", "! pip3 install cloudmesh-common" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "Collecting cloudmesh-installer\n", " Downloading https://files.pythonhosted.org/packages/97/bc/25b2c79e608e948999f96a1609c3c91a32483f530b519a327ef6420a06e4/cloudmesh_installer-4.4.19-py2.py3-none-any.whl\n", "Requirement already satisfied: humanize in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (0.5.1)\n", "Collecting bump2version==1.0.0\n", " Downloading https://files.pythonhosted.org/packages/61/10/560509d9bfe8300e03d268dadec74fac7ae04a430f62e2d06d11d9e4e704/bump2version-1.0.0-py2.py3-none-any.whl\n", "Collecting cloudmesh-common\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/84/c3/b8c750f5c6edb5b590fdd3b5730fa16b3a19cb239e00272d1347e8aff4b8/cloudmesh_common-4.3.43-py2.py3-none-any.whl (78kB)\n", "\u001b[K |████████████████████████████████| 81kB 4.5MB/s \n", "\u001b[?25hRequirement already satisfied: pip-tools in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (4.5.1)\n", "Requirement already satisfied: docopt in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (0.6.2)\n", "Requirement already satisfied: coverage in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (3.7.1)\n", "Requirement already satisfied: wheel in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (0.36.2)\n", "Collecting flake8\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/d4/ca/3971802ee6251da1abead1a22831d7f4743781e2f743bd266bdd2f46c19b/flake8-3.8.4-py2.py3-none-any.whl (72kB)\n", "\u001b[K |████████████████████████████████| 81kB 5.6MB/s \n", "\u001b[?25hRequirement already satisfied: pytest in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (3.6.4)\n", "Collecting python-hostlist\n", " Downloading https://files.pythonhosted.org/packages/2b/4f/f31dd4b4bf1a57a5c29599e1165d0df70dbdddcfa59a7c1d04ee2ff4ccbd/python-hostlist-1.21.tar.gz\n", "Collecting ordered-set\n", " Downloading https://files.pythonhosted.org/packages/f5/ab/8252360bfe965bba31ec05112b3067bd129ce4800d89e0b85613bc6044f6/ordered-set-4.0.2.tar.gz\n", "Collecting colorama\n", " Downloading https://files.pythonhosted.org/packages/44/98/5b86278fbbf250d239ae0ecb724f8572af1c91f4a11edf4d36a206189440/colorama-0.4.4-py2.py3-none-any.whl\n", "Collecting pytest-cov\n", " Downloading https://files.pythonhosted.org/packages/e3/1a/6affecd2344efee7f2487fac82242474cbac09f9e04929da5944907baf11/pytest_cov-2.11.1-py2.py3-none-any.whl\n", "Collecting pipdeptree\n", " Downloading https://files.pythonhosted.org/packages/fa/22/8f1350b55e4297670813815142425b58829036197f0b4a0fc8f543928717/pipdeptree-2.0.0-py3-none-any.whl\n", "Requirement already satisfied: psutil in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (5.4.8)\n", "Requirement already satisfied: tabulate in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (0.8.7)\n", "Collecting oyaml\n", " Downloading https://files.pythonhosted.org/packages/37/aa/111610d8bf5b1bb7a295a048fc648cec346347a8b0be5881defd2d1b4a52/oyaml-1.0-py2.py3-none-any.whl\n", "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from cloudmesh-installer) (2.23.0)\n", "Requirement already satisfied: pathlib in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common->cloudmesh-installer) (1.0.1)\n", "Collecting simplejson\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/73/96/1e6b19045375890068d7342cbe280dd64ae73fd90b9735b5efb8d1e044a1/simplejson-3.17.2-cp36-cp36m-manylinux2010_x86_64.whl (127kB)\n", "\u001b[K |████████████████████████████████| 133kB 32.1MB/s \n", "\u001b[?25hCollecting pyfiglet\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/33/07/fcfdd7a2872f5b348953de35acce1544dab0c1e8368dca54279b1cde5c15/pyfiglet-0.8.post1-py2.py3-none-any.whl (865kB)\n", "\u001b[K |████████████████████████████████| 870kB 32.9MB/s \n", "\u001b[?25hRequirement already satisfied: pytz in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common->cloudmesh-installer) (2018.9)\n", "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common->cloudmesh-installer) (2.8.1)\n", "Requirement already satisfied: click>=7 in /usr/local/lib/python3.6/dist-packages (from pip-tools->cloudmesh-installer) (7.1.2)\n", "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from pip-tools->cloudmesh-installer) (1.15.0)\n", "Collecting pyflakes<2.3.0,>=2.2.0\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/69/5b/fd01b0c696f2f9a6d2c839883b642493b431f28fa32b29abc465ef675473/pyflakes-2.2.0-py2.py3-none-any.whl (66kB)\n", "\u001b[K |████████████████████████████████| 71kB 6.4MB/s \n", "\u001b[?25hRequirement already satisfied: importlib-metadata; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from flake8->cloudmesh-installer) (3.4.0)\n", "Collecting pycodestyle<2.7.0,>=2.6.0a1\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/10/5b/88879fb861ab79aef45c7e199cae3ef7af487b5603dcb363517a50602dd7/pycodestyle-2.6.0-py2.py3-none-any.whl (41kB)\n", "\u001b[K |████████████████████████████████| 51kB 4.6MB/s \n", "\u001b[?25hCollecting mccabe<0.7.0,>=0.6.0\n", " Downloading https://files.pythonhosted.org/packages/87/89/479dc97e18549e21354893e4ee4ef36db1d237534982482c3681ee6e7b57/mccabe-0.6.1-py2.py3-none-any.whl\n", "Requirement already satisfied: py>=1.5.0 in /usr/local/lib/python3.6/dist-packages (from pytest->cloudmesh-installer) (1.10.0)\n", "Requirement already satisfied: setuptools in /usr/local/lib/python3.6/dist-packages (from pytest->cloudmesh-installer) (53.0.0)\n", "Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.6/dist-packages (from pytest->cloudmesh-installer) (20.3.0)\n", "Requirement already satisfied: atomicwrites>=1.0 in /usr/local/lib/python3.6/dist-packages (from pytest->cloudmesh-installer) (1.4.0)\n", "Requirement already satisfied: pluggy<0.8,>=0.5 in /usr/local/lib/python3.6/dist-packages (from pytest->cloudmesh-installer) (0.7.1)\n", "Requirement already satisfied: more-itertools>=4.0.0 in /usr/local/lib/python3.6/dist-packages (from pytest->cloudmesh-installer) (8.7.0)\n", "Requirement already satisfied: pip>=6.0.0 in /usr/local/lib/python3.6/dist-packages (from pipdeptree->cloudmesh-installer) (19.3.1)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from oyaml->cloudmesh-installer) (3.13)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-installer) (2020.12.5)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-installer) (2.10)\n", "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-installer) (1.24.3)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-installer) (3.0.4)\n", "Requirement already satisfied: typing-extensions>=3.6.4; python_version < \"3.8\" in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->cloudmesh-installer) (3.7.4.3)\n", "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.6/dist-packages (from importlib-metadata; python_version < \"3.8\"->flake8->cloudmesh-installer) (3.4.0)\n", "Building wheels for collected packages: python-hostlist, ordered-set\n", " Building wheel for python-hostlist (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for python-hostlist: filename=python_hostlist-1.21-cp36-none-any.whl size=38931 sha256=178714a9795bc65441e9c37ea25250ea4c5687e434fcf354525aada31f63b398\n", " Stored in directory: /root/.cache/pip/wheels/0b/5b/55/ddcf52288f0b10f4564ca1b2531594ff7ccc65f487ba8dc437\n", " Building wheel for ordered-set (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Created wheel for ordered-set: filename=ordered_set-4.0.2-py2.py3-none-any.whl size=8210 sha256=838223cf6acbeb0cad334caeca285e0d7fdd3b3c55fb0b3548c70f29769ae78f\n", " Stored in directory: /root/.cache/pip/wheels/e1/c6/9b/651d8a21d59b51a75ab9c070838f9231b8126421bc0569af47\n", "Successfully built python-hostlist ordered-set\n", "\u001b[31mERROR: pytest-cov 2.11.1 has requirement coverage>=5.2.1, but you'll have coverage 3.7.1 which is incompatible.\u001b[0m\n", "\u001b[31mERROR: pytest-cov 2.11.1 has requirement pytest>=4.6, but you'll have pytest 3.6.4 which is incompatible.\u001b[0m\n", "Installing collected packages: bump2version, simplejson, python-hostlist, colorama, pyfiglet, oyaml, cloudmesh-common, pyflakes, pycodestyle, mccabe, flake8, ordered-set, pytest-cov, pipdeptree, cloudmesh-installer\n", "Successfully installed bump2version-1.0.0 cloudmesh-common-4.3.43 cloudmesh-installer-4.4.19 colorama-0.4.4 flake8-3.8.4 mccabe-0.6.1 ordered-set-4.0.2 oyaml-1.0 pipdeptree-2.0.0 pycodestyle-2.6.0 pyfiglet-0.8.post1 pyflakes-2.2.0 pytest-cov-2.11.1 python-hostlist-1.21 simplejson-3.17.2\n", "Requirement already satisfied: cloudmesh-common in /usr/local/lib/python3.6/dist-packages (4.3.43)\n", "Requirement already satisfied: pyfiglet in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (0.8.post1)\n", "Requirement already satisfied: tabulate in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (0.8.7)\n", "Requirement already satisfied: python-dateutil in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (2.8.1)\n", "Requirement already satisfied: requests in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (2.23.0)\n", "Requirement already satisfied: python-hostlist in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (1.21)\n", "Requirement already satisfied: pytz in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (2018.9)\n", "Requirement already satisfied: humanize in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (0.5.1)\n", "Requirement already satisfied: colorama in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (0.4.4)\n", "Requirement already satisfied: pathlib in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (1.0.1)\n", "Requirement already satisfied: simplejson in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (3.17.2)\n", "Requirement already satisfied: oyaml in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (1.0)\n", "Requirement already satisfied: psutil in /usr/local/lib/python3.6/dist-packages (from cloudmesh-common) (5.4.8)\n", "Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.6/dist-packages (from python-dateutil->cloudmesh-common) (1.15.0)\n", "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-common) (2.10)\n", "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-common) (3.0.4)\n", "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-common) (1.24.3)\n", "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests->cloudmesh-common) (2020.12.5)\n", "Requirement already satisfied: pyyaml in /usr/local/lib/python3.6/dist-packages (from oyaml->cloudmesh-common) (3.13)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "hphaPWTTykQ3" }, "source": [ "## Import Libraries" ] }, { "cell_type": "code", "metadata": { "id": "WgkHPJFRyqX3" }, "source": [ "import tensorflow as tf\n", "from keras.layers import Dense, Input\n", "from keras.layers import Conv2D, Flatten\n", "from keras.layers import Reshape, Conv2DTranspose\n", "from keras.models import Model\n", "from keras.datasets import mnist\n", "from keras.utils import plot_model\n", "from keras import backend as K\n", "\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ], "execution_count": 2, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "ddMxLkIpyrWE" }, "source": [ "## Pre-Process Data" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Xn74QLyOyqtg", "outputId": "aab1dea0-8d6d-42cb-8ed9-75f7a887ed9f" }, "source": [ "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", "\n", "image_size = x_train.shape[1]\n", "x_train = np.reshape(x_train, [-1, image_size, image_size, 1])\n", "x_test = np.reshape(x_test, [-1, image_size, image_size, 1])\n", "x_train = x_train.astype('float32') / 255\n", "x_test = x_test.astype('float32') / 255\n", "\n", "input_shape = (image_size, image_size, 1)\n", "batch_size = 32\n", "kernel_size = 3\n", "latent_dim = 16\n", "hidden_units = [32, 64]" ], "execution_count": 3, "outputs": [ { "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n", "11493376/11490434 [==============================] - 0s 0us/step\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "8QIbPwN1yztF" }, "source": [ "## Define Model" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "3YupM99Jy1Tk", "outputId": "f1e94abe-2071-4be2-ff8e-f524cabb28df" }, "source": [ "inputs = Input(shape=input_shape, name='encoder_input')\n", "x = inputs\n", "x = Dense(hidden_units[0], activation='relu')(x)\n", "x = Dense(hidden_units[1], activation='relu')(x)\n", "\n", "shape = K.int_shape(x)\n", "\n", "# generate latent vector\n", "x = Flatten()(x)\n", "latent = Dense(latent_dim, name='latent_vector')(x)\n", "\n", "# instantiate encoder model\n", "encoder = Model(inputs,\n", " latent,\n", " name='encoder')\n", "encoder.summary()\n", "plot_model(encoder,\n", " to_file='encoder.png',\n", " show_shapes=True)\n", "\n", "\n", "latent_inputs = Input(shape=(latent_dim,), name='decoder_input')\n", "x = Dense(shape[1] * shape[2] * shape[3])(latent_inputs)\n", "x = Reshape((shape[1], shape[2], shape[3]))(x)\n", "x = Dense(hidden_units[0], activation='relu')(x)\n", "x = Dense(hidden_units[1], activation='relu')(x)\n", "\n", "outputs = Dense(1, activation='relu')(x)\n", "\n", "decoder = Model(latent_inputs, outputs, name='decoder')\n", "decoder.summary()\n", "plot_model(decoder, to_file='decoder.png', show_shapes=True)\n", "\n", "autoencoder = Model(inputs,\n", " decoder(encoder(inputs)),\n", " name='autoencoder')\n", "autoencoder.summary()\n", "plot_model(autoencoder,\n", " to_file='autoencoder.png',\n", " show_shapes=True)\n", "\n", "autoencoder.compile(loss='mse', optimizer='adam')\n" ], "execution_count": 5, "outputs": [ { "output_type": "stream", "text": [ "Model: \"encoder\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "encoder_input (InputLayer) [(None, 28, 28, 1)] 0 \n", "_________________________________________________________________\n", "dense_2 (Dense) (None, 28, 28, 32) 64 \n", "_________________________________________________________________\n", "dense_3 (Dense) (None, 28, 28, 64) 2112 \n", "_________________________________________________________________\n", "flatten_1 (Flatten) (None, 50176) 0 \n", "_________________________________________________________________\n", "latent_vector (Dense) (None, 16) 802832 \n", "=================================================================\n", "Total params: 805,008\n", "Trainable params: 805,008\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "Model: \"decoder\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "decoder_input (InputLayer) [(None, 16)] 0 \n", "_________________________________________________________________\n", "dense_4 (Dense) (None, 50176) 852992 \n", "_________________________________________________________________\n", "reshape (Reshape) (None, 28, 28, 64) 0 \n", "_________________________________________________________________\n", "dense_5 (Dense) (None, 28, 28, 32) 2080 \n", "_________________________________________________________________\n", "dense_6 (Dense) (None, 28, 28, 64) 2112 \n", "_________________________________________________________________\n", "dense_7 (Dense) (None, 28, 28, 1) 65 \n", "=================================================================\n", "Total params: 857,249\n", "Trainable params: 857,249\n", "Non-trainable params: 0\n", "_________________________________________________________________\n", "Model: \"autoencoder\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "encoder_input (InputLayer) [(None, 28, 28, 1)] 0 \n", "_________________________________________________________________\n", "encoder (Functional) (None, 16) 805008 \n", "_________________________________________________________________\n", "decoder (Functional) (None, 28, 28, 1) 857249 \n", "=================================================================\n", "Total params: 1,662,257\n", "Trainable params: 1,662,257\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "HQNYHvKqy_Xs" }, "source": [ "## Train" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "IAiA2IwdzAfW", "outputId": "aac0a822-65f7-4d74-87f2-527eace8e711" }, "source": [ "autoencoder.fit(x_train,\n", " x_train,\n", " validation_data=(x_test, x_test),\n", " epochs=1,\n", " batch_size=batch_size)" ], "execution_count": 6, "outputs": [ { "output_type": "stream", "text": [ "1875/1875 [==============================] - 112s 60ms/step - loss: 0.0268 - val_loss: 0.0131\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "ysFcUzNezEcM" }, "source": [ "## Test" ] }, { "cell_type": "code", "metadata": { "id": "mMOrXnYjzGDR" }, "source": [ "x_decoded = autoencoder.predict(x_test)" ], "execution_count": 8, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "nh2-sRoNzJz7" }, "source": [ "## Visualize" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 264 }, "id": "c8zY_aItzLA1", "outputId": "ebc777d5-be89-4b50-9bdb-38d162f8f364" }, "source": [ "imgs = np.concatenate([x_test[:8], x_decoded[:8]])\n", "imgs = imgs.reshape((4, 4, image_size, image_size))\n", "imgs = np.vstack([np.hstack(i) for i in imgs])\n", "plt.figure()\n", "plt.axis('off')\n", "plt.title('Input: 1st 2 rows, Decoded: last 2 rows')\n", "plt.imshow(imgs, interpolation='none', cmap='gray')\n", "plt.savefig('input_and_decoded.png')\n", "plt.show()" ], "execution_count": 9, "outputs": [ { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPkAAAD3CAYAAADfRfLgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO2dd7gU1fnHP0eUYCEKIhgELNgRUWNBjAIqiIoFsQt2FEvsJflhSSwhMRpsEdREjF0DVhBBFBARC0pUmopERUA0IEgTjM7vj5nvnr3L3Vt2792Znbyf5+Hh7u7M7JmdOfM95z1vcUEQYBhGelkn7gYYhlG/WCc3jJRjndwwUo51csNIOdbJDSPlWCc3jJRjndyoN5xzXZxzX5ZiX+dc4JzbtpDvSjvVdnLn3GfOuYPruyHOud855x6p5T4XOuemOOdWO+cerMV+VZ6Tc66jc+5l59xi59w3zrl/Oud+UZu2xUl0fqucc8ucc0ucc2845/o75+yhXgXOufHOubOr+Hx759xz0T2x2Dk32jm3QynbWAjlftHnAzcBD9TxcZsA9wFbAVsCy4ChNdnRhSThdz0iCILGhO3/I3A18Pd4m1T2bAI8D+wAtADeBp6r6c7OuQb11K6qCYKgyn/AZ8DB0d+nA68DtwLfAv8GDs3adjwwkPDkvyP8AZpGn3UBvqzs2EAPYA3wA7AceL+6duUc5ybgwZz3mgEjgCXAYmAi4UPtYeAnYFX0XVfV4Ph7AMuq+Hw8cDMwKTrutkAn4B1gafR/p2jbrsCHWfu+DLyT9XoicHT099XAPMKHzEfAQTX8PTLXLOu9vaPz3iV6/bPoOn4BLASGAOtnbX8U8K/oOn4K9Ijeb0l4oy8GZgP9svZZH3gwujdmAFdmX/No3+HAN9G9c1FN963BOQfAttHfhwNTo7bPBX6XtV0j4BFgUXRvvEPYYW8GfgS+j+6Lu2vwnU2j7900z+cPAoOBF4EVhPf6TtH9sgSYDhwZbbt19N460ev7ga+zjvUwcElWP5wT3Rf/Bk6psp0FdPIfgH5AA+A8QjV1WTf7PGAXYMPogj5SXSeP/v6dts36/DfAiAI7+UDCG3e96N/+We3MfG8Nb6BLgDer6eRfAO2AdaOb5lugb/T6pOj1ptHN/D3hQ2g9wg42D2gcfbYq2m6H6AZtGX3HVkDbQjt59P4XwHnR34MIO2vT6LtfAAZmPRCWAt0IH4xbADtGn70G3EPYWXYj7LAHRp/9kfAh1RRoDUzTNY+O8y5wHdAQ2Ca6UQ+pbt/o83uAe2rYybsA7aPv3DX6jfXgPDc61w0I7+FfAj/Puo5n1+K+OBpYUMXnD0a/435RWxoTPhj/L/oNDiTsqDtkXZ9fRn9/FP0+O2V9tjthv/oua59fAO3qupPPzvpsg+jH3TzrR/pj1uc7Eyp0Awro5LX4sSvr5DcQjiS2rWknyHPsXQlVa/9qOvkNWa/7Am/nbDMZOD36eyJwDNARGAM8RTia6Qp8EG2zLfA14dN/vVr+HpWeH/AmMABwhMrSNuuzfYF/R3/fCwyqZP/WhGrXOOu9gfrto5uyR9Zn5+A7+T7AFznH+y0wtLp9a3jOmU5eyWe363yAM4E3gF3zXMcadXKgFeHD+aQqtnkQeCjr9f7AV0RqHb33ONFIg1CtLwM2J+zktwD9yVJ5wk6+BOhN1sirqn+FzB2/0h9BEKyM/two6/O5WX9/TqhWzQr4nmL5M+FTc4xzbo5z7je1PUBkrR0FXBwEwcRqNs8+75aE557N54SKCDCB8KF3QPT3eKBz9G8CQBAEswlHEL8DvnbOPeGca1nbc8hhC8IH1maED+h3I8PcEuCl6H0IO/OnlezfElgcBMGyPOfVkrWvv9gSaKnvi77z/whHPdXtWyucc/s458ZFBrKlhB1F9+DDwGjgCefcfOfcLc659Wp5/M0IH873BEHweDWb594Xc4Mg+CnrvXz3xWtUvC8mBkHwUxAEK4ATonNa4Jwb6ZzbsaoG1IeBqHXW320Ih/f/IVSODfRBZITYLGvbOg2HC4JgWRAElwdBsA1wJHCZc+6gmn6Xc25LYCxwYxAED9fkK7P+nk94U2fThvDJD2t38gnkdPLoHB4LguBX0bEC4E81aEelOOf2IryZXie8HqsIh3mbRP82DoJAD+u5QNtKDjMfaOqca5znvBaw9vUXcwlHCptk/WscBMFhNdi3tjxGOBVpHQTBxoTTNgcQBMEPQRD8PgiCnQntJj2BU6P9anJfNCHs4M8HQXBzDdqSe1+0zjHM5t4X+xPeGxMIr9V+rH1fjA6CoBvhUH0W4fw9L/XRyfs453Z2zm1AOGQeFgTBj8DHQCPn3OHRk/MaQuOPWAhsVRvLtHNuXedcI8LpQAPnXCPn3LrRZz2dc9s65xzhvOhHQsOTvmubKo67BfAqofFlSE3bk8WLwPbOuZOjNp5AOHUZEX3+BuGce2/CYf10wo68D+ETHOfcDs65A51zPyOcw69S+6M15Bo9FJ1zP3fO9QSeIJwOfRgpyf3AIOdcc52zc+6QaLe/A2c45w5yzq0TfbZjEARzo7YPjH7rXYGzCA1ZEE47fuuca+KcawX8OqspbwPLnHNXO+fWd841cM7tEj18qtu3tjQmHHF875zbGzg56/fo6pxrH4nMd4QiVNP74ueEo4BJQRDUemQIvAWsBK5yzq3nnOsCHEF4bQiC4BPC69wHmBAEwXdRm3oTdXLnXAvn3FHOuQ2B1YRGwp9yv6gCtZnfEVnX882FWNu6/gLQLGvb0wmf2F8DV+Qce1PCJ9e3wHvRe/8HjKqibb+Lvj/7n+Y3l0bHXwF8CVybtd9RhIaMJcAVlRz3+uhYy7P/VdGO8eTM5YBfERqalkb//yrn88nAuKzXw4CZWa93jX7HZYRD7BF4I1xfwhutqmu2Ktp3afRdFwANsrZpBPyBcC78HTCTitbuXsAH0TFm4w1kraK2LCYc0vfP2mcD4KHod81nXX+ccMr3LaGN4OAa7jsEGFLFOWffh8cSDoOXRW29G28APolwvruCsAPdCawbfbYvoRh9C9xZyXecFn3Pipx7o02eNj0I3JTzXjvCDrs0Os9eOZ8/TmQbiV7fGp1Hg+j1L7L2X0J47+1cVR+WtblOcM6Nj37Mv9XZQY21cM79DfhnEASj426LkXzWjbsBRu0JgiCvV5Zh5JIEzyzDMOqROh2uG4aRPEzJDSPlFD0nr+lSjmEYhRMEgSt0X1Nyw0g51skNI+VYJzeMlGOd3DBSjnVyw0g55vFWIs4991wAGjVqBMBOO+0EwOGHH15hu4cfDgPe3n33XQCGDx9eqiYaKcWU3DBSTtEeb7ZOXjWDBw8G1lbs6vj88zBnwgknnADA/Pnz67ZhMbHVVlsBMHFimIPjuuuuA2Do0KFxNanGrL/++gBce+21APTp0weA999/H4D+/fsDMG/evEr2Lg5bJzcMIy82J68nqlPw2bNnAzBhQpjwo02bMBFKt27dANhyyzCxTO/evQG466676q+xJaR9+/YA/PRTmOfgq6++qmrzRNGiRZip6uSTwxwUOocOHToAcPDBYSr/f/zjHzG0Lj+m5IaRckzJ65hdd90VgB49elR4/6OPPgLgjDPOAGDx4sUArFwZ5sJcb70wl+ALL7wAwM477wzAJptsUs8tLi3t2rUD/HmPGjUqzubUiKZNmwJw++23x9ySwjAlN4yUU3Il1xxV85qFCxcCsHr16sya8H/+8x8APvvss1I3r2iaN28OQJg/0iv4KaecAsDXX39d6X6yzG633XYV3n/llVfqpZ2lZscdw6zBZ555JgDDhg2Lszk1QqMujcp22223Krfv2LEjAOusE2rnjBkzeOutt+qxhTXDlNwwUk7J18nfeOMNAFq3bp13m+XLlwPw8ccfF9EyWLBgAQD33HMPAB988EFRx6sNW2wR5stfsWIFAEuWLKly+zFjxgBe8cSJJ54I+N+tXNEIbsiQMMP1cccdB8Cbb74ZW5uq44svvgC8FT0fUu7c7ebOnct5550HwLRp04pqi62TG4aRl5LPya+88krAW48/+eQTIJyL7rLLLgB06tQJgD322APw3l4tW1ZeJei///0vAIsWLQL8eqaQB1IplbymXk+ai2+zTcWc/lOnTgXgvffeq9uGxYTO88svvwS8l1gSeeihhwBvV5FS5+Pbb78F/KitVatWQOjr8OKLLwLeDyIOSt7JJ02aVOF/MX78+MzfG2+8MUCm0+uGkNNBLqtXrwZgzpw5gHcw0fKTXESTxEEHhRWbrrjiCgAaNmwIeKPjwIEDAfj+++9jaF3doRteRitdo1WrVsXWpnzIcNa2bVghSlPZfMN1BRPpflu2LCwRJ5G6+OKLM9v27du3wj6lxIbrhpFyEukMs3TpUmBttc99ncuhhx4K+JHAzJkzAXj++efruolFI6cZKbhQW5NskKoNUkehKVWS0GhDBlo5v+Qyd25YoFRD8EGDBgFrj7Y0JenTpw+bbropANdccw3gQ40VkKOpZn1iSm4YKSeRSl5b9LTUPFYGEz1pq1u+KiV///vfAejcuXOF9+Uccsstt5S8TfWJkmMIqWWSWHfdsBvkU3CNqrQcJkNbPmR0vfvuu7n++usBH6Y6YMAAwC+ZlsJeZEpuGCknFUp++umnA17Rpdyy5CYBubvuueeegJ+LK1DljjvuAHzgRrmj5c/jjz8e8M4gShZRDmhV57LLLgOqV/BcxowZQ69evYDqXWLrE1Nyw0g5Za3kUsULLrigwvtnnx1W9lVwSBK4//77AWjSpEmF959++mkgmWv5xfCrX/0K8L4K8oOQT0MSyXV6OeKII4o6nnMuYx/Kday5/PLLAbjooouK+o6aYEpuGCmnrJX8wAMPBHzChddffx3w6YyTgNI5yXtPTJ48GYBbb7215G0qBXJbFiNHjoypJdUjb7TqAlFqS7du3TLprnK952677bY6/a6qMCU3jJRTlkour6GuXbsCsGbNGsCrYim8iKpDc9Ff//rXgB9tiOnTpwPpsaaLzTbbDIB99tkHgE8//RSAl156KbY2VYdGW8Widfbtt98e8Nc+G3n8/fDDD3XynTXBlNwwUk5ZKrnCFjXPHTduHJCsubjKIuWuj0rR0joX17p4s2bNAH9t/heQpVx+G9nI7/3SSy8FSlssw5TcMFJOWSm5YrAvueQSwMfvJjFV7jnnnFPp+4pGSttcXCiiSyiiMM0oyYTi0CtDxTTefvvtkrQpG1Nyw0g5ZaHkslTfcMMNADRo0ADw6YrLKUWSzqU666pGKVopWHfddWncuHGFbRQ3n2/U8OOPPwJw8803A6XJMqNSQWLs2LH1/p3Fki/Nk1ZvhCIEc9OLaf+qkqKedtppRbezUEzJDSPlJFrJ9WR99NFHAZ8MT0UXytFCXVNlGzFiBOCLTzRr1oyjjjqqoO/85ptvALjzzjsL2r8m7L333oBfJy8nNKdWrLdQ4cJcT7jc1/lSMkM8Od1yMSU3jJSTaCWXcisfmvj9738PJDty69VXXwXgkEMOKWj/nj175v1M8/Rc5Xj55ZeBtdMdl8Kiq1JCspcoflw++klGOdvkf6G8BLVF3myypF911VWZkVicmJIbRspJpJKrxNATTzxR4f0bb7wRKA+Lbb9+/QCfFyzXd12owGG++bZ+A2UABa88Uow4URyBIgKFos7qOrKrPlBOtvPPPx/wo5KzzjqrVseRzUNz+aRgSm4YKafkBQ9rwlVXXQWsHcWjonmlLHdkVI0yneaWnVa2nnKuANOlSxfAl51WtJoyrWrVR+vkKtBZH37pVvDQMIy8JErJtdaqdcsNN9ywwuem5Mb/KqbkhmHkJVHWdSl5roLLw02lYQ3DqDmm5IaRchKl5LnMmDEDgBNOOAFIVk0zwygXTMkNI+UkyrpuGEblmHXdMIy8WCc3jJRjndwwUo51csNIOdbJDSPlWCc3jJRjndwwUo51csNIOdbJDSPlWCc3jJSTqAAVlSL+29/+BkDHjh0LOs4BBxwAwCeffALAggUL6qB1pUXlhoYOHQqEhRKVqD8pyRE33XRThgwZAsCUKVMAnxIpO/FkIagk1D777APA+PHjAZ+O2qg5puSGkXISpeRKnNewYcOijqOEeyeeeCLgU+2WAyqIOHDgwArv33TTTTz55JNA/MkRVWhx3LhxGcVVAse6UnClnW7WrBkAhx56KOATiJSSjTbaCIDf/va3AOywww6Av7+SProwJTeMlJMYJW/QoMFaCfoLRYkeVdJ3/fXXB2DVqlV1cvz6RHaIzTffvML7zz77bOwK3qRJE4DMPHyTTTbJFBK49tpr6+Q7Lr74YgC23HJLAK6++mogHgXv1atXhTa0bNmywudS+KQnMzElN4yUkxgl33ffffnlL38JwD333FPUsTSv3X777YHyUHLZIXILSoinn366lM2plPbt2wPhtRKDBg2qk2PrWp177rkAjBo1CoDnn3++To5fG37xi18AvrCmRjC5CVZUtkujmKQquim5YaSc2JV8xx13BGDw4MGZUsR33XVXUcfs3r170e0qNTvttBOwdplmWW7HjRtX8jYJlfI97LDDKrx/+eWXs3jx4qKOLQXPLW4pJY8jDbdGExoR5kNFKrUqpPtWvg0//PBDPbWwdpiSG0bKiV3JL7roIiCcN/fp0weAlStXFnQsPXlloS42SWUpUbncXF577bUSt2RtrrvuOgCOOeYYAD788EMARowYUfSx5dG22WabAfDUU08B8MwzzxR97NqiktlKAS5mzpwJwDfffAPA/vvvX+Fz+Q30798f8G3X9nFjSm4YKSc2JVfxQq2Nf/bZZ7z//vtFHVOjAin45MmTAfjuu++KOm4pyPXTX7NmDQB/+tOf4mhOBfR76v+FCxcChc05GzVqBPhVhFNPPbXCsS+//PLiGlsE7dq1A/z691tvvQXAscceC8DPfvYzAI4++mgALrzwQgC22morwI9GHnjgAQD69u2bCIu7KblhpJzYlLxnz56AX8NWueJCaNWqFeA9lH788UcA7rzzTiDZvsXyDdhzzz0rvC+7hEpFJYmDDjoIgMceeywzSqru+mmk0qlTJwD22GOPCp+PHDmyrptZa+SroFHF/fffX+Hz1atXA2RiCDQalXeec2H9A/ljaDQWN6bkhpFySq7kijLKfZIX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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] } ] }