{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Convolutional Autoencoder\n", "\n", "Sticking with the MNIST dataset, let's improve our autoencoder's performance using convolutional layers. Again, loading modules and the data." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "import tensorflow as tf\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Extracting MNIST_data/train-images-idx3-ubyte.gz\n", "Extracting MNIST_data/train-labels-idx1-ubyte.gz\n", "Extracting MNIST_data/t10k-images-idx3-ubyte.gz\n", "Extracting MNIST_data/t10k-labels-idx1-ubyte.gz\n" ] } ], "source": [ "from tensorflow.examples.tutorials.mnist import input_data\n", "mnist = input_data.read_data_sets('MNIST_data', validation_size=0)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "img = mnist.train.images[2]\n", "plt.imshow(img.reshape((28, 28)), cmap='Greys_r')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Network Architecture\n", "\n", "The encoder part of the network will be a typical convolutional pyramid. Each convolutional layer will be followed by a max-pooling layer to reduce the dimensions of the layers. The decoder though might be something new to you. The decoder needs to convert from a narrow representation to a wide reconstructed image. For example, the representation could be a 4x4x8 max-pool layer. This is the output of the encoder, but also the input to the decoder. We want to get a 28x28x1 image out from the decoder so we need to work our way back up from the narrow decoder input layer. A schematic of the network is shown below.\n", "\n", "\n", "\n", "Here our final encoder layer has size 4x4x8 = 128. The original images have size 28x28 = 784, so the encoded vector is roughly 16% the size of the original image. These are just suggested sizes for each of the layers. Feel free to change the depths and sizes, but remember our goal here is to find a small representation of the input data.\n", "\n", "### What's going on with the decoder\n", "\n", "Okay, so the decoder has these \"Upsample\" layers that you might not have seen before. First off, I'll discuss a bit what these layers *aren't*. Usually, you'll see **transposed convolution** layers used to increase the width and height of the layers. They work almost exactly the same as convolutional layers, but in reverse. A stride in the input layer results in a larger stride in the transposed convolution layer. For example, if you have a 3x3 kernel, a 3x3 patch in the input layer will be reduced to one unit in a convolutional layer. Comparatively, one unit in the input layer will be expanded to a 3x3 path in a transposed convolution layer. The TensorFlow API provides us with an easy way to create the layers, [`tf.nn.conv2d_transpose`](https://www.tensorflow.org/api_docs/python/tf/nn/conv2d_transpose). \n", "\n", "However, transposed convolution layers can lead to artifacts in the final images, such as checkerboard patterns. This is due to overlap in the kernels which can be avoided by setting the stride and kernel size equal. In [this Distill article](http://distill.pub/2016/deconv-checkerboard/) from Augustus Odena, *et al*, the authors show that these checkerboard artifacts can be avoided by resizing the layers using nearest neighbor or bilinear interpolation (upsampling) followed by a convolutional layer. In TensorFlow, this is easily done with [`tf.image.resize_images`](https://www.tensorflow.org/versions/r1.1/api_docs/python/tf/image/resize_images), followed by a convolution. Be sure to read the Distill article to get a better understanding of deconvolutional layers and why we're using upsampling.\n", "\n", "> **Exercise:** Build the network shown above. Remember that a convolutional layer with strides of 1 and 'same' padding won't reduce the height and width. That is, if the input is 28x28 and the convolution layer has stride = 1 and 'same' padding, the convolutional layer will also be 28x28. The max-pool layers are used the reduce the width and height. A stride of 2 will reduce the size by a factor of 2. Odena *et al* claim that nearest neighbor interpolation works best for the upsampling, so make sure to include that as a parameter in `tf.image.resize_images` or use [`tf.image.resize_nearest_neighbor`]( `https://www.tensorflow.org/api_docs/python/tf/image/resize_nearest_neighbor). For convolutional layers, use [`tf.layers.conv2d`](https://www.tensorflow.org/api_docs/python/tf/layers/conv2d). For example, you would write `conv1 = tf.layers.conv2d(inputs, 32, (5,5), padding='same', activation=tf.nn.relu)` for a layer with a depth of 32, a 5x5 kernel, stride of (1,1), padding is 'same', and a ReLU activation. Similarly, for the max-pool layers, use [`tf.layers.max_pooling2d`](https://www.tensorflow.org/api_docs/python/tf/layers/max_pooling2d)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "inputs_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='inputs')\n", "targets_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='targets')\n", "\n", "### Encoder\n", "conv1 = tf.layers.conv2d(inputs_, 16, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 28x28x16\n", "maxpool1 = tf.layers.max_pooling2d(conv1, (2,2), (2,2), padding='same')\n", "# Now 14x14x16\n", "conv2 = tf.layers.conv2d(maxpool1, 8, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 14x14x8\n", "maxpool2 = tf.layers.max_pooling2d(conv2, (2,2), (2,2), padding='same')\n", "# Now 7x7x8\n", "conv3 = tf.layers.conv2d(maxpool2, 8, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 7x7x8\n", "encoded = tf.layers.max_pooling2d(conv3, (2,2), (2,2), padding='same')\n", "# Now 4x4x8\n", "\n", "### Decoder\n", "upsample1 = tf.image.resize_nearest_neighbor(encoded, (7,7))\n", "# Now 7x7x8\n", "conv4 = tf.layers.conv2d(upsample1, 8, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 7x7x8\n", "upsample2 = tf.image.resize_nearest_neighbor(conv4, (14,14))\n", "# Now 14x14x8\n", "conv5 = tf.layers.conv2d(upsample2, 8, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 14x14x8\n", "upsample3 = tf.image.resize_nearest_neighbor(conv5, (28,28))\n", "# Now 28x28x8\n", "conv6 = tf.layers.conv2d(upsample3, 16, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 28x28x16\n", "\n", "logits = tf.layers.conv2d(conv6, 1, (3,3), padding='same', activation=None)\n", "#Now 28x28x1\n", "\n", "decoded = tf.nn.sigmoid(logits, name='decoded')\n", "\n", "loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=targets_, logits=logits)\n", "cost = tf.reduce_mean(loss)\n", "opt = tf.train.AdamOptimizer(0.001).minimize(cost)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Training\n", "\n", "As before, here wi'll train the network. Instead of flattening the images though, we can pass them in as 28x28x1 arrays." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sess = tf.Session()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "scrolled": true }, "outputs": [], "source": [ "epochs = 20\n", "batch_size = 200\n", "sess.run(tf.global_variables_initializer())\n", "for e in range(epochs):\n", " for ii in range(mnist.train.num_examples//batch_size):\n", " batch = mnist.train.next_batch(batch_size)\n", " imgs = batch[0].reshape((-1, 28, 28, 1))\n", " batch_cost, _ = sess.run([cost, opt], feed_dict={inputs_: imgs,\n", " targets_: imgs})\n", "\n", " print(\"Epoch: {}/{}...\".format(e+1, epochs),\n", " \"Training loss: {:.4f}\".format(batch_cost))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABawAAAEsCAYAAAAvofT2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xm8neO5MP4nQoQMpkhMiZg1OYYYgxhLj/koNdRYaopZ\nqXksihLV49AaqoYPp6+hBCVtEYpDQ4w1RRIkhiAkRCYR+f3xvv38znNfN3tl7bV3np39/f53Xb3W\n2nfsez/Ps+6uz3V1mDNnTgEAAAAAAPPaAvN6AQAAAAAAUBQOrAEAAAAAqAgH1gAAAAAAVIIDawAA\nAAAAKsGBNQAAAAAAleDAGgAAAACASnBgDQAAAABAJTiwBgAAAACgEhxYAwAAAABQCQvOTXGPHj3m\n9O3bt4WWQls3cuTIiXPmzFn62/53+4dvY+/QHPYPzWH/0Bz2D81h/9Ac9g/NYf/QHPYPzdHU/vmX\nuTqw7tu3b/Hcc8/Vvyrmax06dHj3u/53+4dvY+/QHPYPzWH/0Bz2D81h/9Ac9g/NYf/QHPYPzdHU\n/vkXLUEAAAAAAKiEufqG9f/WoUOHRq6DNmrOnDl1vc7+oSjsH5rH/qE56tk/9g5F4dpD89g/NIf9\nQ3PYPzSH/UNz1LN/fMMaAAAAAIBKcGANAAAAAEAlOLAGAAAAAKASHFgDAAAAAFAJDqwBAAAAAKgE\nB9YAAAAAAFSCA2sAAAAAACrBgTUAAAAAAJXgwBoAAAAAgEpwYA0AAAAAQCU4sAYAAAAAoBIcWAMA\nAAAAUAkOrAEAAAAAqIQF5/UCoC259NJLQ27RRRcNuQ022KAUDxw4sKb3v++++0rx8OHDQ82VV15Z\n03sBAAAAQFvjG9YAAAAAAFSCA2sAAAAAACrBgTUAAAAAAJXgwBoAAAAAgEowdBG+w1NPPVWKN9lk\nk7reZ86cOTXV7bLLLqV4s802CzXpYMaiKIqxY8fWtS7mb2uttVbIvfTSSyF3wQUXlOJzzz23xdZE\ny+vatWspvu2220JNeq0piqIYN25cKf7+978fasaMGdPM1QEAQPuw1FJLhdwaa6wx1+/zxhtvhNxF\nF10UculnvZdffjnU/M///M9c/3yYF3zDGgAAAACASnBgDQAAAABAJTiwBgAAAACgEvSwhv8n7Vdd\nFPX3rP74449L8fDhw0PNqquuGnLrr79+KV5yySVDzbHHHhtyJ5544twukXZg8803D7lcP/Xx48e3\nxnJoJX379i3FO++8c6jJ7YM+ffqU4v333z/UnH/++c1bHPPEFltsEXK5eQiLL754ayznW+2zzz4h\n949//KMUv/322621HOaRgw46KORuuummkDvvvPNK8YUXXhhqZs+e3ahlUaNll122FD/22GOh5skn\nnwy5Sy65pBS/9dZbDV1XIyyxxBIht+uuu4bc7bffXopnzZrVYmsC5p0DDjigFOeeYzbaaKOQy/W1\nbsrEiRNDLvfctuCCTR/xLbCA763SNtipAAAAAABUggNrAAAAAAAqwYE1AAAAAACV4MAaAAAAAIBK\nMHSRdmnrrbcOuY033rjJ102YMCHkttxyyybrpkyZEmo6deoUcmPGjCnFyy+/fKjp2bNnk+uEoiiK\nDTfcMORyg39uuOGG1lgOLWCZZZYJuaFDh86DlVBlu+22W8h17NhxHqzku+29994hd8wxx5TiQYMG\ntdZyaCXpc81VV11V0+vSoYuXXXZZqJk2bVrd66JpucFho0ePLsULL7xwqMkND2sLQxbTf1tRFEWX\nLl1CbuTIkaX4n//8Z2MX1s7lBs2lg1n79esXavr37x9yBmJSFEXxve99rxSfc845oWb33XcPuXTA\nYYcOHRq7sP+lR48eLfbeUFW+YQ0AAAAAQCU4sAYAAAAAoBIcWAMAAAAAUAltpof14YcfXoqPPfbY\nUPPRRx+FXNq77rrrrgs1Y8eODbnXXnttbpdIG9KnT5+Qy/WcSntR5/pcjx8/vq41XHrppSGX60eb\n+tOf/lTXz2P+l+7PfffdN9QMGzastZZDg/3iF78IuT333DPk+vbt25Cf94Mf/CDkFlgg/v/czz//\nfCnWQ3veS3sq7rLLLvNoJXPnySefDLmTTjqpFHft2jXUfPnlly22Jlpeuj+7detW0+ueeOKJUjx9\n+vSGrYmoV69eIffYY4+F3CKLLFKK77nnnlCzxx57NGxdLSntp572tC6Kojj99NNDTs/qxjnuuONC\nLvc81L179ybfK/f7+/jjj+tbGPOVNdZYoxTnZmq0tnRv5s6sqKZcD/3evXuHXPpZPTcb7Ztvvgm5\n//qv/yrFf/3rX0PN/HIf8g1rAAAAAAAqwYE1AAAAAACV4MAaAAAAAIBKcGANAAAAAEAltJmhi+mA\nusUWWyzU9O/fv8n32XnnnUPuq6++Crn3339/LlbXOtKhkmeeeWaoGT58eGstp027+eabQy437Onz\nzz8vxRMnTmzYGvbaa6+Q69ixY8Pen/ZnnXXWKcULLbRQqPnDH/7QWsuhwc4666yQmzNnTov9vIED\nB9aUmzx5cinODdPKDeai5aS/g5VXXjnU3HTTTa20mtr16NEj5NJBb4Yutm2dO3cOuXPPPbeu97r2\n2mtLcUteDymKrbfeOuTSQWU5Rx99dEssp+E22GCDkEsHYo0YMSLU/O53v2uxNbVH6eDoiy++ONSk\ngz1rddddd4Xc7rvvXoob+VmPlpUbBHvhhReW4tzZyO233x5yM2bMKMUzZ84MNbkzo06dOpXikSNH\nhpp0OHlRFMVTTz1VinPPyVOnTi3FnnWqYeONNw659DPaNttsE2rqvW7lXH755aU4N5jxk08+KcXP\nPvtsqPnRj34Ucrl9Pi/5hjUAAAAAAJXgwBoAAAAAgEpwYA0AAAAAQCU4sAYAAAAAoBLazNDFww8/\nvBSvt956oeaVV14JubXWWqsUb7LJJqFmwIABIbfSSiuV4i+++CLUdO/ePb/YJuSaok+bNq0U54YK\npWs69NBDQ42hi/UbM2ZMi733r371q5Dr2bNnk697++23Q27YsGENWRPznzPOOKMUp0NDi6IoHn74\n4dZaDs304osvluIOHTq06M+bPn16Kc4N3cgNPF5iiSVK8aOPPhpqFljA/z/eUnLDX9Lhqp999lmo\nOeGEE1psTfVKh18x/9l0001Drnfv3k2+LvfsfNtttzVkTeQtu+yypfiAAw6o6XU///nPS/GECRMa\ntqZGSocs1vIZ6r//+79DLvesRf3Sz0yNHFQ2aNCgkBs/fnwp/s1vfhNqzjnnnJCr2mCy+V3ubOS5\n554LueWXX74Up8MNv036+XrttdcONW+99VbIpUOt33nnnVCTu39RTelw+bPPPjvU5AYqLrzwwk2+\n95QpU0LupZdeKsWjRo0KNQcffHDIjRs3rhSvuOKKoaZLly6leIsttgg1p5xySsilg0vnNZ8gAQAA\nAACoBAfWAAAAAABUggNrAAAAAAAqoc30sL7zzju/M26OpZZaKuS23nrrUpzr+7rddtvV9fPSftVF\nURQjR44sxWPHjg01nTt3LsVvvvlmXT+flnfggQeW4hNPPDHUdOzYMeSmTp1aik866aQma2ifVltt\ntZDr06dPKZ44cWKo+fLLL1tsTdRvt912C7n09zlnzpxQk8vV4t577w25++67rxRPnjw51Pz7v/97\nyB1xxBFN/ry0B9wFF1zQ5GuozZAhQ0JuoYUWKsV77713qMn10mttPXr0KMWrr756qKl3j1NNtfZB\nTr388ssNXglNSfs1b7nllqEm7f9bFEVx7bXXttiaGmn77bcvxWm/z6IoikceeaQU5/obU79VVlkl\n5HbdddcmX/fhhx+GXDqroX///jWtIe09e/TRR4eaq666KuTef//9mt6f+nTq1KkUP/bYY6Em7Vdd\nFEXx+9//vhTXe2aU61edkzuzoW3485//HHJbbbVVKa61h/7rr79einPPLIccckjIpfODcnK99/fZ\nZ59SfPfdd4eadD5I7gzpF7/4RcjdcMMNpXhez6HwDWsAAAAAACrBgTUAAAAAAJXgwBoAAAAAgEpw\nYA0AAAAAQCW0maGLLenTTz8NubvuuqvJ1zVy8ONhhx1WitMBi0URB0xcc801Dfv5NNbAgQNLcW7A\nYs5DDz1UinOD0aAoimKXXXZpsubzzz9vhZUwt3IDM2+99daQW3TRRet6/3RY4gMPPBBqjjrqqJCr\nZaDrP//5z5BLh6jl1n3WWWeV4twQk3PPPTfkZs2a1eSa2pPDDz885DbYYIOQSweuPvrooy22pub4\nz//8z1KcG7CYDpjOPbPRdmyxxRZN1syePTvkjjnmmJZYDt8h/XvM/X1+8sknITdz5swWW1Mtcveg\nK6+8MuT233//Jt9ru+22a8iayMtdD9Jhe6NHjw41uQG96XNF7ppx2mmnhdwSSyxRirt27Rpqnnrq\nqZBL7725QefUplu3biH361//uhSvt956oWbatGkhd8opp5TiWp5tmf+k14PLLrss1Oywww5Nvk9u\nj91yyy0hl+67L7/8ssn3rlX37t1DbsEFy8e4Z555Zqi5/fbbS/Fiiy3WsDW1Jt+wBgAAAACgEhxY\nAwAAAABQCQ6sAQAAAACoBAfWAAAAAABUgqGL88Cyyy4bculggQ4dOoSa8847rxQb7lANzz77bMit\ns846Tb4uNwTrpz/9aUPWxPxv/fXXb7LmwgsvbIWVMLcWXnjhkKt3wGI6kK4oimLrrbcuxR999FFd\n750zZsyYkLviiitKcTpgsSiKYqGFFirFp556aqjJDZ58/fXX53aJ87WDDjoo5NL/tkVRFL/97W9b\nYzlzJTdsdNdddy3F33zzTag5++yzS7FBnG1HbqDRyiuv3OTrcr/j3NAz5r0BAwaE3CuvvFKKv/ji\ni1CT3jeaY9ttty3F6T2wKIpipZVWavJ9nn766Yatidp07ty5yZpLLrmkpveaPn16Kc4NWdtvv/1C\nLh26mBsuOmPGjJCb18NF5yeHHHJIk7ncIPnc9WfSpEmNWxht1g9/+MNSfNhhh9X0unRY4u677x5q\nHn744foXlujYsWMpzj0j5T4fpWuo5VqaO1987LHHQq5qw819wxoAAAAAgEpwYA0AAAAAQCU4sAYA\nAAAAoBL0sJ4HzjnnnJBL+5fmemW99NJLLbYmatO7d++Q69evX8gtuGD5T2vatGmh5thjjw25KVOm\nNGN1zK+23377kEt7cxVFUbz33nul+I477mixNdH6xo0bF3I777xzyDWyZ3UtbrnlllJ84IEHhpoV\nV1yxtZYzX0l7a/bv37+m1/3iF79oieU0y2mnnRZyiyyySCn++OOPQ81dd93VYmuiZW266aZ1ve62\n225r8Eqox/nnn1+K77vvvlDTtWvXkFt99dWbfO/bb7+9/oU1SNrr9tBDD51HK2m/Dj744CZr9txz\nz5C78cYb6/p5uVkKtcj1N/eZrXG22WabJmtGjRoVcu+8804LrIb5QdobOjcjJWf27NmlePPNNw81\nuc85tTyf58730vkKvXr1CjW5c6QuXbo0+fNSU6dODbnjjjsu5Ko2K8Y3rAEAAAAAqAQH1gAAAAAA\nVIIDawAAAAAAKsGBNQAAAAAAlWDoYgvbaaedQu6www5r8nX77LNPyI0YMaIha6J+jz32WMilQ6Ny\ncoNqXn/99UYsiXZgxx13DLncvnv77bdL8fTp01tsTTRWhw4dmqzp27dvyy+kDgssUP7/vnP/llr+\nfb/73e9Cbsstt6x/YfOBzp07l+Ju3bqFmieffLK1ltMsa665ZpM1o0ePboWV0Fq22GKLmurSQUQX\nXnhhSyyHuZQ+86bDoYqiKLbaaquQ23XXXUvxAQccEGpyQ6TuvvvuuVvg/3P11VeX4meeeaam16XD\n7D2Xt74//OEPIbfBBhuU4rXXXjvUrLvuuiE3cODAUrzvvvuGmvSeWhTx+pOr2XvvvUPuv/7rv0rx\nyJEjQw212XbbbZusGTBgQMilf/tFURR//OMfS/ETTzxR/8Jos9L7ybHHHhtq1llnnZBbbLHFSvE5\n55wTaubMmdPkz8/V1PJZKKeWAYu5n5eeHe61116hZvz48XWtqTX5hjUAAAAAAJXgwBoAAAAAgEpw\nYA0AAAAAQCU4sAYAAAAAoBIMXWxhP/zhD0MuHVBVFHHQx4MPPthia6J2P/nJT0pxnz59anrdm2++\nWYqPOOKIRi2JdmjDDTcMudxwhVtuuaU1lkMznX766SFXywCPqtp///1Lce/evUNN+u/L/XuPPPLI\nxi5sPvD555+X4vfffz/UrLrqqiHXo0ePUjxx4sTGLqwJyy67bMhtsskmTb7u4Ycfbonl0Ep23nnn\nUrz55pvX9LqZM2eW4nfeeadRS6KBPv3005DLDUpMcwcddFCLrakoahvomrt25oby0bruvPPOkLvi\niitKce5+8vzzz9f181599dWQSwcqpsNGiyLeU4uiKM4777xSvMsuu9S1Jopi0UUXDbn0OXHBBeOx\n1eDBg0MufZa89957Q83jjz8eculg81GjRoWaZ599NuRSuc9sw4YNCzn3uZaVDvbdaKONQs2SSy4Z\ncun1Z7PNNgs1kydPDrl33323FC+yyCKhpl+/fiG34oorhlw9HnjggZA7+OCDS/Fnn33WkJ/V2nzD\nGgAAAACASnBgDQAAAABAJTiwBgAAAACgEvSwbrC0B9MPfvCDUDN79uyQO/nkk0vxrFmzGrswmtSz\nZ8+QO/fcc0txx44da3qvF154oRRPmTKl/oXR7iy//PKleK211go1uZ60v//971tsTTRO7r5QRcss\ns0zIDRw4MOR+9rOfzfV7p73liiL2sSX+dxo/fnyoyf1ORowYUYp/9atfNWxN66yzTsilffmWW265\nUFNLn/a23Mudolh66aVLcYcOHWp63dNPP90Sy6GduPrqq5usST9nFUVRTJgwoSWWw1zIPcumPc9v\nvvnmUNO5c+eQS+8fuf7qBx54YMhNnz69FN9///2hJu0FWxRFMWjQoFL8ve99L9SkM6rIu+2220Ku\n3h7z6X0nN08sl2tJuWfeF198sRSn+4mWl+vpnM4va6Thw4eHXC09rL/66quQO+ecc0rxkCFDQk3u\nzLEt8g1rAAAAAAAqwYE1AAAAAACV4MAaAAAAAIBKcGANAAAAAEAlGLrYYOlgoxVWWCHUvPzyyyH3\n0EMPtdiaqM3FF18ccrU0wk+HWxVFURxxxBENWRPtUzrELh3mWhRF8cwzz7TWcmin/vM//zPk9thj\nj7rea/LkyaU4N9Rk7Nixdb13e3LMMceEXG7g2AYbbNBkTb3SAVVFEYdd5a5Ztbj88svreh3VUMuw\nohkzZoTcZZdd1gKrYX505JFHhtzWW29dinMDqj788MMWWxONdccddzRZc9hhh4VcOsDx8MMPDzW5\n+1fq2GOPDbnc8PNa7rPbbLNNkz+POGizKIrixhtvLMW5fdGxY8eQ6969eymudfhvS8o9E22yySal\nOPfMfdxxx7XYmmhZueeazTffvK73+vnPfx5yV111VV3v1Rb5hjUAAAAAAJXgwBoAAAAAgEpwYA0A\nAAAAQCU4sAYAAAAAoBIMXWyGAw44IOQGDx5cimfOnBlqTjvttBZbE/U78MAD63rdnnvuGXJTpkxp\n7nJox1ZbbbUmaz755JNWWAntyYsvvliK+/Tp07D3fvfdd0vxfffd17D3bk9eeOGFkNt0001DLh3s\n8r3vfa9ha7juuuuarHn00UdDbsstt2zyddOmTatrTbS+vn37hlwtA4XSAaxFkd8vkFPL4N9//OMf\nIff3v/+9JZZDK8gN26tlMGO9cvehm2++OeTSoYvrr79+qOnRo0cpTgdD8n/Nnj075NL7Qvrf8tuk\nn8sXWmihUHPRRReF3IorrljT+zdKOgxy4MCBrfrzaaxTTz21FOeGty6wQNPfFf7oo49C7vrrr69/\nYfMB37AGAAAAAKASHFgDAAAAAFAJDqwBAAAAAKgEPaxr1LNnz5D7zW9+E3JpP6Jnn3021AwbNqxx\nC2Oe69WrV8h99dVXDXnvzz77LORmzZoVcml/riWXXLLJ91566aVDLtfTqxZff/11yKU9wadOnVrX\ne7dHW221VZM1d999d8svhBaR3ie+LZfab7/9anr/3/72t6W4a9euda1rzpw5Nb2uFgMGDGjYe9G0\nJ5544jvjlvb666+HXC09rDfeeOOQy/WjZd7bYYcdQq6W69gDDzzQEsuhncj1eU2fi88+++zWWg7t\nRPpcVRRFsffee5fiQYMGhZrzzjuvFB9zzDENXRfRnXfe2WRNrt/4iSeeWIq/+eabUPPQQw+F3JAh\nQ0rx+eefH2pqme9A27HtttuGXPp779SpU03vlZ4ZHXrooaFmxowZc7G6+Y9vWAMAAAAAUAkOrAEA\nAAAAqAQH1gAAAAAAVIIDawAAAAAAKsHQxW/RsWPHUpwbnrj44ouH3KRJk0rxEUcc0diFUTkjRoxo\nsff+n//5n5B77733Qm655ZYrxbnBH63tl7/8ZSk+/vjj59FKqm3XXXcNuS5dusyDldBarrvuupA7\n9dRTm3zdrbfeGnK1DEasd3hiva+7995763od8496B4sasNh29OjRo8maadOmhdxZZ53VEsthPpTb\nK7nno3Sf/f3vf2+xNdE+5QbwnX766aV4+PDhoeaoo44qxddee22oeeWVV5q5OubW0KFDQy4durjA\nAvF7nTvttFPIrbLKKqV4jTXWqGtN77//fl2vo/XttddeIVfLkMV0QHBRFMW+++5biv/85z/Xv7D5\nlG9YAwAAAABQCQ6sAQAAAACoBAfWAAAAAABUgh7W36Jfv36luHfv3jW97mc/+1kpfv311xu2JlrW\n888/H3IbbrjhPFjJ/2/TTTdt2Hul/ddq7U+b9uh+6qmnanrdo48+WtvC2rl99tkn5NJer7m+5ffc\nc0+LrYmW9fvf/z7kjj322JBbdNFFW2M53yrXfza3F3ffffdSPG7cuBZbE21D7v5Sb090qik3fyH1\n6aefhtxnn33WEsthPjR48OCa6nLzXlKLLbZYyC211FKleOzYsbUtDIr4eeiKK64INaecckopvv76\n60PNNttsE3K55y8a57nnngu59Pe52Wab1fRea665ZpM1uR7o6bnDAQccUNPPo3Xl7h2HHHJIXe/1\n17/+NeT+9Kc/1fVe7YlvWAMAAAAAUAkOrAEAAAAAqAQH1gAAAAAAVIIDawAAAAAAKsHQxaIoVlll\nlZB74oknmnzdr371q5C75ZZbGrImWt/GG28ccpdddlkp7tSpU13vPWDAgJAbNGhQXe/1l7/8JeRG\njRrV5OtuuummUvzCCy/U9fOpX5cuXUJu2223bfJ1d911V8jNnj27IWui9Y0ZMybk9t9//5BLB3Lu\nvffeLbamnMsvvzzkzj///FZdA21TrQNDv/766xZeCY2w0EILhdwKK6zQ5OtmzZpVUw6aI72OHHfc\ncaHm5JNPDrnRo0eX4tzwO6jVlVdeGXKHHnpoKd5oo41Czdprrx1yzzzzTOMWRpAbapk+Y//5z38O\nNauuumrIpZ/tJk+eHGr++Mc/htxRRx3V5Dppfd26dSvF48ePDzULLND0d34//PDDkNtrr73qX1g7\n5hvWAAAAAABUggNrAAAAAAAqwYE1AAAAAACV4MAaAAAAAIBKMHSxKIrTTz895Lp3797k63LD7+bM\nmdOQNVENP//5z+f1EpiPfPXVVyE3ZcqUkHv33XdL8dlnn91ia6Iahg4d2mTu/vvvDzXHH398yG2w\n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\np5xSin/4wx+GmsUWWyzkFlpooVKcu5amcs9WuXOIjz76qBSPHDky1DzwwAMhN3z48O98H5gXfMMa\nAAAAAIBKcGANAAAAAEAlOLAGAAAAAKASHFgDAAAAAFAJbWboYtqIPteY3nAFvk06nCM3zLBLly4h\nlw5JGTt2bKjJDS14/PHHS3FuIMsuu+wScj/96U9LcefOnUPNhhtuGHJ33HFHKf7qq69CDfO/pZde\nuhQPHDgw1OSunenQTsOBqik3ZGiNNdYIuaOPProUL7hgvNXnfsdpbqmllgo1uYGcF1xwQSl2/Zn3\n0vvZz372s1CTuz7cc889Tb53p06dQi4d2Jnbc9OmTQu5nj17luJBgwY1+fNvuummkJs1a1aTr6O6\nunfvXopPPvnkULPEEkuE3I477liKc89MuX1H46y44oohd91115Xifv36hZonn3wy5IYOHVqKc/eS\nr7/+OuTSz3+13N+KIj4P5fbY008/XYpXWGGFUDNixIiQ+8EPflCK3Rfrt9JKK4XcZZddFnLpYLvz\nzjsv1KS/z6JwfjC/y33uST8vFUVRnHXWWaV4v/32CzW54Ym1DADNSa9JtVyj0kGNRZF/3kqvyz16\n9Ag177//fsi99NJLpdjQRarAN6wBAAAAAKgEB9YAAAAAAFSCA2sAAAAAACqhEj2sO3bsWIqXW265\nUHPqqaeW4l133TXUjBo1KuQ+//zzUvy3v/0t1Lz22msh99Zbb5XiXA+86dOnh9zs2bNLca29YNP+\nR7l+SGmPotzP13s2L/29XHzxxaGmlh7WuX7Vb7zxRsilPZ8WXnjhUPPll1+GXPo7TtddFEXx4osv\nhpz+a+1Pridb2ucv188z17Ns5MiRjVsYDZP+jvv37x9qbrzxxpBbZJFF6vp56fUuvTcXRVFss802\nIXfXXXeV4n/+85+hJnctozFy14J0r6Q9posi9joviqL4+9//Xopr/b3NmDGjFOf6LOZ6KF566aWl\neLvttgs1EyZMKMW5PtsTJ06saZ3Me7n9utNOO5XiXP/83OumTp3aZA2Ns/LKK4fc8OHDQy7tD5vO\nySiKojjzzDND7rPPPivFuetP7ndcy2ef3OeqtB/ttddeG2rS56rc83ba97Uo3POaY9llly3FuT3W\np0+fkEt/N7lnpsGDB4fcI488Uopzn/l9zmo70uePk046KdSccsopIde1a9dSnHsGzu2D9PN8el8q\n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\neeSRUNPa14jcMJntt9++FPfr1y/UpOucPn16qBk9enTItffhwh9//HEpTu8tRZHfAxtttFEpzg20\nTN+7KOKgldx9MTd8+KijjirFPXr0CDXdunULuXSPp0OsisIeaEvSZ+ClllqqpteNGzeuFL/zzjuN\nWhLNkF5b0iFhRVEUzz//fMgdf/zxpXjxxRcPNeuvv37ILbfccqV44MCBoaZv374hlw7Xyw3Wyw2R\nSp+ZqjZoqj14+OGHQy4dFJa7D+WGaKa53KCy3Gfp9Jk7fWYriqIYMGBAyG2zzTal+E9/+lOoSe+z\nuWf39uj9998vxbXc5xdbbLGQ23DDDUMu/XydG3iYG1ie/m5y+2edddYJufR5J7emnKuuuqoUv/zy\ny6HG809tcn9XY8aMKcW5+8lee+0Vcun9Izf4e7XVVgu5pZdeuhTnBizm9nCnTp1KcW7f5Z7zv/rq\nq1L86KOPhpohQ4aU4hEjRoSa3H29anzDGgAAAACASnBgDQAAAABAJTiwBgAAAACgEvSwboZc/6wD\nDzywFK+55pqhJteP6LzzzivF7777bqjRz7hxcv3HN9hgg5D76U9/WopzffHSHkJFURRvvPFGKc71\npcr1UZs1a1ZcbBuV+29MbVZZZZVSnOv/mOsB/Pnnn7fYmqhf2n8x93ee9jAritjTPncdaUm5Pmq5\n/tRpH75c/8fUBx98EHJvv/12yLX3+17al++ll14KNVtvvXXInXPOOaV4xx13DDXPPfdcyKXPNble\n1P379w+59N6Yu/7n9lPaM1bv4rYj9zvebrvtSnGud2juGTjtJZx7rqKaaumtmeuX/7e//S3k0pkw\nY8eODTXrrrtuyKXzZnKfz3J9SNNn9fZ+v5kXPvzww5C78sorS/F+++0XanL9xtO+xLl9kPsdp7Ol\ncv1wc/M7Vl555VKc6087adKkJt+7PUo/w7z22muhJp3Fkfvve/3114dc+oyde/bI3WPS/ZL7nJW7\np6UWXXTRJt+7KIpik002KcVHHnlkqEnneuhpXb/PPvss5G644YaQSz+P5Xro9+rVK+TS+QrpLIei\nKIrVV1895HJ7I5V+HiyKOCfviiuuCDXp9bWtPlv5hjUAAAAAAJXgwBoAAAAAgEpwYA0AAAAAQCU4\nsAYAAAAAoBIMXaxRrmH/5ptvHnJHH310Kc4153/llVdCLh0akBsmQePkBiJcc801IbfaaquV4tyw\n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\nRK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(20,4))\n", "in_imgs = mnist.test.images[:10]\n", "reconstructed = sess.run(decoded, feed_dict={inputs_: in_imgs.reshape((10, 28, 28, 1))})\n", "\n", "for images, row in zip([in_imgs, reconstructed], axes):\n", " for img, ax in zip(images, row):\n", " ax.imshow(img.reshape((28, 28)), cmap='Greys_r')\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", "\n", "\n", "fig.tight_layout(pad=0.1)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sess.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Denoising\n", "\n", "As I've mentioned before, autoencoders like the ones you've built so far aren't too useful in practive. However, they can be used to denoise images quite successfully just by training the network on noisy images. We can create the noisy images ourselves by adding Gaussian noise to the training images, then clipping the values to be between 0 and 1. We'll use noisy images as input and the original, clean images as targets. Here's an example of the noisy images I generated and the denoised images.\n", "\n", "![Denoising autoencoder](assets/denoising.png)\n", "\n", "\n", "Since this is a harder problem for the network, we'll want to use deeper convolutional layers here, more feature maps. I suggest something like 32-32-16 for the depths of the convolutional layers in the encoder, and the same depths going backward through the decoder. Otherwise the architecture is the same as before.\n", "\n", "> **Exercise:** Build the network for the denoising autoencoder. It's the same as before, but with deeper layers. I suggest 32-32-16 for the depths, but you can play with these numbers, or add more layers." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "inputs_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='inputs')\n", "targets_ = tf.placeholder(tf.float32, (None, 28, 28, 1), name='targets')\n", "\n", "### Encoder\n", "conv1 = tf.layers.conv2d(inputs_, 32, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 28x28x32\n", "maxpool1 = tf.layers.max_pooling2d(conv1, (2,2), (2,2), padding='same')\n", "# Now 14x14x32\n", "conv2 = tf.layers.conv2d(maxpool1, 32, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 14x14x32\n", "maxpool2 = tf.layers.max_pooling2d(conv2, (2,2), (2,2), padding='same')\n", "# Now 7x7x32\n", "conv3 = tf.layers.conv2d(maxpool2, 16, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 7x7x16\n", "encoded = tf.layers.max_pooling2d(conv3, (2,2), (2,2), padding='same')\n", "# Now 4x4x16\n", "\n", "### Decoder\n", "upsample1 = tf.image.resize_nearest_neighbor(encoded, (7,7))\n", "# Now 7x7x16\n", "conv4 = tf.layers.conv2d(upsample1, 16, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 7x7x16\n", "upsample2 = tf.image.resize_nearest_neighbor(conv4, (14,14))\n", "# Now 14x14x16\n", "conv5 = tf.layers.conv2d(upsample2, 32, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 14x14x32\n", "upsample3 = tf.image.resize_nearest_neighbor(conv5, (28,28))\n", "# Now 28x28x32\n", "conv6 = tf.layers.conv2d(upsample3, 32, (3,3), padding='same', activation=tf.nn.relu)\n", "# Now 28x28x32\n", "\n", "logits = tf.layers.conv2d(conv6, 1, (3,3), padding='same', activation=None)\n", "#Now 28x28x1\n", "\n", "decoded = tf.nn.sigmoid(logits, name='decoded')\n", "\n", "loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=targets_, logits=logits)\n", "cost = tf.reduce_mean(loss)\n", "opt = tf.train.AdamOptimizer(0.001).minimize(cost)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sess = tf.Session()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "epochs = 100\n", "batch_size = 200\n", "# Set's how much noise we're adding to the MNIST images\n", "noise_factor = 0.5\n", "sess.run(tf.global_variables_initializer())\n", "for e in range(epochs):\n", " for ii in range(mnist.train.num_examples//batch_size):\n", " batch = mnist.train.next_batch(batch_size)\n", " # Get images from the batch\n", " imgs = batch[0].reshape((-1, 28, 28, 1))\n", " \n", " # Add random noise to the input images\n", " noisy_imgs = imgs + noise_factor * np.random.randn(*imgs.shape)\n", " # Clip the images to be between 0 and 1\n", " noisy_imgs = np.clip(noisy_imgs, 0., 1.)\n", " \n", " # Noisy images as inputs, original images as targets\n", " batch_cost, _ = sess.run([cost, opt], feed_dict={inputs_: noisy_imgs,\n", " targets_: imgs})\n", "\n", " print(\"Epoch: {}/{}...\".format(e+1, epochs),\n", " \"Training loss: {:.4f}\".format(batch_cost))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Checking out the performance\n", "\n", "Here I'm adding noise to the test images and passing them through the autoencoder. It does a suprising great job of removing the noise, even though it's sometimes difficult to tell what the original number is." ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n8uQJYpQ/7eucUEzDxHpM+oryORSSmsWNYSY8xTEWC/4t06dPdzVs7n799dcTj/3P37K/4ydG8hNT\ns686pHnz5kGcVoqTnfN7rVq1XG7u3LlBnDdvXlfD5FnLly8PYjbfTZ06NYhRImzG52D8m2PO28yv\ns0xO8o/AZ3/GDxOSMpkXEjN2mKgHZZXsOExsN2nSpMRziuHDDz90uUqVKiV+jsmRmPjxqKOOCuK0\nYxyPY+YFSgwmNHvxxReDmJ333oLS/Rk/NWrUcP89RrT02WefuRz+fdWrV088zoHmkENCl3usoBhl\ne6NGjXI1TFaEsk0mjr755puD+O6773Y1bF+OY4ONlQ0bNrgc7gWYJGvvez2re2eEyaXZbxcj5UIB\nV//+/RO/38wLy3/77TdXc+qpp7ocriUtWrRwNSiJNvPrUuxePeb3RIEkm2uefvrpqO+LAUWXTBa7\nY8eO//7fWR0/KMX64IMPXE2bNm1cbubMmUHMxhjK7Nm1Y3tLJodEcM4w8/cxe05HuTT7viOOOMLV\nbNmyxeVwP8LGND5jMNlozJ4b95Fm/FkPpa9MuFq/fv3//t9ZHT8TJ04M4k6dOrkafB408++D2ByB\nUlQmrGTgNWbPSy+99JLLoXAZZXhmZj/++KPLoVx0yJAhrobJlPEZjYnd58+fH8QnnHCCq2HPu3gv\nfP31166GyYZx78ieW3fu3Pnf/zu7169Y8J0Uu1a4xrE9NhOs4nM5ewZn34fXAd9vmvH1Iwa8z8z4\n3h/B3zw73x0WL17c5WLEs3ufQ9L4+Qf9C2shhBBCCCGEEEIIIYQQGYFeWAshhBBCCCGEEEIIIYTI\nCPTCWgghhBBCCCGEEEIIIURGcEhySTzYF6VIkSJRnytcuHBiDfaXiu23wnpWIzH9qhlt27Z1Oeyj\n9u2337qak046yeWGDx8exNdcc42rmTBhQhBnZy8gdq2wjxnrQZydYG/b6667LupzrLdaGkaMGOFy\nOKaxR7kZ7210//33Z8s5VatWzeVYf3Ps2/jCCy8kHpv1Q2rVqpXLPfPMM4nHYmCfU9YHKy2DBw9O\n9bl27dq53GOPPRbEMX0VH374YVeTP39+l8OekAsXLow6T7wX0vacmjx5ssthT0Ez35sTe7jGUrZs\nWZdjPasR1q8ae49dcMEFqc6JweYW1hcOifnN2T2LvQ9Zn/Q33njD5ZjPAenSpYvL4f3BevVhX04G\n61edM2dOl4vp0Y+9JJkTIeb3Zf2qGdjrED0GaWH34uGHHx7Ee/cX/YeYvy1mL/Laa6+5HOv9jX0I\ne/bs6Wr69u3rchdeeGEQDx061NV8+umnLnf88ccHMevTzu4NJO1cF9OvmsHGbvv27YOYrblpYf36\nY3pYs57k2NuWrUGs7yrCxtQll1wSxFWqVHE1ixYtcjnWHxZh/bixl2esTwPXYvTBMJjDhPWi/sex\n8Q9LlixxNaNHj3Y5XKuOOeaYxHOKpXHjxi6H1z2mp76Z76/J7k/s6Rrrt8C+uQULFnQ1rBcs9umN\n9SjgvMF6s7IxhXVz5sxxNYMGDQpi7JtuZjZy5EiXQ4cJWxcY+PxXpkyZqM/FwO51/A2Yp4GN8x9+\n+CGI2d4Se0E3bNgw4iz9ebI9U0yfcrb3YQ4GfGZiz3W33367y+3atSuIcS9gxntWIzGOGNavmnH6\n6acHMdvb7t3DOqtgb2ScM8zMPv/8c5f7448/gpj14502bVri97P7ER1NzFWG71TMzMaMGRPEt912\nm6thPd5xX8z2WyyHazjbA8bsR2LmiFKlSiXWmHkHA7uemQDrIY0MHDgwiA8+2P87XfaO4+STTw7i\nc88919U8+OCDLoc+gJhnOLO4uaxq1aouh34MHCtm3oPD9tPoHjEza9CgQRAzByF7n3mg0L+wFkII\nIYQQQgghhBBCCJER6IW1EEIIIYQQQgghhBBCiIxAL6yFEEIIIYQQQgghhBBCZAR6YS2EEEIIIYQQ\nQgghhBAiI0gtXSxWrJjLpZUAopSLySuySzDIBI9MkrBy5cogLleunKth8hMUYDG514ABA1yuW7du\n/mQT6Ny5s8tNmTLF5b755pvEYzGRFlKjRg2Xi2kUHwsKbcaOHetqUH5i5kUYMefErnmHDh1cDhvY\nFypUyNWgWM/MyzE6derkalBsYObPvUePHq4mRjTA5A4ogmSSoRhRKooyzMxy587tcvg3MwlXWnLl\nyuVyU6dODWKUH5h5waKZl4rdeuutid/PxDxMmvfFF18EMRN8FS9e3OVixDSs5tVXXw1iJsFhEhF2\nXyXBBAxsHqtYsWIQV69e3dUMGTLE5VAswu49Jr6NgV1jlK0wySwKdsy8WPf6669P/H62BjzwwAMu\nx+4rhK0DeO6zZ89OPA4jdn5HSRQTvdWuXTuIN2/e7GqYPAd/A/b7MiEdinFiZHAx4DjJTlBMaeZl\nV0x6xkQ9eO1ixYE4t7HfDQV5Zl6GyYSObD/066+/BvFRRx3larp37x7ETHbDwDmKzU94bDO+vmQX\nd911l8vhXjJGsMhgNWzvgaBgkYF7YjO+90ERG4ONHyY1igGFlX/99ZerQYEvE2zHyIEZxx57rMuh\n5Cw798lsbOC9/dtvv7mabdu2uRyKaFFUZsZlewhK3sy8yLly5cquhsnL8PdkUmG2fuO4W7x4sath\ne4gYRo0aFcQlSpRI/H4zP4+wOZHtvY477rjEc0o7pmLudSbIY8JBFJoxcNydffbZroat+/jcyp6X\n2HsBFImya9WiRQuXQ9n6zp07XU3Mb47PIWZ+/mGiMiYcRBkme2Zj997GjRuDOGZPmhVwXc2RI4er\nYaJmfL5lczBeY/augj2Tvvfee0HM1qpatWq5HJ47e88TIwS+5557XI7d/zHSRZy32DiMkd/deOON\nLseOhXM+jt+s8OSTT7rczTffHMRsf8BEzTGgcHD37t2pjrNw4UKXY+8YcB5BGbmZ2fDhwxO/7/XX\nX3c5JuzG+2PevHmuholnEZRMsmMxYW8MsaLdJPQvrIUQQgghhBBCCCGEEEJkBHphLYQQQgghhBBC\nCCGEECIj0AtrIYQQQgghhBBCCCGEEBmBXlgLIYQQQgghhBBCCCGEyAhSSxfXr1+fWMNkBw0aNHC5\nadOmBTGTc7z44otBvHr1alfDpGf169cPYiazYOIGbLzPRBEMrGMiDpQMmZmdd955QcwaoKNEhInK\nYmASnhdeeMHlDjvssCBmIpe0sObxKGdr0qSJq2HCuAIFCgTxpk2bXE3dunWDmF2XTz75hJ/sXjAh\nVIxk6JlnnnE59nvidWdCBCaKwOb4KFg087IBJuJg0h2UbtWpU8fVxHD33Xe7XPPmzVMdi4mV8Ddg\njf6ZgLRPnz77/f1srmGgZLF3796uhkk2UNzAxljVqlVdDqWLhxzip3gm5kKpRpUqVVwNyimZ/Imx\nfPnyIGZzNwPFG4sWLYr6XAxM/IH8+OOPLsfkIyibQwGhmZ9z2X2G4hF2njguzLzgy8zso48+CuKz\nzjrL1aAUy8zsnXfeCWImFEMRkJmXmDEpHgpKbrrpJlfD1tm1a9cGcatWrVzNjh07XA73Fe3atXM1\nTMz1nwTHExsD8+fPD+LnnnvO1TDJEf4mTOrJRMMogWWC4hUrVrgcCmbZOsHGRb9+/YIY5ZxmZuvW\nrXM5hAkVMYdzmNmBFSzGsmzZsmw5Du4jGePHj3e5q6++OvFzbF/O9hDsXowBJUNsr8Vk70xyhqBw\ni7Nt/LoAACAASURBVO2rcP9p5vcGTHjK5OAIkwSysZgWlIM//fTTrqZXr14uV6ZMmSBmkm9cd9k9\nzPbOuEc78sgjXQ3jkUceCWImu2LiZpQXpt1bMnAsMnksA4VfbP/JwD0+7jGyG9wn4ngyixMsMvBZ\nj8nEYmB7fjZHHH300YnHYgL4kiVLBjHbp/79998uh+sc7sHNvGB62LBhrobNEW3atAni8uXLJx7b\nzIsJ2TNGdoLXuFq1aq6GSQgHDx4cxOyd0Zo1a4KYXQMmMr7lllv+9bvM+H7zl19+CWK8h/cFikqZ\nYJGJA3GNYXurcuXKBTF7jsTnLDP/XoeNFbb2o3SRCSvT8sQTT7jcGWecEcRsr3HmmWe6HL7PK126\ntKtB0WTevHldzfbt2/nJ7gUbYwMGDHA5vA6xezuUvLJngZh98AUXXJBYw5798B2rmZ9f2bvDjz/+\n2OW++uqrIGbXJQ36F9ZCCCGEEEIIIYQQQgghMgK9sBZCCCGEEEIIIYQQQgiREeiFtRBCCCGEEEII\nIYQQQoiM4CDWy21fVKxYcc8/PR9Z32fsbda9e/eo42JPRuyFyI7N+viyPl/YKxT78WaFXbt2udzB\nB4f/HwDrf4Q9mRhp+wym5aKLLnK5WbNmBTG75nuPn4MOOmjJnj17fCPA/2Lv8cP67GCvTgb2ojYz\nmzlzZhCz/kcffPBB4rHZvbB169YgZv3RWF+q0047LdX3sd84DTNmzHA57EvFesKx3nU//fRTELP+\nZKyXHPYWZ+N33LhxZrZ/Y+e/6l0N9phq2rSpq2G9vbE/F+v7jP2lGLfffrvLYc9L7Blp5ns1m/nr\nwHrQsd8A+7axXpZs3nrttdeCmPWKZ/NyDDjOs2uM733s/R0/rJ/n8OHDgxjv/b2/b2+wv3iRIkUS\nzpofh7Ft27YgPuKII1xN0rxsxnu0sV5u2F8Ox5MZ79+O8zI7p5jrPmfOHJe78MILEz/HwL54q1at\ncjX//C77M37Y3zFlypQgZteX9dRHWO/4tL3bH3/88SBu27Zt1Oew/9zGjRtdDesnmCdPniAeM2aM\nq2EOE+xty3qb494uZg/FYH2DWX933F+yvplp9z4x9yuu1Wa+F6OZ7zHP+u6jR6FUqVKuhvUpxz69\nbP1mx2I9DZElS5a4HPaQPpD7owPdUzqGtOPnsssuc/8d+zxfe+21rob9ffi8EgP7zPHHH+9yuIeJ\nncdwf8LWarZ3xWc9tvdhfWVx/8fWN5xL2X0WM16ZR4H1hkZ/EFuH9z6nrM4/CHtuZc/cuJ/F3slm\nZl26dAli5lJg7wrwHsXnUTO+J8W5mp1TDGxMsz73OF5ZD2uEPR8+9thjLhfjJGBg72LmVUk7/7C1\nIrv8Vqx/Mz5vMr/Xe++953LYVx/3g2a8Jy/292XPtrimmpktWLAgiJlXhPX/R9cKe1fBnDf/Sdgz\n8d73WXbPP7Hgeyv23uPQQw9NPA6b23AdiHWdxDzbMU8LzlNXXnmlq2F7Y+ydXrRoUVeTP3/+xHNK\nC+vtjc+t+Gxttn/zzz/oX1gLIYQQQgghhBBCCCGEyAj0wloIIYQQQgghhBBCCCFERqAX1kIIIYQQ\nQgghhBBCCCEyAr2wFkIIIYQQQgghhBBCCJER+E7qkbDG96xhPvKPZG1vmjdvnvi5559/Poj//PNP\nV8OkDNj4nommmJDqww8/DGIUA5lx+Qg21Y+VA3Xr1i2IUUQZS1pRDfvt8HMoAskKTISBsgomaIr5\nW5gsA0UGLVq0cDUoTzPzksWVK1e6GibNQ2HIkCFD+MkCeHwmNfr6669dDmUyTByD4j4mjmA89NBD\nQYyiJzMv3DLzYhEUgZjx+SAGJoHAexZjM7O33nrL5fA+jhEssvv6pZdecjm8fnifm5m9++67LnfS\nSSclngMDpXlM2pIvXz6Xu+SSSxKPHSNPzE5RFkrb9pYmZhUmX0KKFSvmchMmTHC5fv36BTETQqGw\n4/XXX3c1xYsXdzkUmDGZFvvNzz333CDGe9iMr2kodxowYICr2bRpk8vVrFkziHPnzp14nmxcMMEi\nilJ79uzpalBuasYFLNlBx44dXY6tVWlgYrKSJUsGMV5bM7OxY8e6XKxkEcG5h90rTLxbqFChIGZj\nNQaU9ZqZXXzxxUGM85wZF0vhmsNke5lAzByZdm5FMVmsPBfnOhTzmvH19NNPPw1iJhhj8jJk0KBB\niTWxoLivT58+UZ/Dv6VVq1auhkmyevfuHcRszkwLE/DhXMckRyzXoUOHIGbX5YYbbkj8fiYJxb1H\n/fr1XQ0TVXfu3DmITz31VFfDRFo4Frds2eJqcK0283ufhx9+2NXg/IOiq32Bewi2JjHZHrJ79+6o\n70sL/sbs+bNSpUouh/fRHXfc4WpwbKxbt87VLF261OWGDRtGz3VvmJiMXT+EScVRVsbmNibgGzVq\nVOL3Iccdd5zLsb06Psd9++23rgaFxGZ+j1CvXr39PcV9wvaE+H0owzMza9y4scs99dRTQczeBeG+\ngglPd+zY4XJMsoisXbvW5fAZ/JdffnE17Nm5RIkSQczEpTHrHhsHuMZUrlzZ1TAx488//xzEbP67\n6qqrEs8p5pk4FiY4xDH8zDPPuBp2nng/xggWGeweipEsxggW2bs1lkMO5PN12uOw68JEkNkp1twb\n/QtrIYQQQgghhBBCCCGEEBmBXlgLIYQQQgghhBBCCCGEyAj0wloIIYQQQgghhBBCCCFERpC6hzXr\n5XvWWWclfo71KMK+Pk2aNHE1rOcw0rJlS5fLnz9/ELO+ZozChQsHMes5xXo0litXLoivvvpqVzN+\n/HiXwx6j8+bNczWs7ykS0zuG9XaK+Rzrg5qWmL4+b7/9tqthPcQmTZoUxKx/FoI90c14H1CE9W5n\nYM9q1vuH9UPE/tvYQ9GMXz/sE8f6qyMPPPCAy7H7E/u9rV+/3tVg/y4z3+swZn6IhfVcxh5p119/\nvathPcHbt28fxF27dk38fvb3sp7Hd955Z+KxWK9t7DPK+g3HwO6htOAcEdOPzcxsw4YNQVykSBFX\nw3o74v3I5s2hQ4dGnUMMjzzySBCz3nVsPo/pzYzMmTPH5c4880yX27VrV+KxXnnlFZfDfqHVq1d3\nNew8Y/oFsh7daXvHxRDjgXjxxRddDu/rmPk9BtYLFmH9d1nfTDzvKlWquJrSpUsHccyYiIWd02WX\nXRbEF1xwgathDoGNGzcG8c033+xqWP9t7J86cuRIV7N58+YgZv0hmSMBxyr2493X5w4krD8sW6sQ\ndr++8847QczWCdZDOgYc561bt3Y1Mb0tTz/9dJdjnhHsz9q9e/fEY5uZLVmyJIjxvjfzvXZZ32nW\noxe9KmzuYz1zy5QpE8SXX365qxkxYoTLxcB6QSNsf9KoUSOXGzx4cBCfffbZicdm/ZR/++03l3vy\nySeDOLbXLz6zMa8BA70JbPyw3p3XXXddELOenMh/sm+nWXzf+bQsX748iNm98Oijj7oc3g/sN8D1\ng/XsZrl77733X2Mzs4kTJ7oce65CZs6c6XLYl5yNlc8++8zlmjVrFsSHH364q8F9FHMwsN6+2Ds9\nlvnz5wcx8zOlhd1X+Bvgem3Grwv2sMZneTM/l7355puuhvW5x7HIrueUKVNcDscU2+swcE1j+zR2\nDvjMzdZr1rMamT59ussVLFgwiGP6VZv5daFLly5Rn4uB/Qb4bomNlalTp7oc9p4+4YQTXM2qVauC\nOPaewmOzPT26Mcz8XoM9R7JrFbOuZ9caw8YY+trM/DtOdl1i5tvsQv/CWgghhBBCCCGEEEIIIURG\noBfWQgghhBBCCCGEEEIIITICvbAWQgghhBBCCCGEEEIIkRHohbUQQgghhBBCCCGEEEKIjCC1dJHB\npFgxoHSsZMmSqY7DmuPHCIqYoG7p0qVBzKSLNWvWdDlsQN6pU6fE7zczy5MnTxAPHDgw6nNpYM3V\nY+jYsaPLdejQIdWxihcv7nIoQIiV9H399deJx163bl0Q//77766GSTSx0T6KZMx44328fkxuxUB5\nWawgE0UG7O9DoQ6TaTFpQQwFChRwOZTlMOEDE2zFwAQMLIcwQUDPnj33+/vPOeccl3v//ff3+zhm\nXtRq5mU2bdu2dTUDBgxwuW7dugUxE6WiVM3Mi0yYbA/lJ+z+TCuFYLIwXE9ihacxsLkbZZtsHmFC\n4DR/MxN4xFCjRg2XY6IsFHiw9YvJT5DYv+2UU04JYiaZxd839n7BccDEeWz84HhNO7ch7NoNGzYs\niGPne5QVMVDmunbtWldTvnx5l0OJFIP9LZMnTw5itua1adPG5XCsfP/9966GyZ8+/vjjIGb7DBTb\nffPNN66GrWe5cuVyuRhwPly2bFmq4zCYIBRhEtpLL73U5fAeYuOuaNGiQczEw0zOi9eBSc/Yb46C\nqAcffNDVMIkTiqpjhI5mcaLAww47LIjr1avnatj9gqLCu+++29Ww/R9KCJlkMi1M5Izfx+4PtidE\nUGDJYMI4JtbMly9fELPnLCZwROkZk5QyUFjbrl07V9OyZUuXQ7kWE/mhMPKjjz5yNWw9xT1wzpw5\nXQ279x5//PEgjpGyxsKE8ygqZaIwJjONoX///kFctWrVqM+x+SYGfJ8Qu1dv0KBBEKOE24zPr3jd\nmYA0b968/xqbcZEwzt1srKBs1Myvs/fff7+rScv27dtd7umnnw5inG9jz4GJsXHewud9My/sNTP7\n+++/g5i9H2L7W5y32LMQ+/uaNm0axBMmTHA1OXLkcLl58+YFMZMC4v6OrVVMIIlzIltTFy9e7HLZ\nKVlE8O9lOXYvMGkwikrZ+xJ8l7dt2zZXc8QRR7gczhHs+ytWrOhyKNFkxIi+2fPuAw884HKNGzcO\nYvYeC+8r9o6VzZN4DjHvnsz8Pcr2nGnQv7AWQgghhBBCCCGEEEIIkRHohbUQQgghhBBCCCGEEEKI\njEAvrIUQQgghhBBCCCGEEEJkBHphLYQQQgghhBBCCCGEECIjSC1d/Omnn1yuYMGCQXzjjTe6GpSJ\nmXkR2ksvveRqsKn/U0895WqY2ITJRxBszm8WJ3z59ddfXQ4boKOMycyLFMzMpk2bFsRMbLB+/fog\nXrVqlau57777XO72228P4vnz57uaPn36uNz5558fxPfcc4+rSQtKEM28xG3OnDmuBiUmZl78yK4n\ncswxx7gck2Vs3rw5iPH6mpn9/PPPLodjH6+BGZd6oJgsFpSLMikENvpnAg8mdlqxYkUQn3nmma6G\niWrSSlpiYPKamOveo0ePxBomvEJRTYw4KxYU7Jj535zNm0zAEPP3TZ8+PbHmlltucTkU8bA5mEmp\n+vXrF8RM0sBkDlu3bg3itLJYBrvXETZHsVwMKBVhIjtcP828yIXJ39h8jjI9JmSpXr26yy1cuNDl\nYhg9enQQM4HHlVdeGcSx0sXHHnssiNmaylizZk0QM4lmGtg6GDOeGDjfsrkH130Gk/Dgvqpw4cKu\nBoU0ZmaFChUKYpyLzOJknLinMeP7GhTeMOEOSh5nzZrlapjMB2WNTDiLwlAzszp16gQx/iZmZp07\nd3a5GN544w2XQyEU218zUALGZKcobGJzCBvTKMphewoUgpr5vUiZMmVczcqVK10O5WHs2Ey4hTCp\nHIqVcW4wMytSpEjisXEtM+MCUoRJwdLCZMvZBVv3mWQR+eSTT1wO5wgcF2ZeNm/mxxn7HBOo4TPb\njh07XA0TqMXUHHvssUHM5pqYOfG1115zuZkzZ7pcdkoWETb/4N6ud+/eroY9W8aAe5HY/R/SvXt3\nl2PP0p06dUo8FhOQ4lh89dVXXQ2bO1HWyMYr/n3sN2DrM5vLkD/++COxhu352V49uzj33HNdburU\nqS6H6w5bh1AEi6K9fYHPiCjj3BebNm0KYvYeiwm88b0Vez5j1/3QQw8NYnY9cX/Xtm1bV4P7PTOz\nyy+/PIjZNRg8eLDL4biLFSBnF+y9HZNDImw/i+9UUEhvxudlnOPZ/PPnn3+63Lhx44KYzW1MrInz\nMntme/nll10O18K+ffu6GpSwvvXWW64Gn7fNvEyZPZ+UK1fO5fD+yC6Jp/6FtRBCCCGEEEIIIYQQ\nQoiMQC+shRBCCCGEEEIIIYQQQmQEemEthBBCCCGEEEIIIYQQIiNI3cOa9dtEmjdv7nLYb9jMbMKE\nCUGMfVPMzHr16pX4fYcffnhiDfYiMzNr2bKly40YMSKIWV+hN9980+WwLzDrXcz6vVWtWjWIWQ8o\n7FmNvY/29X1HHXVUEGO/MjP++2JvrgULFriaAwnrV836LcX0x8Gxwfo3s/7RlStXDmLWJ+qmm25y\nOex/xnpXsX6TSOvWrV0O+7mbmb377ruJx7rmmmsSaxjnnXdeELN+1awn+MaNG4MYe5VmBdaDDnuW\nsd988uTJLof9sliPXNZnMLtg/VFjYP2zsE8b67Nao0aNxGOz3ykG1ivvggsuCOKrrroq6ljYs5pd\nz7Sw/snYa4z1ybzoootcDq8Dzrdm/jfAfvJm/P4cPny4y8WA/fHZnMH6VePfzO5r1uMT1woGzhux\nPdixR3dMLzsz3684pnd7DGn7VTNYTzhk9uzZQczWBNbTH/cw2CPYjO+ZsM8064/N1mGErbExcw/r\nX4hrJVvz2XnecccdQfzxxx+7mnr16rnc66+/HsR58+blJ5sCtv877bTTgjimpyuDrQlVqlRJdSyE\n9QRm3hjks88+czncU5j53syxfXznzp0bxKzHKeu/nYaaNWu6HO4RzdJfvxhYL03c/x155JGuhs1/\nuFaNGTMmi2f3P7Derwh7rho1alQQf/HFF66G7QXQK8LWU9Y7/eSTT048T4T5NPLnz+9yW7ZsCeKb\nb755v78ru2F9kTt27BjE7HmCzYG4VjA3B/7NrM9s2bJlXQ7voQcffNDVMPA5js0/2FfbzPuKWL/Y\nZ5991uVwT5gjR46o80RYP24c5+zev+KKK1wOHSKLFi1KdU4MdJGY+b0dc0w0bNjQ5dCdxfrv4l6d\n9RZn17hChQpBXKlSJVfDwPcq2NPajDuM8DdAB4QZ37vh/cDWk927dwcx8x4xKlasmHjs7OovHAvr\n/4+/HXOdPProoy6H78lwHjMzu/rqqxPPie1VY96psHdwMWs/8wggQ4cOdTnmk8D7n3ko8H6sW7eu\nq2HvOPDvy5Url6th/dwHDhwYxOydYxr0L6yFEEIIIYQQQgghhBBCZAR6YS2EEEIIIYQQQgghhBAi\nI9ALayGEEEIIIYQQQgghhBAZgV5YCyGEEEIIIYQQQgghhMgIUksXmTgGZYlMUMW47bbbgphJYq67\n7rogxmb9ZlwGgDKbfPnyuRoU85h52RST2bDG6SiKwebjsZQoUcLlsAE6+372GxQrViyIhwwZ4mpY\no/gmTZoE8a233krPNbvA5vEoLDHjcgUEx4qZl8kwQRPKvfaVQ5hIAWUZaSU8TJZWuHBhl2MyoCRi\nRBVmXkhQpEgRV8NEbMi2bdv24+z+HZQLmnnJ608//eRqunXr5nJMxIOceeaZQcyuAZM0lC9fPohb\ntGjhap566imXQ1kGGwd4bDMvZp00aZKrYeB4PeWUU1zNXXfdFcRvvfWWqxk5cmTid7H5fcOGDS6H\nQi92D6UVMRYoUCCxJk+ePFGfQ4nRc88952pQIsKEUEyWUbp06SD+9NNPXQ3K9cy84JTNUUyKPG7c\nuCBm9zWToeHfzOYIlIsywSIDRUd4jmb8b0HJWIyUOS0odYsVM6JYha2x+LsxKSGTpZ144omJ389E\ner179w5iNvfEgOKnrIBiY7b/++6771zuuOOOC2Im11m3bp3L4d/M5rq0MKk4woSvTNKM+/Avv/zS\n1eA+jokvmQw9Zk1Ys2aNy+E5lClTxtV88MEHLofjHEW1Zly4xSSLCO7n2f3Zvn17l0PRE9sPotzV\njAtOswv2TIFzKdufMOli/fr1g5gJ+WJg4wCfYWKfH1BAz6ROaffT559/fqrPIY0bN3a5mL0Wm2vY\n3ILn+f333+/H2f07bJz/8MMPQczmbibSQ5hUEucWdl9v3bo18dhs796rVy+X69SpUxAz0Rzbo+G7\nApw3zcyaNm3qcmwuQ/CZlI3fBQsWuNy9994bxA899JCrQWGdmVmzZs2CmEkC08Kk17inZ5JHJnLH\n34Fdl7PPPjuI2XMPe27FPTB7/pw6dWriOaHYb1/guxcmqIvZS+E6aMbfhcSA9webS9k4x7+F1aSF\nPSPiujN69GhXw3L4TowJFr/99tsgZqJofEdm5ucNtue8/fbbXQ6fk9nczf4WhD3rMV555ZWour2p\nU6eOyzHpIs5t7F0J+z3x/s8u2bD+hbUQQgghhBBCCCGEEEKIjEAvrIUQQgghhBBCCCGEEEJkBHph\nLYQQQgghhBBCCCGEECIj0AtrIYQQQgghhBBCCCGEEBlBaulijDjm9ddfd7mlS5e6HDb7Zg37Tzrp\npCBm0oKDD/bv37GpPpNusEb0KFlEEYgZl0AwKUIaRo0alepzTMCAsMb/DzzwQGIdNq83M/v666/3\n4+z+B5SJmXkxDpNGDRs2LPHYKMox81IqJmZMC5MhMUFRDBdffHEQM/kSk+e0a9cuiB977DFXgw3z\nWSN8Jn6bMWNGEDNxzH8adj/u2rUriEuVKuVqnnjiCZfD3xyFh2ZcNIIwGRJKGXAeMzM7+uijXQ7v\nPSZhRcEig92zDBRhnHHGGa7m/fff/9fPmHEhHEp22PxesGBBl0NR4X333edq0rJ58+bEGiZbiZFS\nMSkhzsuzZ892NWxsxpwTymViYeJShMnDmHAZJV9Moom54cOHuxq2P8B5iwkWjzrqKJdDGVrM3xsD\nk3HGShaRefPmJdagDIqRdj1j+yhcYx9++GFXw4RCOO6ZTJbNK7hWMkHUO++8E8Rly5Z1NSiwNPPy\nz9i1i0lKkbFjx0YdC5k7d67LoZhs+fLlruaGG25wOZxLa9eu7WpQNsXOm0kX04rt8Nqw/RGbH5io\nFWHjZ+fOnUHMhNq4t2TjgN1DuC6xZxomS/vjjz+C+NRTT3U1aZk2bZrLXXvttUHM9ogoLzMzW7Jk\nSRCzPQxKNNnzA5vLca1i45cJ60qWLBnEDRs2dDV169Z1uWOPPTaImUQKx4GZH4t58+Z1NSgdmzJl\niqthoERu8ODBroY9RyJsDn7kkUeizgFh4iwUhr/00kuu5v7773c5XPdR3mjmxwYTZeP9Yub/PrbG\ns+ejGPE3e05HGW3nzp1dzc8//+xyuOdlz1C4txs/fnzi95v552s2J1944YUud9555wXx5Zdf7mrS\nwgSrLIcwkSdKzNneGWGiaCbUvuKKK4L4nnvucTXseQzHJ3uOfOGFF1wORep//fWXq4mhQYMGLvfx\nxx8HMXseZesCSnXXrl3rapjwFO9/9n4oLexex7XirLPOcjVsnOPfw/4WNl4Qtq6vWLEiiJngFZ9R\nzcz69++f+H0x4L7GzI8DM7MzzzwziBcuXOhq8Pe97bbbXA27P1CY3aJFC36yAL53YO8l2TqQhP6F\ntRBCCCGEEEIIIYQQQoiMQC+shRBCCCGEEEIIIYQQQmQEemEthBBCCCGEEEIIIYQQIiNI3cOasX79\n+iDG3ipmZhs3bnQ51hMyCdb/JKZXDfbjNeN9QbGnF4P1Yo2hZs2aLod99zZt2pTq2DGwfpusL93q\n1asP2Dmw/ruYu/POO11NTF9F1tM1R44cQVypUiVXw8YB9vP8+++/E7/fjPcIiuGNN94IYtZrjfUn\nfPvtt4O4ePHirgZ7pLF+czE9Va+66iqXYz3E+vTpE8SsX1h2gteY9YSL6fHOeqdjzzDWU3rcuHEu\nh32oWM+9nDlzulyXLl2CmPU+jIH153/11VddDvtEsn5drEcswn47BHtNmvHfJYZ+/fql+lyhQoVc\nDtemmL8lliuvvDJbjsP6k7H+hDgHFitWzNUMGDAg8ftY30jWZxr7vWFs5sdYx44dE7/fzOz4449P\nrPnll19cDvutxfQljqFChQoux3qxIqy/Hvav79u3r6vB3nLst2U9nbHv6eTJk10N2+fkz58/iFn/\nQuyZa+Z7FaNTwIyPHfSMsB7WOP/G+AIYbN/I9hTYhzRmDMbCrgPunRmNGzd2uSpVqiR+DntwHnro\noYmfMfOeGta7PoZWrVql+hyDjZ/s+hwbU+XLlw9i9DiYcd8Mri9z5sxJ/P5Y2N4O9xmsJ+f333/v\ncvjsFXMPVa5c2eUGDRrkcug/YD3KY/ZjbL/ZrFkzl5s1a1YQs3n6jjvucDmcE9h88OyzzyaeJwM9\nCqxHLzo+zHy/7wkTJriatD2s77rrrsRzSNu/nu1l0x7ru+++C2Lsl21m1qlTJ5fDPSHrKcscAbgW\nM/8LWwfQ58Ceq3D/x+YRxpYtW4K4d+/eribm98U19kDTpk0bl2P7fnzvwJ6bW7ZsGcQ9e/aMOgfs\nH4/H2df3xVwb7Fdt5nvfs/7GMYwePdrl8L0D6+ufpiewGd874/ex+7p79+6pvi9mzsfe22a8/zY+\nN7J9MFsrkHLlyiXWMJhLIQa2H8Bryn4n1tcaYe9wcC5j8xh79mA9+xG2puJcnfZ9GKJ/YS2EEEII\nIYQQQgghhBAiI9ALayGEEEIIIYQQQgghhBAZgV5YCyGEEEIIIYQQQgghhMgI9MJaCCGEEEIIIYQQ\nQgghREZw0P40aq9YseIelN8I8Q8HHXTQkj179lTc13/X+BH7QmNHZAWNH5EVNH5EVtD4EVlB40dk\nBY0fkRU0fkRW0PgRWSFp/PzD/9fenQZZVV39H99EkWammZEZGRRQQ5gEwSEYGRQjIWqCEaJgrKAh\nGjVqND7BMlUaZ4iCccABVFKKEk0cUAkiCAo4oczzbDNDAw0a/i+ef6qevdYP+tC3G073/X7ereVq\n+thn332GurUW37AGAAAAAAAAAKQCL6wBAAAAAAAAAKlwRC1BypUrlxdCWFVyh4NSrunBgwfr+rA9\nagAAIABJREFUHOo/sn5wGKwdZIL1g0ywfpAJ1g8ywfpBJlg/yATrB5lg/SATh10//3VEL6wBAAAA\nAAAAACgptAQBAAAAAAAAAKQCL6wBAAAAAAAAAKnAC2sAAAAAAAAAQCrwwhoAAAAAAAAAkAq8sAYA\nAAAAAAAApAIvrAEAAAAAAAAAqXD8kRTXrl37YLNmzUroUFDazZ07d/PBgwfrHOq/s35wKKwdZIL1\ng0ywfpAJ1g8ywfpBJlg/yATrB5lg/SATha2f/zqiF9bNmjULc+bMKfpRoUwrV67cqsP9d9YPDoW1\ng0ywfpAJ1g8ywfpBJlg/yATrB5lg/SATrB9korD1819H9MLa/IKi/ijKkIMHDxbp51g/CIH1g8yw\nfpCJoqwf1g5CYO9BZlg/yATrB5lg/SATrB9koijrhx7WAAAAAAAAAIBU4IU1AAAAAAAAACAVeGEN\nAAAAAAAAAEgFXlgDAAAAAAAAAFKBF9YAAAAAAAAAgFTghTUAAAAAAAAAIBV4YQ0AAAAAAAAASAVe\nWAMAAAAAAAAAUuH4Y30AQGlSrlw5lzvuuONcrmrVqlF88OBBV3P88f7jt2fPnsPGQKbUGrbUekXZ\notYB5x3W977nv9egrnl2PX333Xeu5j//+Y/LseYAAAAAKHzDGgAAAAAAAACQCrywBgAAAAAAAACk\nAi+sAQAAAAAAAACpwAtrAAAAAAAAAEAqMHQR+P/UcKl69epF8fDhw13NsGHDXK5WrVpRrIZNFRQU\nuNz69eujuF+/fq5mxYoVLgcoOTk5LqcGpu3fvz+KDxw4UGLHhJJnz3G1atVcTfXq1V1u165dUbx1\n61ZXw5C8skPtBRUrVoxitXaqVKnictu3b49iu6eEoIcIqzoAQLrZQbvcGwAASgLfsAYAAAAAAAAA\npAIvrAEAAAAAAAAAqcALawAAAAAAAABAKvDCGgAAAAAAAACQCgxdRFaww0HUICk1PPGaa66J4qZN\nm7oaNbhKDXC0jj/ef/yaN28exSNHjnQ11157rcvZYWnITnZNXXfdda7m8ssvd7mbb745it9//31X\nowaH4thT+8igQYOi+LbbbnM1devWdTk70HXgwIGuZtWqVUd6iEiBE044weXatm3rcuecc04UqwGs\nM2bMcLlNmzYV+nOKvX6qwV02x3CvssfeM9WoUcPVqEGx+fn5UawGxX777bcZHh0yZe/Bk+Kznl7H\n+tyo5yy7ztR967E+bpR9Sfc7e/+j7ucrVKhw2J8JIYTKlSu7nL3H37Ztm6tZs2aNyyW9dwOOJr5h\nDQAAAAAAAABIBV5YAwAAAAAAAABSgRfWAAAAAAAAAIBUoId1GaP6JmVbvy71NyhfvnwUd+jQwdUM\nGTLE5Ro0aBDFqreT6h9t/+aqL5U9phB8r6r+/fu7mrFjx7rcrFmzoph+w9mpSpUqUWx7sIcQQr16\n9VwuLy8virNtzygtVM/GPn36uNzdd98dxXYfC0Hvk23atIninj17upq1a9e63HfffecPFseUvea0\nbNnS1fz5z392udatW0fxK6+84mq2bNnicvbaqK5Bqo921apVC63ZsWPHYeMQ2LNKuzp16kTx7bff\n7mrOOOMMlxszZkwUT5w40dXY/Ym1UnTqGqQ+s7YHubre7Nu3z+X2798fxQUFBa5GXW+K65yqe3X7\n/6x6onPPXbLUuqtdu7bLVapUKYo3btzoatSaYk9ACL4/tH2mCiGE3Nxcl2vVqlUUq3cMKtepU6co\ntutX5dReqvpa2z1p+fLlrsY+K4QQwltvvRXFe/bscTXA0cY3rAEAAAAAAAAAqcALawAAAAAAAABA\nKvDCGgAAAAAAAACQCrywBgAAAAAAAACkQiqHLiZpKK8GMKihCbbpvBqMkcZhC+pvULFixShWx20H\nloSQfQOx1NqoXLlyFNvBUiGEsGLFCpfbunVrFNvhhiGE8Omnn7qcHaiYk5Pjaq644gqX6969exTb\ncx6CHoT2ySefRDEDYLJT48aNo7hRo0auZu/evS5nB+mlcU/MRnYvU0NbRo0a5XL169ePYjWQRV1j\n7D41dOhQV/PRRx+5nN072X+OLnUu69atG8V33HGHq+nRo4fLLV68OIr/8Y9/uJrt27e7nBpIbNmh\nwiGEcOKJJ0Zxv379XI29vr377ruuRg1CQzqpe7Qf/vCHUTx48GBXo+5l169fH8XqHpjrWdHZa4ca\n2nzJJZe4XLt27aJYDfyaO3euyy1atCiK1YBXNazRXnPUOU9yzTv55JNdTdeuXaP4zTffdDVr1qwp\n9JiQnD1Xat2pgXE1a9aM4pdfftnVvPrqqy5n1xTnrnSz60ddc+xg2BD8YN+LLrrI1Vx44YUuZweA\nJhnemlSS65e6/7HXy2bNmrma3r17u5y932LoYvFS1yGVS8KujbJ8r8M3rAEAAAAAAAAAqcALawAA\nAAAAAABAKvDCGgAAAAAAAACQCqnoYW17t6jeP7YvVbdu3VxN8+bNXS43NzeK8/PzXc2SJUtczvZ0\n3bhxo6vZuXOny9k+WKovjerjWKdOnSju0qWLqxkyZEgUT5o0ydWMHz/e5ez/c1nucROC/v+z/TUn\nTpzoal544QWXs+dP9VBU/WHtGrb9rUII4Wc/+1mhv6+goMDVbNiwodCfU+uurJ/3bKP6ofXq1SuK\n1V6j+r+qvQzHnu1FPW7cOFej+pTb/SdpfzS7ptR1SPU0fvjhh6NY9Yi08wDoEVl81Od82LBhUax6\nMe7atcvlbE/0L7/80tWonoZJri/q5+w1TvVUtL0XVR/1HTt2FPr7kQ7qHt/e31apUsXV5OXluZzt\nuZ5tM1uKk7qnsPeuw4cPdzUjRoxwObsfrFy50tWofuP2XkTtGeoc2x6uaj+ys2VC8D30H3vsMVfT\nvn37KFb35c8//7zLcY0rOnuurrrqKlczaNAgl7N/c/sOIATf9z4EP4tI3RNzPtNJ7VvVqlWLYjX/\n5Ve/+pXLnX/++VGsrkNJelGrPSrJtUmtMdvH/4MPPnA1s2fPdjn73qx69equRs3gsr+Pdwf6nKvn\nKrtv2flpIfj5DiH4+3P1jrNq1aouZ/eyd955x9XMmzcvij/77DNXo+6f03be+YY1AAAAAAAAACAV\neGENAAAAAAAAAEgFXlgDAAAAAAAAAFKBF9YAAAAAAAAAgFRIxdDFJGwD/U6dOrmaPn36uFzTpk2j\n+IQTTnA1agCMHaSnmo/bIR8h+KGLaqiI+n2VKlUq9DjtMajhe3//+99dTg2aLMvU0IKSHDypzmdO\nTk4Uqyb7nTt3djnbxH/NmjWuZuHChYUeE0MXyz617vr37x/F6rPw6KOPupzay3B02T0jhBCuv/76\nKLbD50LQ68BSn/0kOTXM75RTTnG50aNHR/HQoUNdzR133BHFM2bMcDVqmBWDjmJqb2/QoIHL2SF2\n6ueeffZZl5syZUoUq6FnRT0nauiQvTar/xc7GM3eL4XA0MXSRA2h7tq1axSr9bp8+XKX27RpUxRz\nn1N0aoC43e/Vc5by9ddfR/Fbb73lapYuXepy9llPDQqzQ9QVtUepwVl24P2pp57qaipWrHjY+FC/\nD8moz3qLFi2i+Oqrr3Y16v7EPnM3btzY1dxzzz0uZ4dtquHSahAjQ16PLvUZbtu2rcvZIZ3qeVtd\nh9auXRvF6pqzaNEil1u2bNlh4xD8MMMQ/PrZvXu3q0lyjVP7j302UPuWWr/qnq+0snuLWj9qsKbd\nf2wcQght2rRxuYsvvjiKW7du7WrUIEZ17bXUebfX5549e7oa+x5pzJgxrka9O9y8eXMUq7Wi9u6S\n2hP5hjUAAAAAAAAAIBV4YQ0AAAAAAAAASAVeWAMAAAAAAAAAUoEX1gAAAAAAAACAVEjF0EXbSFw1\n7F6/fn0UP/fcc65m8eLFLmcb7Xfr1s3VtGzZ0uVss3rVEF0NRrRN7ZM2x7eNy9UgLft32b59u6vZ\nu3evyzGEpmT/Bmod2Gb8duBYCHpwlF0bS5YscTWrVq1yOTs0jwEwZZ8aGNKxY8cotkNgQ/DDkEJg\njzjakg7OGzBgQBSrYR1KkmuqGu5ih3OUL1/e1TRv3tzlbJ1dhyGE8Oqrr0bxAw884Goefvhhl7PD\n9LJ9rapzcuWVV7pco0aNotgOEwohhBdffNHl7GAgdS0p6jlIsu7tgMUQQti1a1eh/w7SSQ05Ov/8\n813ODj5Sa+zDDz90OXWNQ9FUrVrV5fr27RvF9erVczVqeOL9998fxV9++aWrUQPh7TGoYapqmL29\nxqk9Qj3H2SGLajCZfa5SA9Wy/bqUCfW8a/cIdX+k1sH06dOjWD1DXXbZZS531113Ffr7nnzySZfb\nunVrFPPsVXTqM2vXhnpfY/eaEPwwury8PFczfvx4l7PDNleuXOlq1DXH7j9pWAf286HeDyllaS+z\na6phw4auZuTIkS5nn71ycnJcjdq37O9Ta1r9fZOcK3sfHEIINWrUKPSY7P/zrbfe6mrUM8SMGTOi\nWD2fbdiwweXsdb241hPfsAYAAAAAAAAApAIvrAEAAAAAAAAAqcALawAAAAAAAABAKqSih7Wl+p3Y\nfi7Lly93NatXr3Y52zfT9nsJIYT27du7nO2jqPpGqn5vtv+Z6jnapEkTl+vTp08UV6tWzdUUFBRE\n8eTJk11N0h5FKBrVj0j19LvhhhuiWK0x1dvR9v6ZPXu2q1E9/dLQLwslR62Vnj17upzdbz7//HNX\ns3nz5uI7MBSJ6qV50UUXuZy9DiXt3Wv3g23btrmaUaNGudw///nPKFb9+9q1a+dyTz31VBS3aNHC\n1dhr4y9+8QtXY6/XIYQwf/78KFb9uMsye85r1qzpagYPHuxy9j7qmWeecTXqPsr+fYuzn6Hax7p0\n6RLFaibEggULonjnzp3FdkwoWWqv+8lPfuJydm2oPqFvv/22y3HvU3zU88rZZ58dxbbXeAj+86ly\nttdvCP6ZJgQ/m0etgyR7kuo52rZtW5ez82XUHmV7p6te6mWp7+vRVrduXZcbMWJEFKt7H3W/8Otf\n/zqKDxw44GrUNcb2tf7973+vD9awfa3VOmePSkZdK84888wofuKJJ1yNega3s57GjBnjal5//XWX\nszM8ytL9ZjbuUfazftVVV7man//854X+nKL2FvsOTs0cmzJlistNnTo1iu1zTwi6Z799HlP9+Xv3\n7h3FderUcTW5ubkuZ9+Xqs+LnXsUQsmtM75hDQAAAAAAAABIBV5YAwAAAAAAAABSgRfWAAAAAAAA\nAIBU4IU1AAAAAAAAACAVSs3QRZtTQwy+/fZbl7NDPXbv3u1q1q1bd6SHmNjxx/s/sRr80bdv30L/\nrbVr10axGqiGkqXO57nnnuty9nyqoZ1qvc6YMSOKX3vtNVejGu+jZCUZdleSAy3UMJIf//jHhda9\n/PLLrkYNOsLRpQZXDRw40OWSDP5Q10I7+OOll15yNZMmTXK5pUuXRrHao9Qg2CFDhkSxGoZUv379\nKK5Vq5arUTm7d5alIThJ2L1HXW8aNWrkcosXL45iOxwqBD/kN4SSHRCl1nP37t2jWO2jdkiNGsSG\ndFIDxM844wyXs+tcDQf+4osviu/A4P7mauhihQoVolh9htX9rd3L1V6j2GuXGoKo2OM86aSTXM3w\n4cNdzg42VnvLuHHjDnuMSE6dz/79+7tc48aNo1jdi4wePdrl1FB6y57PEEK48MILo7h27dqu5re/\n/a3L2We2mTNnFvr78b/s/qPui3/zm99EsV0XIei1YQfEvfHGG65GXWMYkFm22GvaFVdc4WrUNc2u\nA7WvjB8/3uUmTJgQxWqwuXoPaQc4qnWo3kPY5/kGDRq4mtNOOy2K7bNYCMmusxs2bCj095ckvmEN\nAAAAAAAAAEgFXlgDAAAAAAAAAFKBF9YAAAAAAAAAgFTghTUAAAAAAAAAIBVSOXSxOCUZhFaSw9JU\n4/RzzjnH5eywAXVMdnDWzp07Mzs4HDHVrP66665zuRo1akSxapa/atUql/vjH/8YxcuWLXM1DIXI\nPjVr1nS5Pn36uJwdPjJ58mRXk21D69IoNzfX5erWretySQZhqCFRf/jDH6L46aefdjVqcFSSa6Ea\ncLNo0aIoVnub3TvtkKwQ/ACsEPzQFDV0tizviXbQ77XXXutq1HkbNWpUFKdhwFDFihVdrmPHjlGs\njmnhwoVRzB5WeqiBaup6Zqmh4kkGqqHo9uzZ43JfffVVFJ9yyimupkuXLi5nB1KtWLHC1cybN8/l\n5syZE8Vq0FOlSpVczl5f7DDXEPxgvRD8vbkadP7BBx9EcUk+M5Z1asDZNddc43J2kKdaP/Pnz3c5\nez7VQFB1/cjLy4viOnXquBo1FND++6yN5Oz9bdu2bV1Nz549o1idz23btrncCy+8EMX2/IZQtu8b\n8b/sc4Z9NxOC/swmGVxvByyG4IedqwGLSfYItc7V/mOHsI8YMcLVnHrqqVF83HHHuRr1HHnbbbdF\nsdpvj+Z+xzesAQAAAAAAAACpwAtrAAAAAAAAAEAq8MIaAAAAAAAAAJAKZb6H9dFm+2e1aNHC1dg+\nxSH4njKqP7Xtl3PgwIGiHCKOQE5OThT/5S9/cTW2P1AIvjeX6g90++23u9wXX3wRxZzj7GT3Edun\nKoQQqlWr5nLr16+P4pUrVxbrcaFo7Pls166dq6lXr16hP6f2A9urL4QQnnzyyShW+09xsn0pa9Wq\n5Wrs/4vtzRxCCGeddZbLLViwIIpV7+2i9uMuDWzfZ9VDVvWefe+996JY9R4vSar/eocOHVyuUaNG\nUVxQUOBqbD/jsnJuyyJ7Lzt06FBXo9aGPafvvvuuqznaa7iss3/zjRs3upr77rsviteuXetqevfu\n7XINGzaM4k6dOrmarl27FnpMamaB2u/ttVH1y7fzEELwvW0ff/xxV7Nly5bDHiOSU31Y1WwgS/W+\nPu2001zOnqvatWu7GtXf3PZFV32u1XU2Pz/fHywSsX/zq6++2tXYeQfqvNg++yGEsGbNmiimX3V2\nss8+qg+zujbZPb5bt26uRu1ldgbD3LlzXY2aJ2N7bau97bzzznO5Xr16RbG97obgn73U9VO9l3zl\nlVei+FjPjuEb1gAAAAAAAACAVOCFNQAAAAAAAAAgFXhhDQAAAAAAAABIBV5YAwAAAAAAAABSgaGL\nxax8+fJRfOmll7oaNSzNDgR49NFHXQ0D1I4+OxytT58+rkYND7Pn86OPPnI177zzjsupATM49o72\nkB27pi6++GJXY4dbhRDCqFGjorikh+0hGTtkTA2fs0M3lNWrV7vcyJEjXe5on3c7MFINXbTUEJzG\njRsXmlNDv9QQkbLCDg9TQwk3bNjgcnZwsx28EoLe12yd+jk1NM/W2YFKIYQwYMAAl7N73bx581yN\nGgaHdKpatWoUq+FBak3ZdT1t2jRXw7C7kqXuP+0gcDXg7KGHHnI5Oxy2c+fOrqZVq1Yul5ubG8Vq\nQJU6ztatW0dxly5dXI0aWmwHSy1evNjVHOthU2WJuu6rZ9s6depEcZMmTVzNW2+95XLbt2+PYrXX\nKPY6pK6zu3btcjn7PJ/09yGEBg0aRLEdIBeCfs6x1KA5u4+oc1ecgxjtPVGS4w7BDxLmGle87LOQ\nGi74pz/9yeXsfYx6z6MGMf7gBz+IYnX9UnuL/SzYWB1TCHoYrWWHxY4dO9bV/O1vf3O5tL2P4hvW\nAAAAAAAAAIBU4IU1AAAAAAAAACAVeGENAAAAAAAAAEgFXlgDAAAAAAAAAFKBoYsZUMMV7KCIyy67\nzNWoZvx5eXlR/OKLL7oa25wfxUudz+HDh0exanqv2CFgjzzyiKtRQyCAEEKoXLlyFPfs2dPVqP3A\nDhBigEc65OTkRPEFF1zgatTwDDvs6bHHHnM1auBeSVLDR/r16xfFVapUcTV2LX7zzTeuZsyYMS73\nwQcfRHF+fn6h/3ZZYj/nW7duLbQmhBCqV68exWoQpxpCZod/quEvNWrUcDl7baxfv76rUeveDj6a\nNGmSq2F4bOlhhyyq4ZvKtm3bolgNmMXRZ/dWtdds2rTJ5ez+Pn36dFeTdKCrZe+PQgjhyiuvjGI1\nEGvRokUuN27cuCi26zCE4h3Olu3Uc48aHP3Xv/41ips2bepq7EBilVP3BmqYWJLBmmoo9C233BLF\ns2bNcjU862m7d++OYnUvawcqqvcnzZs3d7mXXnopitUaUwOe7UA8dV+u7n/sANk2bdq4GjvANoQQ\nPvnkkyi2w7JDKNv3tyXNvouZOXOmqxk4cKDL2XV38sknu5pmzZq5nL1fbtmypatR+4its8+MIejr\npb02rVu3ztXceuutUayG1drBjGnEN6wBAAAAAAAAAKnAC2sAAAAAAAAAQCrwwhoAAAAAAAAAkAr0\nsM6A6qV0zTXXRLHtaxSC7pV11113RfGCBQtcDX2MSlZubq7L9e3bN4rVOVf97ebPnx/FU6ZMSfRz\nyD6qL1WPHj2i2PbGDyGE7du3u9zGjRuL78BQbE488cQoVtcF1bvT9l+bO3euqynJ64I6pl69ernc\n4MGDo1j1uba9T22/9RBC+PDDD13O9n9M0muyLLH9m1esWOFqzjnnHJd77rnnoljdU5QvX97lbO8+\n1W9PXbvsWlV9O+vWretydv9TfSy590knde2yc1vUHqLO59SpU6OYvq+lmz3HRd231fpRvYsvvPDC\nKFZ72xtvvOFyX3/9dRSrfvnsP8VH9UB/7733XK53795RfP3117ua888/3+Xs/Ax7XQohhH//+98u\nZ9fUmWee6WrUtdDWqWN67bXXojjb7mEOZfPmzVF8//33u5r77rsviu29dAj6s96pU6coVvebaoaH\nvbdRPazVewC7T6lr45YtW1xuwoQJUXzvvfe6Gvt34t1BcklmMKi5Bfb5Oun9s+09bZ/lQwjh9ttv\ndzm7ztT6UfvGmjVroviXv/ylq7F99dW6Lw3XOL5hDQAAAAAAAABIBV5YAwAAAAAAAABSgRfWAAAA\nAAAAAIBU4IU1AAAAAAAAACAVGLqYkGqA3r17d5e76aabolg17F+6dKnLjR8/PopVY3gUH3U+zzvv\nPJerWbNmof9Wfn6+y91xxx1RrAZ/lFZqCI5im/iXhqb+x0KFChVcbujQoVGshju8/fbbLldQUFB8\nB4YiUXtL586do9gO5jjUz9nhKuozpH6uqJ81+9lWA4TGjBnjcvXr1y/0mHbv3h3FkydPdjU7duxw\nuWwfUGQ/05MmTXI1ag9p0aJFFA8YMMDVqHVo187+/ftdzfLly11u3rx5UayunWofswOM7DoJgSFD\naaXWnd0z1P2Cur+11zPugbOTvXZUrlzZ1dxyyy0uZ4ffqfUzbdo0l7P7K/epJUv9fdUQMDtc2D5T\nhRDCY4895nL2mTsvL8/VqPsMO3RRDUt7/vnnXc6uzwceeMDV2GHZq1evdjXZeI2z510NRf3444+j\neNiwYa5myJAhLmcH1at3Mer+x0p6Xuy+pa57tWvXdrn+/ftH8TPPPONq7FBA9Rli3ypeSYYGJ3k2\nadSokcudfvrpLmcH1avrlx2eGIIf4Dhz5kxXU1bupfiGNQAAAAAAAAAgFXhhDQAAAAAAAABIBV5Y\nAwAAAAAAAABSgRfWAAAAAAAAAIBUYOhiQtWqVXO5cePGuZwd3KAGCA0aNMjldu7cmcHR4UjZQU8h\nhHDiiSe6nG2ErwYwTJkyxeVmz56dwdFlTg09s0Mg1N9A5ezwCjtALgQ92MQOCFDDuxBC9erVXa5b\nt25RrIYmjBo1yuWycXBLaWCvA0kHCdohdeqzp4b47tq1q9B/u1KlSi539tlnR/Ho0aNdjRocY/cW\n9f9nh+d8/fXXribbBywq9rP/6quvupr333/f5Tp06BDFTZo0cTVq6JC9F1m4cKGrWbBggT7Y/8MO\nEzpUzg63UdcSBgqlU7169VxO3UdZaujZ1KlTi+WYUHqo+9Qk1zw1ZM0OVZszZ46r+eKLL1yOvSWd\n7L2s2jOSPDcnPb979+6N4nfffdfVPPTQQy532223RXHDhg1dzf333x/FV155patJcs9W1thzs2/f\nPldjB1Tec889rubJJ590ubZt20bxj370I1dz0kknuZzdf+w7gBBCaNy4scvZwePq3koNna5Vq1YU\nf//733c19h6/rAzRK+3U9cs+uz/44IOuxr4nDME/+6j77hEjRricvaaV5WcovmENAAAAAAAAAEgF\nXlgDAAAAAAAAAFKBF9YAAAAAAAAAgFSgh/Uh2J6cAwYMcDVNmzZ1Ods/5sYbb3Q18+bNczn6qB1d\nqr+U6pWXpDfr1q1bXS43NzeK1flV/axs3zbVk1j1P2rRokUUt2zZ0tXY/7+uXbu6GtXXtkaNGlG8\nZ88eVzN+/HiXmz9/fhSrv1O2sesphBBat27tcvZvrnrh295uSC97rrZs2eJqqlSp4nK2L+f//M//\nuJpLL73U5TZu3BjFtr9eCCHUrVvX5Ro0aHDY3x+C7ttm98XNmze7mqeeeiqK2Q+SsdeOpL08161b\nF8XqvCm2Tl2DVM5eO1SfRXUMBQUFUazWBfdHx546dz169HC5ChUqRLE6d9OnT3e5DRs2ZHB0KI3U\nmrLXwU6dOrkadV2yPYAfeeQRV5Ofn3+khyip41Y5u/bZx4pXcf497TXN9rQOQc8rsn1l1bwr29e2\nUaNGrkb1rM229ZLk/1c9f65Zs8bl1q9fH8XTpk1zNeoZ3D5L9+rVy9VcfvnlLmfXj+rHrdh9w86M\nCiH71kEaqf3d9h8PIYSXX345itX7GnU+P//88yi+6qqrXE22z2DgG9YAAAAAAAAAgFTghTUAAAAA\nAAAAIBV4YQ0AAAAAAAAASAVeWAMAAAAAAAAAUoGhi4dgByf87ne/czWqCfunn34axRMmTHA1amAR\njq7jj/dLXw0qtA3t1dC8n/70py5nB+kdOHDA1TRs2NDlqlevXujvU0387RAaNUzC/lvK6it8AAAK\nO0lEQVSqWb8aKmlzeXl5rmbTpk0ul03DAJJS51MNbz3uuOOi+JtvvnE1aigM0mnVqlVRrAbADBo0\nyOXsPlW1alVX07FjR5ezA+/sejpULslgPjskLwQ/MGjMmDGu5rXXXjvsMSIZta+qXJL7jKSDGJP8\nnL3mtG/fPtHP2eGQdlgS0kFdu84666xC69Q9xeuvv+5yqg7Zx17j+vXrl+jnFi1aFMVFHeKZZKCi\n+iwk3ZdROqjr51dffeVy9t6nS5cursYOZ7vgggtczeLFi12OPdFL+jmzOXU+1WfdDijv06ePq7GD\nGUPwz+XqmV8dg32eVoP17L/FvnL02WHSIYRw/fXXu1yNGjUK/bdWr17tcpdcckkUr1ixwtVk+3nn\nG9YAAAAAAAAAgFTghTUAAAAAAAAAIBV4YQ0AAAAAAAAASAV6WAfdj6xbt25R3KZNG1ejehTddNNN\nUZyfn5/h0aEkqD6sU6dOdbnTTz89im2v6BB83+kQQujRo0ehx1DU/qFJqF5Ztmes6oG8YMECl5sz\nZ04UT5w40dWsXbvW5Xbu3FnocWYb1YNK9SS3VA9r+tulkzrHO3bsiOJ7773X1Zx88sku16FDhyhW\nvemT9KdOutfYPUL1pn/uuedc7plnnoniZcuWuRrWa/qotVrU61KlSpWiuEmTJq5GXXcnT55caA2O\nPbXPnHrqqYX+3L59+1zO9htGdlL7j53boGZ8qD1q9uzZUbx9+3ZXo+6L7fOf+rftcaoa9W9ne8/R\n0kydO/XM9Pzzz0exvWcLwT83Dhs2zNWMHTvW5Xbv3l3ocSIZde+s7lHuuuuuKFbXOPVvWerdj7qf\nfvDBB6N47ty5roZ756PP7vHnnnuuq7n55psL/Tm1Z1x99dUuZ3tWc+3w+IY1AAAAAAAAACAVeGEN\nAAAAAAAAAEgFXlgDAAAAAAAAAFKBF9YAAAAAAAAAgFRg6GLQQ/PuvvvuKLaDQEII4b333nO5WbNm\nFd+BocTs37/f5caPH+9ydvhmx44dXY0axGgb5quBLGqQgh16pmp27drlcuvWrYtiNTxx9erVUTxv\n3jxX8/HHH7ucHfyhhiipAQEMDfDUsJ5q1aq5nF0vW7ZsKbFjQsmz53PhwoWupm/fvi535513RvEl\nl1ziamrVquVydkBa0gFC06ZNi+I77rjD1SxZssTl7KA8Pvtlh9qz1AC+1q1bR7G6VqpBvPZaxYCh\ndLJDNUMIoU6dOi5nP/tqcNiGDRsK/TmUfWof6dy5cxTXrVvX1ag9KScnJ4rVfVWFChVcLsl+c+DA\ngSjmfjc72eezEELIy8uLYjtgOwS/TzZs2NDVNG/e3OXmz58fxawxTe0H9p2Nun61b9/e5apUqRLF\nan9Icj89btw4V/Piiy+6nD3H6vkaR1+9evWiWA2bV+9+7B5hh3iGEML777/vcny2C8c3rAEAAAAA\nAAAAqcALawAAAAAAAABAKvDCGgAAAAAAAACQCrywBgAAAAAAAACkQtYNXfze9/w7+osuusjlbDN+\n1Xj/0UcfdTk1zA/po86nGoQ2ePDgKD7jjDNcTW5urstt27YtitXQPDusI4QQNm/eHMVqAEN+fr7L\n2XXHUJh0Uudg1apVLrd27doo/uijj1wNe03ppdaB3TNCCOHGG2+MYjuEMYQQunfv7nItWrSIYrVW\n7LCXEEL48ssvo3jPnj2uBmWHGlZkc6qmfPnyLtekSZMoVtfYJ554wuXefPPNKFaDrXD02fOu7p3V\nvYgdMKv2ELX/2d/H/UrZp4Yg2utZxYoVXY1aG/aaZwclhqCHn6u6wn5O/Tus15KlrkNKUc+D2t8s\ndd4/+eSTKJ45c6ar6d27dxSr+7GBAwe63NKlS6M46cD7sizJgMUQ/N6ifk4NgZ41a1YUq8GwW7du\ndblnn302itWARTWQM9vOXxqp9fP0009Hcc2aNV2NOnf2uWrs2LGuhsHiRcM3rAEAAAAAAAAAqcAL\nawAAAAAAAABAKvDCGgAAAAAAAACQClnXw7p69eoud8MNN7ic7Wlje8qG4HtXhUA/otJM9c60/YVV\nv2EgKdW76l//+pfLLVu2LIpXr17tapL0XkTpZnsm7tq1y9W8/fbbR+twkAWS3MMkmZEwd+5cVzNh\nwgSX++abb47496Pk2fOg+qdOnz7d5Vq1ahXFmzZtcjVJ+9Gi7FDnXD2PtWzZMorVfY7qi257By9f\nvtzVJOkBXNT9D8XLrhfV77yovcRzcnJc7oQTTohida+l2P1t5MiRrmbBggVR3K5dO1ejni2T9NXO\nNur8qmd3+6yl9oypU6e63KefflroMWzfvt3l7D7FHlF6NGzY0OU6d+4cxer6pa4ndrad6pOOomE3\nBAAAAAAAAACkAi+sAQAAAAAAAACpwAtrAAAAAAAAAEAq8MIaAAAAAAAAAJAKWTd0sWrVqi5Xr149\nl7MN++fMmeNqVON9Gu0DOBJqGMjnn38exUmGnAHAkSjqHqKGQdnhMs8++6yrUcOr1SBapI8aMDR6\n9GiX++qrr6JYDRNT64DrWfZRA6nuueeeKFZDqT/++GOX++yzz6J4//79GR4djiW7HxQUFCT6OXtt\nUsPS1F6jBjgmqbHHZfe/EEIYM2ZMFLdo0cLVqGF/e/fujWL2SK2oz0dqj7BDoFG2qP2gZs2aLmfX\nj7pPXbFihctNnDgxipPsK0iGb1gDAAAAAAAAAFKBF9YAAAAAAAAAgFTghTUAAAAAAAAAIBV4YQ0A\nAAAAAAAASIUyP3TRNlhXw4LUkIRmzZpF8YMPPuhqDhw4kNnBAYDAoAYAaaCGF9lhUCH44WhqSI3a\n1xgkVTqoc7d48WKXW7JkSRSrIUdc37KP+pzv3r3b5aZPn37Y+FD/Fsq2pOc8yRBfte6Ki/r9dsis\nGuz37bffuhz7JFDyli9f7nJ33nlnFLdq1crVPP744y5XkntLtuMb1gAAAAAAAACAVOCFNQAAAAAA\nAAAgFXhhDQAAAAAAAABIhTLfw9r2vVq5cqWrGTBggMtVrlw5irds2eJq6GENAACyieqtuX///mNw\nJEgbe89Nv2EcCdYLyhp7vdy3b98xOhIgu6nry44dO1xu7NixUaxmcXCtOrr4hjUAAAAAAAAAIBV4\nYQ0AAAAAAAAASAVeWAMAAAAAAAAAUoEX1gAAAAAAAACAVCjy0EWajSMTrB9kgvWDTLB+UFSsHWSC\n9YNMsH6QCdYPMsH6QSZYPygqvmENAAAAAAAAAEgFXlgDAAAAAAAAAFKh3JF8Pb9cuXJ5IYRVJXc4\nKOWaHjx4sM6h/iPrB4fB2kEmWD/IBOsHmWD9IBOsH2SC9YNMsH6QCdYPMnHY9fNfR/TCGgAAAAAA\nAACAkkJLEAAAAAAAAABAKvDCGgAAAAAAAACQCrywBgAAAAAAAACkAi+sAQAAAAAAAACpwAtrAAAA\nAAAAAEAq8MIaAAAAAAAAAJAKvLAGAAAAAAAAAKQCL6wBAAAAAAAAAKnAC2sAAAAAAAAAQCr8P1Ss\nfibwjnPWAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(nrows=2, ncols=10, sharex=True, sharey=True, figsize=(20,4))\n", "in_imgs = mnist.test.images[:10]\n", "noisy_imgs = in_imgs + noise_factor * np.random.randn(*in_imgs.shape)\n", "noisy_imgs = np.clip(noisy_imgs, 0., 1.)\n", "\n", "reconstructed = sess.run(decoded, feed_dict={inputs_: noisy_imgs.reshape((10, 28, 28, 1))})\n", "\n", "for images, row in zip([noisy_imgs, reconstructed], axes):\n", " for img, ax in zip(images, row):\n", " ax.imshow(img.reshape((28, 28)), cmap='Greys_r')\n", " ax.get_xaxis().set_visible(False)\n", " ax.get_yaxis().set_visible(False)\n", "\n", "fig.tight_layout(pad=0.1)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }