Last active
January 12, 2021 10:04
-
-
Save ceceshao1/935ea6000c8509a28130d4c55b32fcd6 to your computer and use it in GitHub Desktop.
Generative Adversarial Networks using Keras and MNIST
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Using GANs and Keras to generate handwritten digits like MNIST" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"This notebook is adapted from Wouter Bulten's excellent tutorial (see the original blog post here: https://www.wouterbulten.nl/blog/tech/getting-started-with-generative-adversarial-networks/)\n", | |
"\n", | |
"\n", | |
"### The notebook covers:\n", | |
"1. Key imports (defining your Comet experiment)\n", | |
"2. Defining the discriminator and generator models\n", | |
"3. Creating the discriminator and generator models (and specific establishing parameters)\n", | |
"4. Training the GAN (and how to check the training progress)\n", | |
"5. Checking final results" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 1. Key imports" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"First, we import the comet_ml library, followed by the keras library, and others if needed. The only requirement here is that comet_ml be imported first. If you forget, just restart the kernel, and import them in the proper order" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Import Comet before your other imports \n", | |
"from comet_ml import Experiment " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"In order for comet.ml to log your experiment and results, you need to create an Experiment instance. To do this, you'll need two items:\n", | |
"\n", | |
"- a Comet api_key\n", | |
"- a project_name\n", | |
"You can find your Comet api_key when you log in to https://comet.ml and click on your project." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Click on the API key button to copy the key to your clipboard.\n", | |
"\n", | |
"It is recommended that you put your COMET_API_KEY in a .env key in the current directory. You can do that using the following code. Put it in a cell, replace the ... with your key, and then delete the cell. That way your key stays private.\n", | |
"\n", | |
"```\n", | |
"ipython\n", | |
"%%writefile .env\n", | |
"```\n", | |
"\n", | |
"COMET_API_KEY=...\n", | |
"It is also recommended that you use your project_name in the cell, so you can match the results with this code. You can make up a new name, or add this experiment to a project that already exists." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"COMET INFO: Experiment is live on comet.ml https://www.comet.ml/ceceshao1/mnist-gan/cf310adacd724bf280323e2eef92d1cd\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"# Establish this notebook as your Comet Experiment - set your API Key and which Comet Project and Workspace you'd like the experiment data to report to\n", | |
"experiment = Experiment(api_key=\"INSERT API KEY HERE\",\n", | |
" project_name=\"INSERT PROJECT NAME HERE\", workspace=\"INSERT WORKSPACE NAME HERE\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/anaconda/envs/py35/lib/python3.5/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", | |
" from ._conv import register_converters as _register_converters\n", | |
"Using TensorFlow backend.\n" | |
] | |
} | |
], | |
"source": [ | |
"# Keras imports \n", | |
"from keras.models import Sequential\n", | |
"from keras.layers import Dense, Activation, Flatten, Reshape\n", | |
"from keras.layers import Conv2D, UpSampling2D\n", | |
"from keras.layers import LeakyReLU, Dropout\n", | |
"from keras.layers import BatchNormalization\n", | |
"from keras.optimizers import Adam, SGD, RMSprop\n", | |
"\n", | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"from IPython.display import clear_output, Image\n", | |
"\n", | |
"# We'll be downloading and reading in the MNIST data from Tensorflow\n", | |
"from tensorflow.examples.tutorials.mnist import input_data\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import keras.backend.tensorflow_backend as ktf\n", | |
"import tensorflow as tf\n", | |
"import os\n", | |
"\n", | |
"def get_session(gpu_fraction=0.45):\n", | |
" '''Assume that you have 6GB of GPU memory and want to allocate ~2GB'''\n", | |
"\n", | |
" num_threads = os.environ.get('OMP_NUM_THREADS')\n", | |
" gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction)\n", | |
"\n", | |
" if num_threads:\n", | |
" return tf.Session(config=tf.ConfigProto(\n", | |
" gpu_options=gpu_options, intra_op_parallelism_threads=num_threads))\n", | |
" else:\n", | |
" return tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))\n", | |
"\n", | |
"ktf.set_session(get_session())" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## 2(a). Defining the discriminator\n", | |
"\n", | |
"In our two-player game the discriminator takes the role of the police: given an image it has to find out whether the image is fake or not. Given this requirement, the input of our discriminator network is a (28x28x1) input patch, equal to the dimensions of an MNIST image. The output is a single node. The setup of the networks is roughly based on the [DCGAN paper](https://arxiv.org/abs/1511.06434) and one of its [implementations](https://github.com/carpedm20/DCGAN-tensorflow).\n", | |
"\n", | |
"We use `LeakyReLU` in between the convolution layers to improve the gradients. " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def discriminator():\n", | |
" \n", | |
" net = Sequential()\n", | |
" input_shape = (28, 28, 1)\n", | |
" dropout_prob = 0.4\n", | |
" experiment.log_parameter('dis_dropout_prob', dropout_prob)\n", | |
"\n", | |
" net.add(Conv2D(64, 5, strides=2, input_shape=input_shape, padding='same'))\n", | |
" net.add(LeakyReLU())\n", | |
" \n", | |
" net.add(Conv2D(128, 5, strides=2, padding='same'))\n", | |
" net.add(LeakyReLU())\n", | |
" net.add(Dropout(dropout_prob))\n", | |
" \n", | |
" net.add(Conv2D(256, 5, strides=2, padding='same'))\n", | |
" net.add(LeakyReLU())\n", | |
" net.add(Dropout(dropout_prob))\n", | |
" \n", | |
" net.add(Conv2D(512, 5, strides=1, padding='same'))\n", | |
" net.add(LeakyReLU())\n", | |
" net.add(Dropout(dropout_prob))\n", | |
" \n", | |
" net.add(Flatten())\n", | |
" net.add(Dense(1))\n", | |
" net.add(Activation('sigmoid'))\n", | |
" \n", | |
" return net" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The full network structure is as follows:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"_________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
"conv2d_1 (Conv2D) (None, 14, 14, 64) 1664 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_1 (LeakyReLU) (None, 14, 14, 64) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_2 (Conv2D) (None, 7, 7, 128) 204928 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_2 (LeakyReLU) (None, 7, 7, 128) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_1 (Dropout) (None, 7, 7, 128) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_3 (Conv2D) (None, 4, 4, 256) 819456 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_3 (LeakyReLU) (None, 4, 4, 256) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_2 (Dropout) (None, 4, 4, 256) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_4 (Conv2D) (None, 4, 4, 512) 3277312 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_4 (LeakyReLU) (None, 4, 4, 512) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_3 (Dropout) (None, 4, 4, 512) 0 \n", | |
"_________________________________________________________________\n", | |
"flatten_1 (Flatten) (None, 8192) 0 \n", | |
"_________________________________________________________________\n", | |
"dense_1 (Dense) (None, 1) 8193 \n", | |
"_________________________________________________________________\n", | |
"activation_1 (Activation) (None, 1) 0 \n", | |
"=================================================================\n", | |
"Total params: 4,311,553\n", | |
"Trainable params: 4,311,553\n", | |
"Non-trainable params: 0\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
], | |
"source": [ | |
"net_discriminator = discriminator()\n", | |
"net_discriminator.summary()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 2(b). Defining the generator\n", | |
"\n", | |
"The task of the generator, also known as \"the counterfeiter\", is to fool the discriminator by producing real-looking fake images. These images should eventually resemble the data distribution of the MNIST dataset.\n", | |
"\n", | |
"The structure of the generator is comparable to the discrminiator but in reverse. We start with a random vector of noise (length=100) and gradually upsample. To improve the output of the generator we use `UpSampling2D` and normal convolutions instead of transposed convolutions (see also [this article](https://distill.pub/2016/deconv-checkerboard/)). The sizes of the layers are adjusted to match the size of our data (28x28 as opposed to the 64x64 of the DCGAN paper)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def generator():\n", | |
" \n", | |
" net = Sequential()\n", | |
" dropout_prob = 0.4\n", | |
" experiment.log_parameter('adv_dropout_prob', dropout_prob)\n", | |
"\n", | |
" net.add(Dense(7*7*256, input_dim=100))\n", | |
" net.add(BatchNormalization(momentum=0.9))\n", | |
" net.add(LeakyReLU())\n", | |
" net.add(Reshape((7,7,256)))\n", | |
" net.add(Dropout(dropout_prob))\n", | |
" \n", | |
" net.add(UpSampling2D())\n", | |
" net.add(Conv2D(128, 5, padding='same'))\n", | |
" net.add(BatchNormalization(momentum=0.9))\n", | |
" net.add(LeakyReLU())\n", | |
" \n", | |
" net.add(UpSampling2D())\n", | |
" net.add(Conv2D(64, 5, padding='same'))\n", | |
" net.add(BatchNormalization(momentum=0.9))\n", | |
" net.add(LeakyReLU())\n", | |
" \n", | |
" net.add(Conv2D(32, 5, padding='same'))\n", | |
" net.add(BatchNormalization(momentum=0.9))\n", | |
" net.add(LeakyReLU())\n", | |
" \n", | |
" net.add(Conv2D(1, 5, padding='same'))\n", | |
" net.add(Activation('sigmoid'))\n", | |
" \n", | |
" return net" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The full network of the generator looks as follows:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"_________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
"dense_2 (Dense) (None, 12544) 1266944 \n", | |
"_________________________________________________________________\n", | |
"batch_normalization_1 (Batch (None, 12544) 50176 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_5 (LeakyReLU) (None, 12544) 0 \n", | |
"_________________________________________________________________\n", | |
"reshape_1 (Reshape) (None, 7, 7, 256) 0 \n", | |
"_________________________________________________________________\n", | |
"dropout_4 (Dropout) (None, 7, 7, 256) 0 \n", | |
"_________________________________________________________________\n", | |
"up_sampling2d_1 (UpSampling2 (None, 14, 14, 256) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_5 (Conv2D) (None, 14, 14, 128) 819328 \n", | |
"_________________________________________________________________\n", | |
"batch_normalization_2 (Batch (None, 14, 14, 128) 512 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_6 (LeakyReLU) (None, 14, 14, 128) 0 \n", | |
"_________________________________________________________________\n", | |
"up_sampling2d_2 (UpSampling2 (None, 28, 28, 128) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_6 (Conv2D) (None, 28, 28, 64) 204864 \n", | |
"_________________________________________________________________\n", | |
"batch_normalization_3 (Batch (None, 28, 28, 64) 256 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_7 (LeakyReLU) (None, 28, 28, 64) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_7 (Conv2D) (None, 28, 28, 32) 51232 \n", | |
"_________________________________________________________________\n", | |
"batch_normalization_4 (Batch (None, 28, 28, 32) 128 \n", | |
"_________________________________________________________________\n", | |
"leaky_re_lu_8 (LeakyReLU) (None, 28, 28, 32) 0 \n", | |
"_________________________________________________________________\n", | |
"conv2d_8 (Conv2D) (None, 28, 28, 1) 801 \n", | |
"_________________________________________________________________\n", | |
"activation_2 (Activation) (None, 28, 28, 1) 0 \n", | |
"=================================================================\n", | |
"Total params: 2,394,241\n", | |
"Trainable params: 2,368,705\n", | |
"Non-trainable params: 25,536\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
], | |
"source": [ | |
"net_generator = generator()\n", | |
"net_generator.summary()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 3. Creating the models\n", | |
"\n", | |
"We now defined the two separate networks but these still need to be combined in to two trainable models: one to train the discrmininator and one to train the generator. We first start with the most simple one which is the discriminator model.\n", | |
"\n", | |
"For the discriminator model we only have to define the optimizer, all the other parts of the model are already defined. We use `SGD` as the optimizer with a low learning rate and clip the values between -1 and 1. A small decay in the learning rate can help with stabilizing. Besides the loss we also tell Keras to gives us the accuracy as a metric." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"_________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
"sequential_1 (Sequential) (None, 1) 4311553 \n", | |
"=================================================================\n", | |
"Total params: 4,311,553\n", | |
"Trainable params: 4,311,553\n", | |
"Non-trainable params: 0\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
], | |
"source": [ | |
"dis_lr=0.0008\n", | |
"dis_clipvalue=1.0\n", | |
"dis_decay=1e-10\n", | |
"dis_optimizer = RMSprop\n", | |
"\n", | |
"optim_discriminator = RMSprop(lr=dis_lr, clipvalue=dis_clipvalue, decay=dis_decay)\n", | |
"model_discriminator = Sequential()\n", | |
"model_discriminator.add(net_discriminator)\n", | |
"model_discriminator.compile(loss='binary_crossentropy', optimizer=optim_discriminator, metrics=['accuracy'])\n", | |
"\n", | |
"model_discriminator.summary()\n", | |
"\n", | |
"experiment.log_parameter('dis_lr',dis_lr)\n", | |
"experiment.log_parameter('dis_clipvalue',dis_clipvalue)\n", | |
"experiment.log_parameter('dis_decay',dis_decay)\n", | |
"experiment.log_parameter('dis_optimizer', dis_optimizer)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The model for the generator is a bit more complex. The generator needs to fool the discriminator by generating images. To train the generator we need to assess its performance on the output of the discriminator. For this we add both networks to a combined model: *the adversarial model*. Our adverserial model uses random noise as its input and outputs the eventual prediction of the discriminator on the generated images. \n", | |
"\n", | |
"The generator performs well if the adverserial model outputs 'real' on all inputs. In other words, for any input of the adversial network aim to get an output classifying the generated image as real. This means, however, that the discriminator failed (which is a good thing for the generator). If we would use normal back propagation here on the full adversarial model we would update slowly push the discriminator to update itself and start classifying fake images as real. To prevent this we must freeze the part of the model that belongs to the discriminator.\n", | |
"\n", | |
"In Keras freezing a model is easily done by freezing all the layers of the model. By setting the `trainable` parameter to `False` we prevent the layer of updating within this particular model (it is still trainable in the discriminator model).\n", | |
"\n", | |
"The adversarial model uses `Adam` as the optimizer with the default values for the momentum." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"_________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
"sequential_2 (Sequential) (None, 28, 28, 1) 2394241 \n", | |
"_________________________________________________________________\n", | |
"sequential_1 (Sequential) (None, 1) 4311553 \n", | |
"=================================================================\n", | |
"Total params: 6,705,794\n", | |
"Trainable params: 2,368,705\n", | |
"Non-trainable params: 4,337,089\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
], | |
"source": [ | |
"adv_lr=0.0004\n", | |
"adv_clipvalue=1.0\n", | |
"adv_decay=1e-10\n", | |
"adv_optimizer = Adam\n", | |
"\n", | |
"optim_adversarial = Adam(lr=adv_lr, clipvalue=adv_clipvalue, decay=adv_decay)\n", | |
"model_adversarial = Sequential()\n", | |
"model_adversarial.add(net_generator)\n", | |
"\n", | |
"# Disable layers in discriminator\n", | |
"for layer in net_discriminator.layers:\n", | |
" layer.trainable = False\n", | |
"\n", | |
"model_adversarial.add(net_discriminator)\n", | |
"model_adversarial.compile(loss='binary_crossentropy', optimizer=optim_adversarial, metrics=['accuracy'])\n", | |
"model_adversarial.summary()\n", | |
"\n", | |
"experiment.log_parameter('adv_lr',adv_lr)\n", | |
"experiment.log_parameter('adv_clipvalue',adv_clipvalue)\n", | |
"experiment.log_parameter('adv_decay',adv_decay)\n", | |
"experiment.log_parameter('adv_optimizer',adv_optimizer)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Note that the number of non-trainable parameters is very high. This is exactly what we want! \n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Reading MNIST data\n", | |
"\n", | |
"We can now read our training data. For this I use a small utility function from Tensorflow." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Extracting mnist/train-images-idx3-ubyte.gz\n", | |
"Extracting mnist/train-labels-idx1-ubyte.gz\n", | |
"Extracting mnist/t10k-images-idx3-ubyte.gz\n", | |
"Extracting mnist/t10k-labels-idx1-ubyte.gz\n" | |
] | |
} | |
], | |
"source": [ | |
"# Read MNIST data\n", | |
"x_train = input_data.read_data_sets(\"mnist\", one_hot=True).train.images\n", | |
"x_train = x_train.reshape(-1, 28, 28, 1).astype(np.float32)\n", | |
"experiment.log_dataset_info(x_train)\n", | |
"\n", | |
"# Map the images to a new range [-1, 1]\n", | |
"#x_train = x_train / 0.5 - 1" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# 4. Training the GAN\n", | |
"\n", | |
"With our models defined and the data loaded we can start training our GAN. The models are trained one after another, starting with the discriminator. The discriminator is trained on a data set of both fake and real images and tries to classify them correctly. The adversarial model is trained on noise vectors as explained above.\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# make the directory for your generator's outputs\n", | |
"import os\n", | |
"os.makedirs(\"output/mnist-normal\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/anaconda/envs/py35/lib/python3.5/site-packages/keras/engine/training.py:479: UserWarning: Discrepancy between trainable weights and collected trainable weights, did you set `model.trainable` without calling `model.compile` after ?\n", | |
" 'Discrepancy between trainable weights and collected trainable'\n" | |
] | |
} | |
], | |
"source": [ | |
"batch_size = 256\n", | |
"experiment.log_parameter('batch_size', batch_size)\n", | |
"\n", | |
"vis_noise = np.random.uniform(-1.0, 1.0, size=[16, 100])\n", | |
"\n", | |
"loss_adv = []\n", | |
"loss_dis = []\n", | |
"acc_adv = []\n", | |
"acc_dis = []\n", | |
"plot_iteration = []\n", | |
"\n", | |
"for i in range(10001):\n", | |
" \n", | |
" # Select a random set of training images from the mnist dataset\n", | |
" images_train = x_train[np.random.randint(0, x_train.shape[0], size=batch_size), :, :, :]\n", | |
" # Generate a random noise vector\n", | |
" noise = np.random.uniform(-1.0, 1.0, size=[batch_size, 100])\n", | |
" # Use the generator to create fake images from the noise vector\n", | |
" images_fake = net_generator.predict(noise)\n", | |
" \n", | |
" # Create a dataset with fake and real images\n", | |
" x = np.concatenate((images_train, images_fake))\n", | |
" y = np.ones([2*batch_size, 1])\n", | |
" y[batch_size:, :] = 0 \n", | |
"\n", | |
" # Train discriminator for one batch\n", | |
" d_stats = model_discriminator.train_on_batch(x, y)\n", | |
" \n", | |
" # Train the generator\n", | |
" # The input of the adversarial model is a list of noise vectors. The generator is 'good' if the discriminator classifies\n", | |
" # all the generated images as real. Therefore, the desired output is a list of all ones.\n", | |
" y = np.ones([batch_size, 1])\n", | |
" noise = np.random.uniform(-1.0, 1.0, size=[batch_size, 100])\n", | |
" a_stats = model_adversarial.train_on_batch(noise, y)\n", | |
" \n", | |
" if i % 50 == 0:\n", | |
" experiment.log_metrics({\"loss_adv\":a_stats[0], \"loss_dis\":d_stats[0], \"acc_adv\":a_stats[1],\"acc_dis\":d_stats[1]},step=i)\n", | |
" \n", | |
" if i % 500 == 0:\n", | |
" # Visualize the performance of the generator by producing images from the test vector\n", | |
" images = net_generator.predict(vis_noise)\n", | |
" # Map back to original range\n", | |
" #images = (images + 1 ) * 0.5\n", | |
" plt.figure(figsize=(10,10))\n", | |
" \n", | |
" for im in range(images.shape[0]):\n", | |
" plt.subplot(4, 4, im+1)\n", | |
" image = images[im, :, :, :]\n", | |
" image = np.reshape(image, [28, 28])\n", | |
" \n", | |
" plt.imshow(image, cmap='gray')\n", | |
" plt.axis('off')\n", | |
" \n", | |
" plt.tight_layout()\n", | |
" # plt.savefig('/home/ubuntu/cecelia/deeplearning-resources/output/mnist-normal/{}.png'.format(i))\n", | |
" plt.savefig(r'output/mnist-normal/{}.png'.format(i))\n", | |
" experiment.log_image(r'output/mnist-normal/{}.png'.format(i))\n", | |
" plt.close('all')\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"{'api': 'https://www.comet.ml/api/rest/v1/image/get-image?imageId=05fd9cec8aa04872946ca59023a8bda4&experimentKey=cf310adacd724bf280323e2eef92d1cd',\n", | |
" 'web': 'https://www.comet.ml/api/image/download?imageId=05fd9cec8aa04872946ca59023a8bda4&experimentKey=cf310adacd724bf280323e2eef92d1cd'}" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# create a gif from the generator's saved output (in that output/mnist-normal directory)\n", | |
"\n", | |
"import imageio\n", | |
"\n", | |
"filenames = [r'output/mnist-normal/{}.png'.format(i * 500) for i in range(20)]\n", | |
"images = []\n", | |
"for filename in filenames:\n", | |
" images.append(imageio.imread(filename))\n", | |
"imageio.mimsave(r'output/mnist-normal/learning.gif', images, duration=0.5)\n", | |
"\n", | |
"Image(url='output/mnist-normal/learning.gif') \n", | |
"experiment.log_image('output/mnist-normal/learning.gif')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Morphing instances \n", | |
"Tuning the noise vector to see a digit morph into another. The process of tuning slowly convert a noise vector filled with zeros to one filled with ones" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAABrCAYAAACBknIxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAHzhJREFUeJzt3Xu8VnP6//H3nhkhHZVSkUoO5dSJGCWaUY1HJsYQ6ZGRkrM0zIkMFaWSNE1lMDJUGBVGmpIcxiGJZlAimlJJiRxqJnPq98f3d133tey79r33vQ9rt1/Pf1yPa7fvvdyf/Vn32mtdn+tTsGPHDgEAAAAAAKTZtyr6AAAAAAAAAIrCDQwAAAAAAJB63MAAAAAAAACpxw0MAAAAAACQetzAAAAAAAAAqccNDAAAAAAAkHrcwAAAAAAAAKnHDQwAAAAAAJB63MAAAAAAAACp953y/GEFBQU7yvPnVUY7duwoqOhjkBirXDBWlQdjVXkwVpVHGsaKcSpaGsZJYqxywVhVHoxV5cFYVR65jhUVGAAAAAAAIPW4gQEAAAAAAFKPGxgAAAAAACD1uIEBAAAAAABSjxsYAAAAAAAg9biBAQAAAAAAUo8bGAAAAAAAIPW+U9EHUJkVFGS2qv32t78tSdqxI7PF73//+99yPyZkF8fKxLECAAAAAKQbFRgAAAAAACD1qMDIomXLlpKk6dOne65t27Yef+c7//e2xSf4X3zxhSRpyJAhnvvDH/7gMdUYpSdWUzRt2lSSdOutt3ruzDPP9HjvvfeWlHz/ly9fLkk677zzCuUkKjNKUxyr+vXrS5L69OnjuRtvvNHjfffdV5K0detWz40bN06SNHr0aM9t27atbA62ivvWtzL3s+vUqSNJOvHEEz334IMPelyzZk1J0tixYz03bNgwScnx2d3mUvx9Lu//t2wVf5LUsGFDSdKsWbM816pVK49t7sRz5P/+978yO840qMhxAgAAZYsKDAAAAAAAkHrcwAAAAAAAAKlXUJ7llQUFBamq5Yxlpl27dvV4zpw5kqQ999wz59ey9/GZZ57x3Gmnnebxv//971xfp3C3yQqQ5rGKZe1z586VJNWoUWOX3x9/z20sfv7zn3vuzjvvzPpvi3hNxiqLWN7eqVMnj2fOnClJqlu3rufisgUTl/usX79eUnLM161bV+xjYqyy22effTw+4YQTPL777rslZZb9fPPf2nxctWqV5/r16ydJWrRokedKsnSOsUqy99qW9UhSixYtPB46dKgkqUuXLp6rXr26xytWrJCUHN9//OMfpXJsaRirbOMUzytlsVzGXj++z7ZccY899vBcrVq1PLbPqHj+2rx5s8f/+c9/Sv04TRrGSUrPnEozxqryYKwqD8aq8sh1rKjAAAAAAAAAqccNDAAAAAAAkHpVchcSK3G/8sorPRd3OYgloLmyMtUpU6Z4LtdlI9g5K5/u3r275x566CGPsy0diUtA4tIT8/XXX0tKdu2nU33+rKy6ffv2nrv33ns9tl1GYkm3jYUkVatWrdDX16xZI0nauHFjGRxx1WXnuKOOOspzw4cP97hJkyaSpNWrV3suns8OP/xwScnlQlYaz45LpcuWMp500kme69mzp8eNGjWSlNw1q2PHjh7brln236qgrHdZsWVwP/zhDz1Xu3ZtSdKSJUt2+T177bWX57766iuPy3IJSVUTr+H69u0rSZo0aZLn7Lw2b948z8VdejZt2lTGRwhjnyWSdNttt0mSfvCDH3jOrs3eeustz8VzYWkth0N28Rp64MCBHtvSxcaNGxf6nri0tE2bNh6zg1zZimN1//33e3zWWWdJyixzjD7++GOP4+5ltrNmmlGBAQAAAAAAUq/KPJKxpyOSNGPGDEnSqaee6rl8n0698cYbkpJP9VEysXnqDTfcIEm6+uqrPZet6iI+cYtxtnEdM2aMJOnDDz/M/2CruPgE3u7O2515Sdpvv/08tnH561//6jl70i9J+++/f6HX79+/vySqmUpDbGxoDYbjvIpNIt99911J0qBBgzw3bty4Qq8Vqy3Wrl1bykcMSWrZsqWkZBPO+ITr5ZdfliS98sornqtZs6bHxx57rCQqY/IVz3Xnn3++JGnEiBGe6927tyRp2bJlnoufZfak8rjjjvPcZ5995vE777wjiWrAkopVF7GaYvDgwZIy132S9Oijj0pKPlGeP3++x9dee60kaeHChZ4r66qeqqRBgwYex3GxikBr3i1lKvsOPfRQz33wwQced+7cuVCOOVR6vvvd73p8yy23eFyvXj1JySqyL7/8UpLUtGlTz33yySce27kvniMZq9ITVxWcc845Htvn0L/+9S/Pbd++XVJyLsbPo169eknKbGohpW+sqMAA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\n", | |
"text/plain": [ | |
"<Figure size 1080x288 with 10 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.figure(figsize=(15,4))\n", | |
"\n", | |
"for i in range(10):\n", | |
" noise = np.zeros([1,100]) - 1 + (i * 0.2)\n", | |
" images = net_generator.predict(noise)\n", | |
" \n", | |
" image = images[0, :, :, :]\n", | |
" image = np.reshape(image, [28, 28])\n", | |
" \n", | |
" plt.subplot(1, 10, i+1)\n", | |
" plt.imshow(image, cmap='gray')\n", | |
" plt.axis('off')\n", | |
"\n", | |
"plt.tight_layout()\n", | |
"plt.savefig(r'output/mnist-normal/morph_example.png'.format(i))\n", | |
"experiment.log_image(r'output/mnist-normal/morph_example.png'.format(i))\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Checking Final Results " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAABDAAAAGnCAYAAABBz6dKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3WecVGXy9vGLRUBEAcGIBBVEkgEUzKiYA7qYxYB5dc2iq6IiipgTpjXzd8UEJhR2zQFzwoAoKibWhASzoqA8L/ap6mqnZ6ZnpsPp7t/3jfW5Ox375pw+c05V3Y0WLVokAAAAAACAJPtLsTcAAAAAAACgNlzAAAAAAAAAiccFDAAAAAAAkHhcwAAAAAAAAInHBQwAAAAAAJB4XMAAAAAAAACJxwUMAAAAAACQeFzAAAAAAAAAiccFDAAAAAAAkHiLFfLDGjVqtKiQn1eqFi1a1KjY28BcZYe5Kh3MVelgrkpHseeKecpOsedJYq5q0qhRanr++OMP5qpEsF+VDuaqdGQzV2RgAAAAAACAxCtoBgYA1MVf/pK6xrpo0aKMMQAAAIDKQAYGAAAAAABIPDIwACTWH3/8UexNAAAgr8gqBIDskYEBAAAAAAASjwsYAAAAAAAg8SghAQAAAACgjBx55JEen3vuuZKk8847z8fOP//8gm9TLpCBAQAAAAAAEo8LGAAAAAAAIPEaFbLzcaNGjWiznIVFixY1KvY2MFfZqYS5atKkSdp/Jennn3/O50e6Ro1SX29Dj1WVMFflgrkqHcWeK+YpO8WeJ6luc2XH/rZt2/rYMsssI0nq37+/j6244ooef/nll5Kkdu3a+dgKK6zg8frrry9JWnLJJX0s/pa98cYbkqT//Oc/PjZ16lSPP/744yqvycc5dKnNVSVjrkpHJc3Vq6++6vHaa68dP19S+gp/9913n8dTpkyRJP3f//2fj3311Vf52sxqZTNXZGAAAAAAAIDEIwMjgSrpKmGpq4S5euGFFySl7l5J0oABAzx+8sknc/I5iy++uMetWrWSJP32228+9s033zTo/SthrhrK5viEE06oMiZJHTp0qPa148eP9/i///2vx0OHDq3zdjBXpaPYc9XQeVpssf/1Mm/ZsqWPPf300x4vWLBAkvToo49mfP2kSZMkSW+//XbGx7/77jtJ0u+//96QzWywYs+TVLe5at68uSRpv/3287EDDzxQktSjRw8fW2KJJeL7p/33z+yuYzzvzZTl9+uvv1YZk6THH39ckjRixAgfswyNeEezoUptrioZcyU1bdpUUvoxNO5Xdh5XXUatPf7LL7/kdTsraa6uvfZaj1u0aOFx9+7dJaVnocWMNRv/+uuvfeyQQw7xeOLEibnf2AzIwAAAAAAAAGWBCxgAAAAAACDxKCEpsr/85X/XkGL6YbmmOcX0c0tLHzdunI/F7+Duu++WJO25555Zv39MdTcvvvhinbezLsp1rqIHH3xQkrTjjjv6WGwQ1Ldv35x8TkwvtLTuhQsX+hhNPHMn7iuXXnqpxxtssEGV58ZykGz3p913391jK0e57LLLst6+SpgrO/bH9M5M9tprL4+7dOlS5fExY8Z4/MEHH3hcqJKFYs9VQ+fpzDPPTPtvrtlv2UknneRjn376aV4+qybFniepbnNlTaPjeYMdV3bZZRcfW3311eP7S0rtW39mvyHxt6Zx48ZVYkuJr+717777ro9tueWWklINRHOh1OYqHzp27CgpvQnrySef7LE1crVzhT/HP/30kyTplFNO8bHbb79dUnppakNV6lzF79p+47faaisfe/755z3+/vvvJUnHHHOMjy299NIeW1Pcbbfd1sesoW4uVepc1SYeQ0eOHClJGjRokI+9//77Hm+xxRaS8t/YkxISAAAAAABQFsjAKDK7ExDnoVyvEsa7snYlPN4piRkYm2yyiaTa7/jGO8l33nmnx/a9xgyOfGRjlOtcRTfccIOk9EY+sdlSbKLWEPGumN0Bi83UGqoS5iqTeAfzkksukZS+L0aWjREbcsb9xt7L3ifTa//8mvoo17mKdxNHjRolKdWY8M8sgyIeF+NSxpnELIJrrrmmyuO2P/34449ZbnHtij1XDZ0ny5CId/Xjv39bxjM2qFt33XXr/DkxA6k+jW0bqtjzJOVun4p3f21pVSn1WxTnKi6zand658+f72Px3Mt+42Lj0GbNmnmc6Xzt6quvlpR+d5lswazeX1L6+cPf//53j/fdd19JUqdOnXxsqaWW8jhTlk383u1YZ8tCStI+++wjSfrkk08asul//syyn6tM4jnAcccdJyk96+/oo4/2+OGHH5aUeTnP+Nz33nvPx+zfQi7/Rq3UuaqPmB2/6667emxZui+//HJeP58MDAAAAAAAUBa4gAEAAAAAABJvsdqfUn5i6llMRcxlY59sFbKEpxhiicddd93lsf1/f/755z62xx57eJxtCnpMj4+xpac999xzPhabdaFmMb1vnXXWqfJ43G9yZdVVV/V4yJAhktJT4st9X8mXuN9Z+l9szLnRRht5HMczqakEpT7NPitB/K6GDx/ucc+ePas8NzbLOuOMMySl0t4laeONN/b40EMPlSS1adPGx84666yMsbHmg1tvvbWPxWNwJRoxYoSkVCmAJL3yyiseW7lNPG/YdNNNPbbGgvE7zSSXaeuVLjZ3rq2ZXF2aAVpadCwHueiiizw+8sgjJaX/Pq633npZvz9SrPRn8uTJPhbPAaprpFqTOC9W+rPmmmv6mDVBZl+sn3jeF8us7Nj40Ucf+dj111/vsZ27Vfe927+BNdZYo8prUByxKXHcr5KEDAwAAAAAAJB4XMAAAAAAAACJV1ElJNZNPJYqvPDCCx5PmzZNkrRgwYLCblgZstKRuDJITAmzzvpxreiGpp3Hbv2W0hbHkL3FF1/cY1uPPcplSpnN1dixY32sV69ektLT4GOHa9Ts+OOP99jKRqTU8S6uzlNb2UhkKzZUt4oJUmwfqq1s5KabbvL4vPPO8zim45pXX33VY/u9+te//pXx83/66SdJ6asodO/eXZL0yCOP+NhWW23l8RdffJHxvcrZ22+/ndXz4m9JPBb17du3ynNjWc7+++8vSXr22Wfru4kosDjXO+ywg8eZfvesxIiU99rFMqyJEydKkrp27Zrxcfs+4/n4Dz/84LH9bsXS4Pbt23tsK5bEuczVimmVKpbO2d9T0bnnnutxXfaHfv36SUov3bIyPvsdQ2HttttuHif12EYGBgAAAAAASLyyzMCId5xWX311j62ZXefOnX0sNoB66aWXJKWuDEvSp59+6vH06dMlSbNnz/Yx7gpnZndoMzXWlFLZFnvttVfOPjNevbfPyrRWOGoX7xS3bt26yuNxv2io5ZdfXlJ6s1Dbr5J65TepLPPp0ksv9bGYZWaZF3XJuogyNawbP368JGno0KH1es9yEo9x1mQzU9aFlGrYWVvWRfxeY7zCCivUuC32+auttpqPWWNQy8SQpFGjRnl88MEHSyJzLZPYVDCeIyy55JKS0pueDRw40OO6NJFEcTVv3lySdMstt/hYp06dqjwv/i49/PDD+d+wMrHlllt6vPbaa0vKnHUhSXPmzJGU/v2OHDnS488++0yS1Lt3bx+LmWXWcNLmVErPLEXdnX766R7HebPztUmTJmX9XjGz146n8T2tea41zpU4HywEa3TbsmVLH3vwwQc9fuuttwq+TdXhrzsAAAAAAJB4XMAAAAAAAACJl9gSEkslsvRyKdXAJ6bpxoacVhoSG/n89a9/9dga+MQGW0899ZTHM2fOlCRtvPHGPmYNuOLrl156aR9bd911JaUaOeF/jjvuOEmZG2tK0uWXX57zz6SJZ0psbJVtmZOljknSY489lvG9jM2vlNof65LeF99zp512kpS+xril0pMyWDexYaeJJST1KR255JJLPD7hhBOqvA+lIymxzGD06NFVHv/222893n777SVlLhuJ1lhjDY9rKxuJrDwyNlK23664/w4ZMsTjJ598UlL1jUErkZVlnXnmmT5mZSNRTHWmbKR0xBLJyy67TJK0yy67+FimMtSvv/7a41iuh6ri+XpsLt2kSRNJ6U0677jjDo+PPfZYSemNO+N5g+2D8VgVy0Xs3C+Wid9///31/L+obPa7ttJKK2V8/OOPP5aUKvupTjzHu/DCCz3OtI9ZyT7ngIV11FFHSUpvePv66697PH/+/IJvU3XIwAAAAAAAAInHBQwAAAAAAJB4jQqZntOoUaOsP8y6Bce109u1aycplXoWnxfH4yokkaWSxbWM42oKCxcurPL+yy23nMcbbbSRJOnmm2/2MSsdiWUrv/76aw3/Z+ksvS6mVv32229VFxsvsLrMVSaWvhf/fd19990e22oIDRVLROJnZSpryFQK0VCLFi0q+bkyVg4lpadyWmlJ/C5jinQsyTLPPfecx2PHjpUk/fbbbz4W09DsvVZZZRUfe/fddyWlr+DQ0GNVOc1VdWzVHyuH+zMrMbFVgKozbtw4j21FISlVOnLiiSdmfG6ulOpcxRULLK02iqmYcdWdmrRp08bj/v37V3n8oIMO8niLLbbweN68eZKkfv36+Zj9Nv773//2sW7dunlsqy/E96xtvyv2XOVjn4pzY2U1mcpGJOnWW2+VlCqvkqS5c+fmepMarNjzJOX/+Febtm3bSkovDR42bJjHyyyzTI2vt9+wuJ/Fc9RcKae5iuddL7/8sse2CsnUqVN9rE+fPh7buV0sy7NVkqRUCULcL+Oxyn6rBg8e7GPxvCRXymmuqmNldJMnT/ax+HeSrXh144031vg+vXr18thWfZRS5Qqx3NnKVWbNmlXfza6iEuaqoZ555hlJ0oYbbuhjm2++ucfx30A+ZTNXZGAAAAAAAIDES2wTT7tDu9566/mY3T2KGRbbbLONx9YYMjb+tKwKSbr44oslpd+1b9WqlcffffedJKlFixY+tuKKK3q87LLLVvl8i+0us5RqBCVJb7/9tqT0K/tffPFFlf/P2MioHNiV8OoyJHL9OX/+LGsKFBsQIjNr7DdhwgQfs2ynKDbjio0FLY6NmLbaaiuPrXGX7QtS+l2XmL1kaIpbP3bXKTaWi3eGLY7Njy1rQ5LuuusuSenNQGPDTntdbRkclWrEiBFVxmITutgcMFuWSSFlbkIXx+IdSos322wzH7PMqu22287H4r5oDT0PO+wwHyu336ZsdO3a1ePqMi/MfvvtJ0nadtttfew///mPx3ZXcsaMGT4WGwsi9+Jv1e233+6xNYyODepqE7MFbf/NR9ZFuYrnZXaOLaUylffaa6+Mz7U5ir818Q5+nGMT58oyNF599dV6bzv+x34vYtZFPPeurTlqpoarmfbB66+/3uNcZl6gZjHL1hax+OCDD3wsZo4mCRkYAAAAAAAg8biAAQAAAAAAEi+xJSQmNnX5+eefJaWnmcU17K3EI/rss888PuSQQyRJw4cP97HYPNPSp2O6TGzIuckmm0hKL0uxx2Oa6TXXXOOxNSCK6aOWxljOLL0vlhXEtHVLSz/ppJOyfs+Y6m5NhWIaYfwsayx577331mWzK0b8d//4449Lylw2ImVeT3306NEeW8PIWBoVUw2tIWDHjh19LDbJy7QGuDVbi/PLeuDZi8e9yPYbK+v5c2z7WCxBGTp0aD42sSwdcMABHtu/11iCEZtG58NNN92UMf6zuB2ZSkT23Xdfj8eMGZOjrSsdsVHZWWedJUk68MADfSwey0xs+B2bRNo5ykcffeRj8RyBMsfcO/LIIz2ODcMzlR1Ets9W91uz2mqrSZIee+wxH6vEEqu6iN95jx49PLZzwNgEPDZBnjhxoqT0spEo01zF5rnjx4+XVLem+kiJ52Wx5NDEv82sRD7+bRabr06ZMkVSekl+NHv2bEnp5yLIndhqwY6HAwcO9LGlllrKY9ufYhlkUo9xZGAAAAAAAIDE4wIGAAAAAABIvEaFTMvO1fq3MZ3pgQceiO8vSTrqqKN8zNa1l1KrJZxxxhk+Fju02xrVsWt8XG2hZcuWkqTvv//ex6699lpJqbXipfSVTSxN7sMPP/SxmHqVSTmsVXzRRRdJko477jgfiylplmoWSzzi6i0mvj6WkPTr16/a95Ske+65R1J6h+t8KNW5iiVPL7zwgiSpW7duPjZ9+nSP9957b0nSe++952O1pZTFtNHWrVtLSt8vevbs6bGtjBC3yfanLbbYorb/layV6lw1VExRjyuSZGKlI8UuGynVuYq/pxbHVUTialRJEdOubUUiKwuTpJVXXrnG1xd7rgq1T8Xfn1hOEsvhzAorrOBx3759qzwef6seeeQRSdKhhx7qYzGtPleKPU9S4eZq5MiRHp922mnx8yWlr4bxzDPPeHzyySdLSpUrS+kratnKPrE864YbbsjVZrtymqt4jjZnzhyPf/rpJ0npJWrxfK1Lly62HT6W6fgaH4/7lf2W2Zz++fW5Uk5z9af39NhWgrHzbin9u7ZV4xZffHEfi2XKmcqEv/76a4832mgjSeml9vlQrnOVif2uSOl/5zZu3LjG19m8x33Fyrmk1P4U/0bIh2zmigwMAAAAAACQeCWZgXH66ad7vMMOO3hsa3R/+eWXGV9nVwGbNWvmY3Ht9j59+kiSjj32WB+LVxQfffRRSelrFT/33HOSpG+//dbHYpPP+iiHq4TWLDBmUMQmnpmunsd/i5muAmZ6bnWvv/vuuyWlN/DKh3KYK1uPO2ZV5KNpT7wKv/zyy3v87rvvSkplOEnSQw89JEnafvvtc/b55TBX9TFu3DiP43rfxpqdSen7aDGV6lyVSwZGvBPWtWvXGl9f7Lkqxj5Vm9gUzTJGY1ZTpqyMmHUxatQoSakMz1wo9jxJhZurePfXmq9L0scffywpPcMo3knOJDZntdfHfcYaT+byXLqc5ir+7sfjip0DxPPxTHeH4/caM2dsDuI5YGwCaq+L82+ZBLlUTnNVnWOOOUZSenPvOK+ZmuNmOneP55UxM9Sy4hv6t1NtynWu4lxYlu2FF17oY/EcxDKu47l1bHRrf9/279/fx9Zaay2P7e/g3XbbzccsAyeXyMAAAAAAAABlgQsYAAAAAAAg8UqyhCSmnP32228e1+f/JaYHvvHGG5LSG3C99NJLHm+66aaSMqc5ZUodrq9yTXOyxp5SqrSkuiacNp5pLI5X93pLG8xHymBUrnOVb3Ef/uijjySlrxF+5513SpIGDx6cs8+spLmK66nHtM9MKCHJrD5zFRv6WcO/2LQ5/nuO33uhDR8+3OPY1NpSuPfZZx8fsya71Sn2XJXK8a9FixYe77TTTh7fdtttVZ5rqdbrrbeej9n5SX0Ve56k0pmrqEePHh5PmTJFkjR//nwfa9OmjaTaS1HqopzmKpYXXH755R4fdNBBktL3i8i+43//+98+Fo9Ldu4fzyVi+bg1D49lK927d5eU21KFcpqr6tjvwoABA3zMmrtL0uabby5Jeuutt3wsHruWXXZZSdI777zjY/b3lJRe4pBP5TpXsZG0LUbxxRdf+Jj9u5dSDTljadUhhxzisTXVjce96667zuMNN9xQUqp9gpRebpIrlJAAAAAAAICywAUMAAAAAACQeCVZQpJLgwYN8thSej/99FMfW2211TzOZYpgTco1zamhbGUTSbrrrrskSR06dPCx+G+5trWOc4W5qp+Y9vnf//5XUvoKDdax/7LLLsvZZ5brXMV9wDpDxxKSzz77rEocVyOJJSZxpYRiKtW5WmmllTy2f9fR1KlTPY6dvQvFSkfiSl5xxYabb75ZknTooYf6WG3nCMWeq1I8/mVKqz/66KOrPC+WGTV0Ra1iz5NUOnPVtGlTj21FM0nacccdJaWvQmKraVBCUrs111zTYysHiefY559/vsevvvqqpNq/11iCEufFzjG+/vprH2vXrp2k9LK+hirXucriMz2273qrrbbysfvuu6/Kc2Pp3KRJk/K9iVWU01zFVgexdMfOo2N5fSzft3O8999/38diaVAsPTEbbbSRx7YyVs+ePX3MfptyWRZLCQkAAAAAACgLZZ+BEa8SNm/eXFL6HaV4J8qaCvXq1cvH4hXdQimnq4T5Yk0e453keKX+H//4h6Tc3sHPhLmqH9sXpVTjrVatWvmYrVW98cYb+1hD73CV61yNGzfOY9sf7PuT0u/cWlbAzJkzfSxmcGRaz70YSnWu4vdnja9ig6x458+aMsb5sYa2uWB3u4YNG+Zjffr0kZSedfHuu+96vOWWW0pKb4ZXm2LPVSke/6KOHTtKkj755JMqj91zzz0ex9+6+ij2PEkNn6ulllpKkrTBBhv4WNxnPvzwQ0n1b6Ruv0vxmLrddtt5bPt3bII7atSoen1WTcphrgolNiE+++yzqzweMxBXXnllSWRg5FqTJk0kSR988IGPderUyeM5c+ZIklZZZRUf+/HHHwu0dSnlNFddunTx+L333qvyuGXjStLYsWOrPB6zKurSINqat8b3tMUSYmPWhjbKJQMDAAAAAACUBS5gAAAAAACAxFus9qeUtphK+PPPP1d5/JprrvHY1pX+4Ycf8r9haJCXXnpJkrTHHnv4WGxaExt+InnifvnVV19JSqUHS9K0adMKvk2lJDbpjKnlViJywgknVBmLLOVPSi8hsffNd+lVuYr/ri21Oaa7x8ZXtnZ7LPGI81KbVVddVZI0ePDgjI+vuOKKklLpvdFtt93m8cknn+xxXUpHUH+xyXSPHj2qfV5sQFipYqq0lTvFEqh4vrb11ltLSp0fSJnLSeL3HxsXH3HEEZLSj4mRNb6zRnYonuWWW05S+m9hJhMnTvQ4l6UjSDnmmGMkpcrhpPT97qijjpJUnLKRchXLgGMTT2uUG8sP41wceOCBkupWNhJZeV38G8saUMeylKeffrpe718XZGAAAAAAAIDEK/sMjNp8/vnnHp9zzjmSuEpbCuwO8cUXX+xjscljIZvTou5itoXFsQGiLQWVlKaSSWF3m+LSp5kadmbKukBhzZo1S1KqMaYkPfbYYx5bNoY1j/5znCsx28LuiowZM8bH+L3LTszwi83KTFwi15rWVccyBaTMywm++eabktKzcypVzIaImRcmLntvjVBbtmzpY4cffrjHvXv3liR169bNx2LTdvu9iecSzzzzjMd2fC1Gc3ekZ85ccsklkqSll14643MXLFggKb3JZyWwf8P5Pgdu06aNx2eeeWbaZ0vSvHnzPH7wwQfzui2VyCoGJOmCCy7w+Morr6zy3H/+858exwbF9WHnC88++6yPWQbGiSee6GNkYAAAAAAAAIgLGAAAAAAAoARUfAlJRCpt6dlrr708vvPOOz225p4xld6a2tSlUR7yIzbUtcaB1nRQSqVYt2vXzscoi0gvecsk2+8olp3EJqDWcJImnrljpSRSejlJbJ5prHRKkvbdd9+s3v/jjz/2eMKECR5fd911kqQZM2b4GL9x9XfwwQd7bN9t9NRTT3kcm4Pb69q2betj6667bpXXf/fddx6feuqpVcYqVWzIaWnTTZs29bHu3bt7/NFHH0lKT2VffPHFs/6s+fPnS0o/l4hNIr/99tus3wu5Eec6nu/tuuuuVZ4bS3/OPfdcSbWXc5WbQpVPb7PNNh63aNGiyuMHHHCAx5kWUEDuxONVjPNp/PjxHtu/hUGDBvlYPHf/4osv8rINZGAAAAAAAIDE4wIGAAAAAABIPEpIgkJ170V+xPRB6xh/3HHH+Zh1M49piCiO2EHZOlT36dPHx5o3by5JatWqlY9RQpIq/YjfhZV9SA0/dsXSEuReLCc54YQTqjweV7r4+9//ntV7Lly40GNLgUfuxRK3TDbbbLOMcSZxzkaPHi1JuuKKK3yMY11KTD+333MrD5DSV7Rq1qxZldfHsqlffvlFkvTBBx/42KuvvurxiBEjJElfffWVj8XzCjRMLO2x36p4zMt0DhdL7YYOHeqxnSNEb731lsfx30glyeffMXH+bBUYKTVX8TOtNBjl75BDDkn7b6GQgQEAAAAAABKvUSGzDRo1apS41IYmTZp43K9fP0nS888/72PFyMZYtGhRo9qflV9JnKu6sDlcb731fMyuHluDT0m6++67G/Q5zFXDtW7dWlJ6M8KWLVtKkvr27etjU6ZMadDnlNNcWTaRJO22224eW8O5+HgmsQFTzLpISvPOcpqrclfsuSrUPMU7vvE3ZMyYMVWee9ttt3n82WefVXn84osv9nju3Lm52sQaFXuepIbPlWVYxDt9gwcP9tiabMa77zHbYt68eZLSM2CSqBzmqpr3rDK2xBJLeBznxRpDxua43bp189jO3RcsWOBjseGq7Zf5biBZrnNVzed4/Morr3i8zjrrSErPdornIEnJxqikuSp12cwVGRgAAAAAACDxuIABAAAAAAASr+JLSOIa4csvv7wk6dNPPy3W5kgizSkX2rdvL0m64447qjy29957e5wpvbcumKv8sP0yl00JmavSwVyVjmLPFfOUnWLPk8RcZatU5ypTk84olmw3bdpUknThhRf6WCw76NWrlySpY8eOGd9z9uzZktKbWMfmt/bcfP+NU6pz1VDxb6eZM2dKkkaOHOljV155ZaE3qVaVOleliBISAAAAAABQFriAAQAAAAAAEq/iS0g6derksXUZnz59etavz9RVuaHfKWlOpYO5Kh3MVelgrkpHseeKecpOsedJYq6yxVylLLbYYh7HVS6KsUJgJsxV6WCuSgclJAAAAAAAoCwsVvtTyk/jxo097tOnT5X4pptu8rHYFMhkuvL7xx9/5HITAQAAkDC1NatE7ixcuLDYmwAggcjAAAAAAAAAiccFDAAAAAAAkHgFbeIJAAAAAABQH2RgAAAAAACAxOMCBgAAAAAASDwuYAAAAAAAgMTjAgYAAAAAAEg8LmAAAAAAAIDE4wIGAAAAAABIPC5gAAAAAACAxOMCBgAAAAAASDwuYAAAAAAAgMTjAgYAAAAAAEg8LmAAAAAAAIDE4wIGAAAAAABIPC5gAAAAAACAxOMCBgAAAAAASDwuYAAAAAAAgMTjAgYAAAAAAEg8LmAAAAAAAIDE4wIGAAAAAABIPC6Y43xPAAAgAElEQVRgAAAAAACAxOMCBgAAAAAASDwuYAAAAAAAgMTjAgYAAAAAAEg8LmAAAAAAAIDE4wIGAAAAAABIPC5gAAAAAACAxOMCBgAAAAAASDwuYAAAAAAAgMTjAgYAAAAAAEg8LmAAAAAAAIDE4wIGAAAAAABIPC5gAAAAAACAxFuskB/WqFGjRYX8vFK1aNGiRsXeBuYqO8xV6WCuSgdzVTqKPVfMU3aKPU8Sc5Ut5qp0MFelg7kqHdnMFRkYAAAAAAAg8QqagYHqNWpU9AuDAAAAZa268y0b/+OPPwq5OQCAOiIDAwAAAAAAJB4ZGAmxaBFlUShvhx56qMc9e/b0+IADDpAk7bzzzj729NNPF2y7AACVo7rzLc7DgMJo0qSJx61atZIkzZkzp1ibgxJEBgYAAAAAAEg8LmAAAAAAAIDEo4QEQF5tuummkqSLLrrIx5ZcckmP586dK0n68ssvC7thAACg7Bx88MGSpBtuuMHHVl55ZUnSzJkzi7FJFS82z9188809vvzyyyWllxZTzoXakIEBAAAAAAASjwsYAAAAAAAg8SghAZBzlqopSRtssIEkqWnTpj72ww8/ePz+++9Lknr37l1lDMWx1FJLefzaa6953LlzZ0nSrrvu6mP3339/4TYMAAqoZcuWHjdv3lySNGvWrGJtDv5k8cUX9/iYY47x+JRTTpEkTZs2zce+/fbbwm0YnJWOrLjiij52zz33eGznhn/5S+qe+u+//16grUM0evRoSen70h9//FHja2ze4vN22GEHjx966KFcbmLqc/PyrgAAAAAAADlEBgaKarHFUv8Eu3Tp4vEWW2whSZo9e7aP3X333R7XdkUQhde6dWuPx48f73GfPn0kpTdlGjFihMcXXnhh/jcOdXL77bd7vOqqq3psc7jOOuv4GBkYqAR2912SdtxxR4+33nprSdIhhxziY/FYd+edd1Z5/Oeff87bdqJuYmPB1VdfXVL6Xf2nnnrK4yZNmkiSOnTo4GPz5s3L8xaiJocddpjH5513nsczZsyQJO27774+9v3330uS1lxzTR/r16+fxzfeeGPetrOS2R36IUOG+FiLFi08/vzzzyWRdVEsMWPa9pf4N1ZtDVXtufF5p512msdkYAAAAAAAgIrFBQwAAAAAAJB4JV9CEtP/TEz1jCkt9tx27dr52JJLLumxpQLGlMBffvnFY9KbGmaPPfbwuGPHjpKkZZdd1sdOOumkGl//8ssve2zreMdGQE888YTHsfQEyTNw4ECPKSFJDkudXm+99Wp83kcffVSIzaloXbt2lSR98sknPvbbb78VaWtwzjnneHzcccdVeby6ssY999xTktSzZ08fu+SSSzyeMGGCJOm7777LyXaidlYKIkkrrLCCxzavl112mY/Fc0g7PrZp08bHKCEpDis5vvzyy33sxx9/9Pioo46SJL355ptVXrvaaqt53LZt23xtIv6/NdZYQ1Kqseqf7b///oXcHPxJ/Htp8ODBkqT+/fv72AknnOBxPHYWGxkYAAAAAAAg8UoyA6NTp04eP/300x5bo5gllljCx+IdK7uSHpfF+vXXXz22OyALFizwsbjcozUiGTVqlI/Nnz+/nv8XlSE26rHleSRp+eWXz+r11nRJSm+2ZPFuu+3mY5aVIUnrr7++JOmrr76q4xajruyqetwvItsv//73v/vYP//5z/xvGOrs8MMPl5R+hzGTMWPGFGJzKk7ch4YNGyYpvSFuvBNix7aYGVhbsy1kJ96V3X333SVJRx99dIPes1evXh7H/cfuFHNMzD/Lwo3LRFs2qCS9++67kqQvvvjCx+LSm61atZIkde/e3cesWSTyL56733TTTVUev/TSSz1+9NFHq32f5ZZbLrcbhipidrzd1Y8Z7zHj7JlnninchqGKn376yeOHH3447b+SNH36dI87d+4sSTr99NNrfM+YsZgvZGAAAAAAAIDE4wIGAAAAAABIvJIsITn++OM9jul/JlNjTynVZCum3MYSEkubjiUoiy2W+orWWmstSdKLL77oY5MmTarTtleamJoUU2StYWdM8zv//PM9ttKR2JQppp8NGjRIktSsWTMfGz58uMe2dnu3bt0atP2o3RtvvCGp+vR12+8eeOCBgm0TsmfN0CTp7LPPrvG5d9xxR743p+JsscUWHlvZiCQ9+OCDktIbn/Xt29fjAQMGSJKaNm3qYzGt05oL0nw6O8sss4zH48aN83jTTTet8XVTp06VJN1///0+FssKDjrooBrfZ++995ZECUkhxdLi9957z+NZs2ZJSm/Iao07o2+++SaPW4fq7Lfffh5vsskmkqT333/fx2IJSU1eeeUVj2OJEHInlo/vuuuuktL/Nrvxxhs9XrhwYeE2DHUWS3z+8Y9/VPu8eP4SS1DyhQwMAAAAAACQeFzAAAAAAAAAiVeSJSRffvmlxzEV0NL6YkpgTFmyVSpieue0adM8XmeddSRJ7du397GBAwd6bCUMa665po9RQpK9mJ5+ww03SEpfQz2W89TmvPPOk5Ra4UJKdceVpL322kuSNGTIEB+75ZZb6rjFqE5Me7/gggtqfK6VBsW1ppEccb+MaZ/m559/9vjuu+8uyDZVghVXXFFSehld/G3beeedJaWXZn388cce26pYscSkXbt2HluXd0pIsrPuuut6nKncI5YV2Go9knTfffdJSv8ti2z1kepKSJ544om6byzqxfalWNoa47lz50pKLyOOK1/YvmSrlSD/Yhn3oYce6rHNZVydLq5aV5NXX301R1uH6sTS1A4dOkhKLxW58sorC75NqF2PHj0kpa/2ee6553ocV2AyVjpy2WWX5Xnr0pGBAQAAAAAAEq8kMzAuvvhij2+++WaPrRlPdXecMjUZjHfw//3vf0uSNthgAx/beuutPbYr8fHqPOon3mlsiN69e3u82267eWxXequ7K4aGWXXVVT3u2bNnlcdjtstpp51WkG1C9v761796vOeee3qc6Rh5++23ezxhwoT8bliZi783Y8eOlZT+ncemw5nmIo798ssvktKbDK699toeN+QucdzOmHlgqmuUXcosQ1NK3YmXpLZt20pKNeOUpFtvvbXG97rnnns83nHHHWt8rjWOROFU13C6cePGklJNxiWpefPmHlvGbrZ3+tFwu+++u8drrLGGx5bFy1wk01FHHeWxZdFkapiL4ojZtpYNKqWadMaGufF4+cUXX0hKz4YqRMPOTMjAAAAAAAAAiccFDAAAAAAAkHglWUISS0Qa2hgwvtf8+fMlSVtuuaWPWfpoFJvaoXCWW245j0eOHClJOuCAA3ysSZMmHk+cOFGS9OCDDxZm4ypAbEJ30UUXVXk8rqd+9dVXZ/2+rVu3liSttdZaPvb000/XZxORpZ122inr58Ymk2iYmLa54YYbSkqlZErSDz/8kPV72fFujz328LHYkHXBggX13s5YItK0adMqj5djY9B33nnH4+22287jESNGSJLuvffejK+z72qVVVbxMWsILqU3ITR2riFJr732Wv02GDk3YMAASdKpp57qY/HfupXbNWTfQnbsWGkN26X0/eass84q+DahZvEcfd99963y+E033eRxXZr2I/f69+/vcW1/J51zzjke2yIYxSobicjAAAAAAAAAiccFDAAAAAAAkHglWUKSL0sttZQk6bDDDvMx60otpbqxv/jii4XdsApkpTtjxozxsbgiTKa05vfff9/jww8/PI9bV5n69Onjse0rUVytYsqUKVUe79q1q8cPPfSQx3G9aWOrIMQ00euuu87jXK1iU2lsxZhBgwbV+LyYIt3QMj2kxO/VSq6efPJJH4ulG9WtlGDatGkjSerQoYOPffLJJ1m/viZx5ZEYN+Q9S0ks6xg4cGCNz+3evbskaerUqTU+L5aebrXVVh6//PLL9dlE5EjHjh09vvTSSyWln1/E9Om4igLy68QTT5SUfnwbPXq0x5wDJE9ceaRZs2Ye22+drRyDworl30899ZSkzKuLSdLkyZMlSW+99ZaPXXXVVR7PmTMnD1tYP2RgAAAAAACAxCMDI7CrTNZU8M9++uknSWRg5NIyyyzjcbw6u/POO2f1+ltuucXjAw88MHcbBrf22mtLktZcc00fy3Qn1hqcSdIzzzzjsTULio/b3ePq3suuDg8ZMsTHxo4dW+dtR7qjjz5aUuYMmmizzTbz+KWXXsrnJlWU2MTziSeekCQNHz7cx6q7K2JihsZdd91VZezZZ5/NyXZWSqZFLlgzuh9//NHHllxySY+/++47SelZT5xDFFerVq08js1Ze/XqJSk96+ziiy/2uByb1yZJ/F065JBDJKU3143ZMEiO/fbbT5J0yimnZHz8zDPPlJQ6FiL/brzxRo/jb4+dY3z99dc+9p///Mfj448/XlJpzBUZGAAAAAAAIPG4gAEAAAAAABKv4ktI4hrt2267raRUA8E/mzdvniTpl19+yf+GlaGYtnnllVdKknbaaScfa9myZY2vnz59usfjxo2TJI0YMSKHWwgTy6istCc28cyUYm6NVyXpjjvu8NhS3OuTlv7BBx94PGvWrDq/HunHOGuYGssO4vHu2muvlUTZSL4sXLjQ46FDh0qqW5PUHXfc0eMNN9xQknTrrbf6WGwSisL48MMPJUm33Xabj/3tb3/z+IcffpAkzZ07t7AbhirsuBcbtcffNTu36927t4+VQip1uYilw+3atZOUXjZi5+DRiiuu6HHnzp09tuMqjVfzIza6PfjggyVJTZo08bHYtDg240d+rbvuupLSzxXi314zZsyQJB1zzDE+9vDDDxdo63KLDAwAAAAAAJB4XMAAAAAAAACJV/ElJJtssonHmVYfiV2ns10ZA6lUzfj9Xn/99R537dq1ymss1VaSPv30U0nSySef7GOPPvqoxzEVG7kXO+pPmTJFUnqqbaF069bN45ge+sYbbxR8W0pVXJ1nq622kpRezmNrtEup0i7kR9yvsk1Nj79L8RhqKbpnnHFGjrYODWGrmEnSHnvs4XH79u0lpXd6t/1QSi+NRH7Z6kqxLCEeC/v27StJ+vzzzwu6XfifuFKZefrppz2O+811110nSVp22WV9rHHjxh5badcaa6yR8+2ENH78eI+tnDG66KKLPI7n9sgv2x/iCo/RaaedJql0y0YiMjAAAAAAAEDiVXwGxpFHHulxbHZnYuPAt956qyDbVA522WUXSelXaTN5+eWXPd5tt908/uyzz2p83corrywpvQFhbCA0cODArLYzNoBae+21JUnTpk3zsfPOO8/jL7/8Mqv3LAfxe7EGTYVkd11ik9d49xrZi99hJnFfe+edd/K9ORUnHqNi89Rs9evXz+P4G/XYY49Jkn777bcGbB1yJe478XfPGkZaU0IpPZvQ7iqTiZEfbdq08fjmm2+WlN6AMGadcfwrvHj3focddvD43nvvlZTecDVmE1oWZsx2Wn311T0ePHhw7je2wsXfoo033thjO/eeP3++j40aNapwGwZn2eszZ870MWveLqV+m95++20fi9ky//rXv/K9iTlDBgYAAAAAAEg8LmAAAAAAAIDEq8gSkpg+uPnmm9f43OqaPaFmI0aMqPHxn376SZJ06623+tgBBxzgsaV9brrpphlfv9Zaa0lKb9qUq/mJ/yZsTWUpc6OichUbOz7zzDOS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YAAAAAAAgMTjAgYAAAAAAEg8LmAAAAAAAIDEK2gPjCQ6++yzPT799NOrjI0YMaLQmwQAAAAAAP6EDAwAAAAAAJB4XMAAAAAAAACJ12jRosKt6JKU5WNuvfVWj/faay+P//KX/13Pee6553ysf//+hduw/69cl/pp2bKlxzfddJMkqXPnzj7WqVMnj5dYYglJUvz3+fbbb3t88sknS5ImT57sY7///nuOt7h25TpX5Yi5Kh3MVeko9lwxT9kp9jxJzFW2mKvSwVyVDuaqdLCMKgAAAAAAKAtcwAAAAAAAAIlXUauQWNnBPvvs42OZSmgmTZpUsG2qJMcff7zHgwYNkpQq25GkRo1qzhhad911Pb7nnnskSX369PGxTz75JBebCQBF0bx5c48feeQRSVK7du18rGvXrh4Xo2QOAJKkR48eHk+bNs3j559/XpK00UYbFXybKkE8X7/99tslpZfkx7+t7Dz9jTfeKNDWoRKQgQEAAAAAABKv7DMwll56aY+HDh2a1WumTJmSr82pOPEq7Yknnuhx48aNG/ReSy65pCRp+eWX9zEyMIDcOOWUUzy+9957PV5mmWUkSX/88YePff3111Ve//PPP3v81Vdf5WMTy1KTJk08tgbHK664oo/NnDnTY7vz+N133xVo61CTOHfNmjXz2LJm9t13Xx979913PR47dqwk6Zdffsn3JiKDXr16eWxZT7/99puPrbzyyoXeJNRT/F1affXVJUnjx4/3sSFDhkhK/30qV9VlNOdq4YZ4vBswYECNn//ggw9Kkjp06JCTzwYkMjAAAAAAAEAJ4AIGAAAAAABIvLIvIbnppps8tvTnKKY5TZ8+XZL09ttv53/DKkRMV/vpp588thKQH3/80cdiCcisWbMkpadMW+NPSWrRooUkaauttvKxl156KUdbjYaKabcjR46UlN6AMDZfXbBggSTptNNO87ErrrhCEo0Ki2Xw4MEejxo1qs6vt/1XkoYPHy5JuvHGGxu+YWUuHiPtO4wlJLGh54QJEyRJm2++uY/lKj0YKa1atZIknXXWWT625pprety+fXtJ0korreRjiy++uMexUbWJ82T7h6W8S5WR4p4Uhx12mMcrrLCCJOnTTz8t1uYgR6x8/IknnvCxStqvYolHLInKlXgM+/XXX2t8bps2bSSlHwtjuQ/yK37vVsp45pln+tgqq6zi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st566y2PZ8yYUeP72r586aWX+lg8hzSx9Nj+Bij0eTsZGAAAAAAAIPFKMgNj2WWX9TjTusOPP/54ITcH9WB3fc8991wfi3fg49VFE6/42119+68k7bnnnh7vtNNOkqTRo0f7WF2u3iOltiyWL7/8UlJ6ZlScP2uI1r9//4yvv/feeyVJb7/9doO2s5JY41MpvYGSZaRlyrqQpD322ENS7VkXdWFNCqPbbrvN41mzZuXssyqJNTl7/fXXfaxfv34e2/523333+ViPHj08JoupeK644gqPY4aMueOOOzyeN29eQbapkqy00koeX3LJJVUej781cS622WabKs+NdzKR8uuvv3r84osv5u1zDjzwQI+rO4cwZ511lseffvpp3rYJmcVz9MjOB2Pmp2VRo37i+fbyyy9f5fHff//dYzvvk1LHs3iOuPbaa3ts2RQrrLCCj2X6eyxmxL/00kuSpAEDBvhYIRrxk4EBAAAAAAASjwsYAAAAAAAg8UqyhGSjjTbyOFNqy8UXX5z1e8UmoFdddZWk9IZEsSmNpfRec801PmapM6ifM844w+MxY8Z4PGnSJEmp9cWl9JSpGGfSvHlzSdIpp5ziY1ZW0qtXLx8jzbp2U6ZMkST99ttvPhabCQ4dOlSStNRSS2V8/eGHHy4pPb0wppcdeuihkkjVrYvYBPVvf/tblcetqZZUt4ad2YrrucfSLRPLHuIa4sieHZti48F1113XY9uf2rdv72OxpC6meCP/Vl55ZY8PO+wwj+0cJc7H8OHDC7ZdlWjDDTf0OB7/rIlgTKmOjTtt3uJvXV3OJ5E7diw78sgjfSxTicJnn33m8V133eUx53aF98orr3icqdwnlr6iYdq1a+dx/N03sTTu22+/9dj+poqlx3379vXYmrLXhb0+nl9+8sknHluJynfffVfn964JGRgAAAAAACDxuIABAAAAAAASryRLSFZZZRWPY5rY008/LUmaPXt21u+16667emxp2fE9Y7mKpSXGlERbK/fMM8/M+jORmZXoSFL37t2rPB7LRg466CBJ0hFHHOFja6yxhseLLVb1n7a9Z1wz2cojUD1LBTv66KN9LK480aFDB0nSUUcd5WOxA3iLFi0kpZeIxBTr77//PrcbXMa23XZbSdIDDzzgY7GM7vPPP5eU3lU6lyuOWOdq2w4pVToU064prWs4K4OLXfjjXC9YsEBSelp1PG6+8cYb+d7EihVL6Kzz+p133uljmVJ644pbMe0duWOr9Fx77bUZH3/qqackSW3btvWxk046yeN4boDisvO92uYk/ha+9957ed0mZGZzFf82yiTTcRH1s9Zaa9X4eFwlxI57Ump/iquQ1MfChQtrfLxNmzYe77vvvpKkq6++ukGf+WdkYAAAAAAAgMQryQyM6tgdwLo0A4x3/TOJDejsitUSSyzhY3YnOjbNu+CCC7L+fGQvrmt8ww03SJJuvvlmH7vuuus8Pvjgg6u83u5e9unTx8fIwKidXWm98cYbfWzcuHEeb7/99pKkbbbZxsdiZpN977Ehbmy2hZrFK9l2BTtmI8WMsXPOOUeSNHfu3Lxsi2V2WOaZlDrePvLIIz72/PPP5+XzK0mPHj0kSS1btvSx+Ntm+5M9T0o11JWk/fffXxLN7BqqS5cuktIbQu+2224e2/xkaigupbLRYtM05M7GG2/s8cSJEyWl7zPRDjvsICn1myVVP2/mlltu8XirrbaSlN6gDvkxbNiwGh+3hqzxvA/FYftFx44da3xebDyJholZzJnELNzaxHOETOcL8+fP99jO3WPmmr0mNmm1DFEpt1nAERkYAAAAAAAg8biAAQAAAAAAEq8kS0gsTVCSjj32WI/XWWcdSdI//vEPH7vwwgtrfK8nnnjC45h+a6xUQUqlRV9zzTU+tvTSS0uSTjzxRB+7/vrrPf7mm29q/Hw0TGxgl20Drrfffjtfm1PWYmpZXM/ZUspiU6AhQ4ZUeV0s66lLmVeli/+uV1555SqP33777R7feuutOf98ayYpSWeccUaVx63EiNK53LL9Ke53sfmjlc/F37u43rulxlNCUndbbrmlxxMmTJCUfnyLZQeZmpnF9FkrvVtuueV8LM6JlZ9yTMze+uuv7/H999/vcXWlI38W52/GjBkeW7mQlSdI0iuvvOJx3759JVFCki9du3b1eKeddqryeJyXwYMHS+J8rljiufdZZ50lKb20NbLjXW0l+8je5MmTPbbSOClzSVz8bbF4zpw5Phb/TrWm/HEhhFhGZ6UjcV8sFjIwAAAAAABA4nEBAwAAAAAAJF5JlpBMnz7d45EjR3psa3+ff/75PtaiRQuPzzzzzCrv9dBDD3k8depUSenr58YO19aJNa4KYJZZZhmPWes4szgXNlexa3FMy3zrrbckpc/Pr7/+6vG//vUvSamyIan2791SfV9//fW6bjpqYGVUZ599dsbHLdXs448/Ltg2lQNLxzzuuOOqPBbT9+655x6P42pIDdG2bVuP77zzTo8HDBggKT3l8MADD5QkPfvsszn57EoW0z8tTT6WG8yePdtj60Iey4pI0a2/mDIbf3eqS4s2TZo0qXFs+PDhkqSTTz7Zx2JKr+3LVqoiSZdffrmk1AomUmqVtT+/vhJttNFGGcetnCSWlcTvNZNVVlnFY1uVLKZXW6kC8i/OVSwnMbF0NZaSo/DiMS6uPpGJ/a4tv/zyed2mSnLRRRd5HI9X9nduLPG54447PLZzt/j31J577umxvS6u0BjLVJNQOmLIwAAAAAAAAInXqJANvho1apTXD7NmTPGKerxT8fLLL0tKNeOUpNatW3u8//77S0q/ExPviNX0XcXsjnPPPTfj52dr0aJFNS9MXgD5mKtHHnnEY1s3ui7i91/b2u2ZXmNXGcePH1/nz67h/ctyrmoTr+5uv/32ktLvesW7ltZkK65L/fvvv+d7E6sotbladdVVJUkffPBBlcdOP/10j88777wGbVNsTjhw4EBJ0nXXXedjrVq18vjHH3+UJG244YY+Nm3atAZ9fialNlc5/EyP99prL0nSsGHDfCxmH1o2TPy96tatm8dffvll3rYzKvZc5Wqe4h3FuG59bXcXa5PtOVamJsnxt+rUU0/1+Pvvv5eUfhyt7XOKPU9SfvapmMU5c+bMOr++R48eHttvVcx8ieeThVKuc5XJoEGDPLaG4FLmzKcvvvjCY2s2WGyVNFfx9yk2ardGxbU18bS/sSTptttu89jOJ+PfS/n427RS5yrTdxmrBh5//HGPO3XqJEnacccdfawY2bXZzBUZGAAAAAAAIPG4gAEAAAAAABKvJJt4Vqd3796SpNdee83HOnfu7LE1Rdtggw18rC5pSra2++eff+5j1kjFmlKierExYH1kWzYSWWqblNvSkUoXywouuOD/tXfncVfP6R/H37eloVJCK0kiTJI1+1iaSlka62QtMlM0JRJmTMi+NJIHCVmyhIdMSUNIkoairDOT0EIypCKhbN2/P+b3uc71dU73fe5zn+V7znk9/+l6fO6zfDuf+5zzvT/f67o+N0iKlpX4VMBQOlTujedqyjdW+iWfalsdXybXrVs3SdFyni5duljs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RaGPgblKD3NVPJir4sFcFY9CzxXzlJ5Cz5PEXKWLuSoezFXxYK6KRzpzRQYGAAAAAACIvbxmYAAAAABxUFGRuNC3wQb/u6b3888/F+pwAABpIAMDAAAAAADEHhkYAACgbOy6664WT5s2TZK0cOFCG9tvv/3yfkwojMrKREn6unXrJEkbbrihjZGNAQDxQwYGAAAAAACIPRYwAAAAAABA7FFCgljq2bOnJOmRRx6xse7du1v8zDPP5P2YAADFK5SOnH/++Ta21VZbSZIWLFhQkGNCfIRyEspGgJo76aSTLO7cubPF4X3VqVMnG9t+++0tvvPOOyVJV155pY19+umnOTtOlAYyMAAAAAAAQOyxgAEAAAAAAGKvwndgzvmTVVTk78ky0LZtW0nSlClTbGzy5MkWDxw4MC/HUVlZWVH9rXKr0HMVOsMfeuihNvb1119bvOOOO0qSvvjii7we1y8xV8WjXOfqyCOPtHiTTTZJ+rnfkaFjx46SouVa/jti8ODBkqQRI0Zk/Ti9cp2rYlTouarJPB1//PGSpF69etnYvHnzJEl33HGHjS1evDhLRyftueeekqRtt93Wxq699tqk23Xt2tXiJUuWZO35g0LPkxTP99Smm26aNPbDDz9YXIhyEuaqeDBXCXPmzLF4jz32qPH9x40bZ3Hv3r0lZff9x1wVj3TmigwMAAAAAAAQezTxdDp06CApeqWkb9++Fvfo0UOS1KpVq/weWBl6+umnJUUzMBo0aGDxlltuKanwGRhAHB100EEWT5o0yeKKivQuQPisi5deeslimueimD3xxBORf7MhNAHdYYcdbOwPf/iDxUcddZQkqXHjxlU+zsYbb5y1Y0JCt27dLD7xxBMlRedqv/32s3jixImSpHPOOcfGVqxYketDRArNmjWTFD3fnj17dqEOB2mYPn26xT4DI2RRzJgxI+X9wt9ep5xyio3dc889SY+J7FnfuWDISPPfV6tXr7Z4/PjxkqIZi88991zS7datW5e9g10PMjAAAAAAAEDssYABAAAAAABijyaeTkgvfOSRR6q83UYb5bbyhkYzibTc+fPn21ijRo0sfuihhyRJZ555po3RbKt64f3uU71CmdR3331nY08++WS2Di82im2uauOxxx6zOHyuSdKLL74oKZEGKEXnPTQwXrVqlY35hnb5SAuUymuuil2h56rQ8zRg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\n", | |
"text/plain": [ | |
"<Figure size 1080x432 with 40 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "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L2qSdRHlalg3cuRISdLgwYNr9Z4NSfyNsyabubIupEzDzuqyLuL3GuOll166ym2xz1911VV9zBqDWiaGJJ177rkeH3LIIZLIXMslNhWM5wiLL764pGTTs/79+3tckyaSKK/mzZtLkm6//XYfW3755bOeF49Ljz76aPE3rIHYcsstPV5rrbUk5c66kKTp06dLSn6/w4cP9/jzzz+XJK299to+FjPLrOGkzamUzCxFzZ1++ukex3mz87Vx48bl/V4xs9d+T+N7WvNca5wrcT5YCtbotlWrVj42ZswYj99+++2Sb1Nl+OsOAAAAAACkHhcwAAAAAABA6qW2hMRSiSy9XMo08IlpurEhp5WGxEY+f/vb3zy2Bj6xwdYzzzzj8WeffSZJ2njjjX3MGnDF1y+xxBI+tu6660rKNHLCnwYNGiQpd2NNSbriiisK/pk08cyIja3yLXOy1DFJeuKJJ3K+l7H5lTL7Y03S++J77rTTTpKSa4xbKj0pgzUTG3aaWEJSm9KRSy+91OMTTjgh630oHcmIZQZXXnll1uPff/+9x9tvv72k3GUj0RprrOFxdWUjkZVHxkbKduyK+++BBx7o8dNPPy2p8sagjZGVZZ155pk+ZmUjUUx1pmyk/oglkpdffrkkadddd/WxXGWo33zzjcexXA/Z4vl6bC7dtGlTSckmnffcc4/Hxx13nKRk48543mD7YPytiuUidu4Xy8QfeuihWv5fNG52XFt22WVzPv7JJ59IypT9VCae41100UUe59rHrGSfc8DSOvrooyUlG96+8cYbHs+aNavk21QZMjAAAAAAAEDqcQEDAAAAAACkXkVJ03MqKuZLUvZK2tmsW3BcO71jx46SMqln8XlxPK5CElkqWVzLOK6mMHfu3Kz3X2qppTzeaKONJEm33nqrj1npSCxbmT17dhX/Z0mWXjfvr3lo1rSpfv/993y+oqKq+GuuasvS9+K/r/vvv99jWw2hrmKJSPysXGUNuUoh6mr+/Plln6ua7FdVsXIoKZnKaaUl8buMKdKxJMu88MILHt95552SpN9//93HYhqavdeKK67oY++9956k5AoONf2tsmfb95KGuarrflUdW/XHyuEWZCUmtgpQZUaMGOGxrSgkZUpHTjzxxJzPLZT6OldxxQJLq41iKmZcdacqbdu29bhv375Zjx988MEeb7HFFh7PnDlTktSnTx8fs2Pjv//9bx9bffXVPbbVF+J7VrfflXuuirFPxbmxsppcZSOSdMcdd0jKlFdJ0owZMwq9SXVW7nmS/pyrBX+XS6ldu3aSkqXBQ4YM8bh9+/ZVvt6OYXE/i+eodRG/l4Y0V/G869VXX/XYViGZOHGij/Xq1ctjO7eLZXm2SpKUKUGI+2X8rbJj1YABA3wsnpfURdrmqlDngJWxMrrnnnvOx+LfSbbi1c0331zl+/To0cNjW/VRypQrxHJnK1eZNm1abTdbUvrmqtjngHU1fvx4SdKGG27oY5tvvrnH8d9AMeUzV2RgAAAAAACA1EttE0+7Q7veeuv5mN09ihkW22yzjcfWGDI2/rSsCkm65JJLJCXv2rdu3drjH374QZLUokULH1tmmWU8XnLJJbM+32K7yyxlGkFJ0jvvvCMpeWX/yy+/zPr/NLGhUX1mV8Iry5Ao9Ocs+FnWFCg2IERu1thv9OjRPmbZTlFsxhUbC1ocGzFttdVWHlvjLtsXpORdl5i9ZGiKWzt21yk2lot3hi2OzY8ta0OS7rvvPknJZqCxYae9rroMjsZq2LBhWWOxCV1sDpgvy6SQcjehi2PxDqXFm222mY9ZZtV2223nY3FftIaehx9+uI81lGNSTXTp0sXjyjIvzP777y9J2nbbbX3sP//5j8d2V3LKlCk+FhsLovDiseruu+/22BpGxwZ11YnnaLb/FirrojGI52V2ji1lMpX33nvvnM+1OYrHmngHP86xiXNlGRqvv/56rbcdf7LjRcy6iOfe1TVHzdVwNdc+eOONN3pc18wL5C9m2doiFh9++KGPxczRNCEDAwAAAAAApB4XMAAAAAAAQOqltoTExKYuv/76q6Rkmllcw95KPKLPP//c40MPPVSSNHToUB+L6xJb+nRMl4kNOTfZZBNJybIUezymmV533XUeWwOimD5qaYwNmaX3xbKCmLZuaeknnXRS3u8ZU92tqVBMI4yfZY0lH3jggZpsdqMR/90/+eSTknKXjUi511O/8sorPbaGkbE0KqYaWkPAzp07+1hskpdrDXBrthbnl/XA8xd/9yLbb6ysZ8HY9rFYgjJ48OBibGKDdNBBB3ls/15jCUZsGl0Mt9xyS854QXE7cpWI7Lfffh7fdtttBdq6+iM2KjvrrLMkSQMHDvSx+FtmYsPv2CTSzlE+/vhjH4vnCJQ5Ft5RRx3lcWwYnqvsILJ9trJjzaqrripJeuKJJ3ysMZZY1UT8zrt16+axnQPGJuCxCfLYsWMlJctGolxzFZvnjhw5UlLNmuojI56XxZJDE/82sxL5+LdZbL46YcIEScmS/Ojbb7+VlDwXQeHEVgv2e9i/f38fa9mypce2P8UyyLT+xpGBAQAAAAAAUo8LGAAAAAAAIPUqSpqWXaC1imM608MPPxze/s93Pvroo33M1rWXMqslnHHGGT4WO7TbGtWxa3xcbaFVq1aSpB9//NHHrr/+ekmZteKl5Momlib30Ucf+VhMvTINba3iiy++WJI0aNAgH4spaZZqFks84uotJr4+lpD06dOn0veUpFGjRklKdrguhjTMVW32q1jy9NJLL0mSVl99dR+bPHmyx/vss48k6f333/ex6lLKYtpomzZtJCX3i+7du3tsKyPEbbL9aYsttqjuf6VSC65hn4a5Ksca4DFFPa5IkouVjpS7bKS+zlU8nlocVxGJq1GlRUy7thWJrCxMklZYYYUqX1/uuSrVPhWPP7GcJJbDmaWXXtrj3r17Zz0ej1WPPfaYJOmwww7zsZhWXyjlnifpz7la8He5GIYPH+7xaaedFj9fUnI1jPHjx3t8yimnSMqUK0vJFbVsZZ9YnnXTTTcVZJvTeA5YiLmK52jTp0/3+JdffpGULFGL52urrLKKbYeP5fp9jY/H/cqOZTanC76+LtI2V4X62yr5lpl3s5Vg7LxbSn7Xtmrcoosu6mOxTDlXmfA333zj8UYbbSQpWWpfKGmbq1Idr+y4IiX/zm3SpEmVr7N5j/uKlXNJmf0p/o1QDPnMFRkYAAAAAAAg9eplBsbpp5/u8Q477OCxrdH91Vdf5XydXQVcZJFFfCyu3d6rVy9J0nHHHedj8Yri448/Lim5VvELL7wgSfr+++99LDb5zFdDu0pozQJjBkVs4pnr6nn8t5jrKmCu51b2+vvvv19SsoFXMaRhruq6X9l63DGrohhNe+JV+A4dOnj83nvvScpkOEnSI488Iknafvvta/15ZGD8acSIER7H9b6NNTuTkvtoOdXXuWooGRjxTliXLl2qfH2556oc+1R1YlM0yxiNWU25sjJi1sW5554rKZPhWQjlniepdBkY8e6vNV+XpE8++URSMsMo3knOJTZntdfHfcYaT9b1XDqN54CFzsCIvyt2DhDPx3PdHY7fa8ycsTmI54CxCai9Ls6/ZRLUVdrmqhgZGNGxxx4rKdncO85rrua4uc7d43llzAy1rPja/O1UnbTNVTGOV3EuLMv2oosu8rF4DmIZ1/HcOja6tb9v+/bt62M9e/b02P4O3n333X3MMnAKiQwMAAAAAADQIHABAwAAAAAApF69LCGJKWe///67x7X5f4npgW+++aakZAOuV155xeNNN91UUu40p1ypwzXRGNKcrLGnlCktqawJp43nGovjlb3e0gYLlTJYmTTMVbHTB4sh7sMff/yxpOQa4ffee68kacCAAbX+jMZcQhLXU49pn7lQQpJbbeYqNvSzhn+xaXP89xy/91IbOnSox7GptaVw77vvvj5mTXYrU+65SmMJSS4tWrTweKeddvL4rrvuynqupVqvt956PmbnJ7VV7nmSSldCUkjdunXzeMKECZKkWbNm+Vjbtm0lVV+KUp00ngMWYq5iecEVV1zh8cEHHywpuV9E9h3/+9//9rH4u2Tn/vFcIpaPW/PwWLbStWtXSXUvVUjbXBX7HNCOC/369fMxa+4uSZtvvrkk6e233/ax+Nu15JJLSpLeffddH7O/p6RkiUOhpW2uinG8io2kbTGKL7/80sfs372UacgZS6sOPfRQj62pbvzdu+GGGzzecMMNJWXaJ0jJcpNCoYQEAAAAAAA0CFzAAAAAAAAAqVcvS0gKaZdddvHYUnqnTp3qY6uuuqrHdU0RrEpjSHOqK1vZRJLuu+8+SVKnTp18LP5brm6t40JJw1ylcb+qTkz7/N///icpuUKDdey//PLLa/0ZjaWEJO4D1hk6lpB8/vnnWXFcjSSWmMSVEsqpvs7Vsssu67H9u44mTpzocezsXSpWOhJX8oorNtx6662SpMMOO8zHqjtHKPdcpfFYVZ1cafXHHHNM1vNimVFdV9Qq9zxJ9aeEpFmzZh7bimaStOOOO0pKrkJiq2lQQlK9Nddc02MrB4nn2BdccIHHr7/+uqTqv9dYghLnxc4xvvnmGx/r2LGjpGRZX22kba7KcQ4Yf8Psu95qq6187MEHH8x6biydGzduXLE3UVL65qpQx6vY6iCW7th5dCyvj+X7do73wQcf+FgsDYqlJ2ajjTby2FbG6t69u4/ZsamQZbGUkAAAAAAAgAahwWdgxKuEzZs3l5S8oxTvRFlToR49evhYvKJbTA31KmGxWJPHeCc5Xqk/+eSTJdXtDn4+0jBX9TEDw/ZFKdN4q3Xr1j5ma1VvvPHGPlbTO1yNJQNjxIgRHtv+YN+flLxza1kBn332mY/FDI5c67mXQ32dq/j9WeOr2CAr3vmzpoxxfqyhbSHY3a4hQ4b4WK9evSQlsy7ee+89j7fccktJyWZ41Sn3XKX9WFWdzp07S5I+/fTTrMdGjRrlcTzW1Ua550mq+139li1bSpI22GADH4v7zEcffSSpdo3UpcxxKf6mbrfddh7b/h2b4J577rm1+qwFpfEcsD5ky8QmxGeffXbW4zEDcYUVVpBEBkahNW3aVJL04Ycf+tjyyy/v8fTp0yVJK664oo/9/PPPJdm2tM1VoY5Xq6yyisfvv/9+1uOWjStJd955Z9bjMauiJg2irXlrfE9bLCE2Zq1zo1wyMAAAAAAAQEPABQwAAAAAAJB6C1f/lPotphL++uuvWY9fd911Htu60j/99FPxNwx18sorr0iS9txzTx+LTWtiw0+kT9wvv/76a0mZ9GBJmjRpUsm3qT6JTTpjarmViJxwwglZY5Gl/EnJEhJ732KXXjVU8d+1pTbHdPfY+MrWbo8lHnFeqrPSSitJkgYMGJDz8WWWWUZSJr03uuuuuzw+5ZRTPK5J6QhqLzaZ7tatW6XPiw0IG6uYKm3lTrEEKp6vbb311pIy5wdS7nKS+P3HxsVHHnmkpORvYmSN76yRHcpnqaWWkpQ8FuYyduxYj+taOoLcjj32WEmZcjgpud8dffTRkkpXNtIYxDLg2MTTGuXG8sM4FwMHDpRUs7KRyMrr4t9Y1oA6lqU8++yztXr/miADAwAAAAAApF6Dz8CozhdffOHxOeecI4mrtPWB3SG+5JJLfCw2eSxpc1rUWMy2sDg2QLSloNLSVDIt7G5TXPo0V8POXFkXKK1p06ZJyjTGlKQnnnjCY8vGsObRC8aFErMt7K7Ibbfd5mMc7/ITM/xiszITl8i1pnWVsUwBKfdygm+99ZakZHZOYxWzIWLmhYnL3lsj1FatWvnYEUcc4fHaa68tSVp99dV9LDZtt+NNPJcYP368x/b7Wqrm7kiKmTOXXnqpJGmJJZbI+dw5c+ZISjb5bAzs33Cxz4Hbtm3r8Zlnnpn4bEmaOXOmx2PGjCnqtjRGVjEgSRdeeKHHV199ddZz//nPf3ocGxTXhp0vPP/88z5mGRgnnniij5GBAQAAAAAAIC5gAAAAAACAeqDRl5BEpNLWP3vvvbfH9957r8fW3DOm0ltTm5o0ykNxxIa61jjQmg5KmRTrjh07+hhlEcmSt1zy/Y5i2UlsAmoNJ2niWThWSiIly0li80xjpVOStN9+++X1/p988onHo0eP9viGG26QJE2ZMsXHOMbV3iGHHOKxfbfRM88843FsDm6va9eunY+tu+66Wa//4YcfPP7HP/6RNdZYxYacljbdrFkzH+vatavHH3/8saRkKvuiiy6a92fNmjVLUvJcIjaJ/P777/N+LxRGnOt4vrfbbrtlPTeW/px33nmSqi/namhKVT69zTbbeNyiRYusxw866CCPcy2ggMKJv1cxLqaRI0d6bP8WdtllFx+L5+5ffvllUbaBDAwAAAAAAJB6XMAAAAAAAACpRwlJUKruvSiOmD5oHeMHDRrkY9bNPKYhojxiB2XrUN2rVy8fa968uSSpdevWPkYJSab0I34XVvYh1f23K5aWoPBiOckJJ5yQ9Xhc6eLvf/97Xu85d+5cjy0FHoUXS9xy2WyzzXLGucQ5u/LKKyVJV111lY/xW5cR08/teG7lAVJyRatFFlkk6/WxbOq3336TJH344Yc+9vrrr3s8bNgwSdLXX3/tY/G8AnUTS3vsWBV/83Kdw8VSu8GDB3ts5wjR22+/7XH8N9KYFPPvmDh/tgqMlJmr+JlWGoyG79BDD038t1TIwAAAAAAAAKlXUdJsg4qK+ZJUUd3zSqhp06Ye9+nTR5L04osv+lipvh/7lIo/P7PsX1HFX3NVX9kcrrfeej5mV4+twack3X///XX6nDTMVRr3q5po06aNpGQzwlatWkmSevfu7WMTJkyo0fvGfUpKx1wVar+ybCJJ2n333T22hnPx8VxiA6aYdZGW5p0Naa4aunLPVanmKd7xjceQ2267Leu5d911l8eff/551uOXXHKJxzNmzCjUJlap3PMk/TlXC/4u14RlWMQ7fQMGDPDYmmzGu+8x22LmzJmSkhkwaZHGc8C6zFUl75k1tthii3kc58UaQ8bmuKuvvrrHdu4+Z84cH4sNV22/LEYDybTNVanOAeP8vfbaax6vs846kpLZTvEcpJzZGGmbK84r8pPPXJGBAQAAAAAAUo8LGAAAAAAAIPUafQlJXCO8Q4cOkqSpU6eWfDtIcyqs5ZZbTpJ0zz33ZD22zz77eJwrvbcm0jBXadyv6sr2y7o0JWzIJSQNHXNVf5R7rpin/JR7nqTilCU0FGk8B6zpXOVq0hnFku1mzZpJki666CIfi2UHPXr0kCR17tw553t+++23kpJNrGPzW3tuMf7GSdtcleMcMP7t9Nlnn0mShg8f7mNXX311CbemcmmbK45X+aGEBAAAAAAANAhcwAAAAAAAAKnX6EtIll9+eY+ty/jkyZPzfn2ursq1+U5Jc6qf0jBXadyv0oASkvqLuao/yj1XzFN+yj1PEiUkVUnjOWAa5mrhhRf2OK5yUdK/XRaQtrkNwVkEAAAgAElEQVTiHLByaZsrjlf5oYQEAAAAAAA0CAtX/5SGp0mTJh736tUrK77lllt8LDYFMrmu/M6bN6+QmwgAAICUqa5ZJQpn7ty55d4EAClUlhISVI40p/olDXPFflU1SkjqH+aq/ij3XDFP+Sn3PEnJsgTklqZzQOaqammZK84Bq5eWueJ4lR9KSAAAAAAAQINQ2gwMAAAAAACAWiADAwAAAAAApB4XMAAAAAAAQOpxAQMAAAAAAKQeFzAAAAAAAEDqcQEDAAAAAACkHhcwAAAAAABA6nEBAwAAAAAApB4XMAAAAAAAQOpxAQMAAAAAAKQeFzAAAAAAAEDqcQEDAAAAAACkHhcwAAAAAABA6nEBAwAAAAAApB4XMAAAAAAAQOpxAQMAAAAAAKQeFzAAAAAAAEDqcQEDAAAAAACkHhcwAAAAAABA6nEBAwAAAAAApB4XMAAAAAAAQOpxAQMAAAAAAKQeFzAAAAAAAEDqcQEDAAAAAACkHhcwAAAAAABA6nEBAwAAAAAApB4XMAAAAAAAQOpxAQMAAAAAAKQeFzAAAAAAAEDqcQEDAAAAAACkHhcwAAAAAABA6nEBAwAAAAAApN7CJf20ior5Jf28eqhC0vz58yvKvh3MVV6Yq/qDuao/0jBXHK+qZhNU7rlin8pPuedJ+nOumKyqcQ5Yv6RhrjhWVY/9qn7JZ67IwAAAAAAAAKlX2gyMv5T9ElgK2SW5igq+HQBIC36Rk7h9hEIo535V2XmWjc+bN6+UmyOJ/Qp1x7EqG/tVw0UGBgAAAAAASL2yZGCgcvOpEEUDddhhh3ncvXt3jw866CBJ0s477+xjzz77bMm2CwDQeFR2nsX5F1AaTZs29bh169aSpOnTp5drc1APkYEBAAAAAABSjwsYAAAAAAAg9SghAVBUm266qSTp4osv9rHFF1/c4xkzZkiSvvrqq9JuGAAAaHAOOeQQSdJNN93kYyussIIk6bPPPivHJjV6sXnu5ptv7vEVV1whKVlaTDkXqkMGBgAAAAAASD0uYAAAAAAAgNSjhARAwVmqpiRtsMEGkqRmzZr52E8//eTxBx98IElae+21s8ZQHi1btvT4v//9r8crr7yyJGm33XbzsYceeqh0GwYAJdSqVSuPmzdvLkmaNm1auTYHC1h00UU9PvbYYz0+9dRTJUmTJk3yse+//750GwZnpSPLLLOMj40aNcpjOzdcaKHMPfU//vijRFuH6Morr5SU3JfmzZtX5Wts3uLzdthhB48feeSRQm5i5nOL8q4AAAAAAAAFRAYGymrhhTP/BFdZZRWPt9hiC0nSt99+62P333+/x9VdEUTptWnTxuORI0d63KtXL0nJpkzDhg3z+KKLLir+xqFG7r77bo9XWmklj20O11lnHR8jAwONgd19l6Qdd9zR46233lqSdOihh/pY/K279957sx7/9ddfi7adqJnYWHC11VaTlLyr/8wzz3jctGlTSVKnTp18bObMmUXeQlTl8MMP9/j888/3eMqUKZKk/fbbz8d+/PFHSdKaa67pY3369PH45ptvLtp2NmZ2h/7AAw/0sRYtWnj8xRdfSCLrolxixrTtL/FvrOoaqtpz4/NOO+00j8nAAAAAAAAAjRYXMAAAAAAAQOrV+xKSmP5nYqpnTGmx53bs2NHHFl98cY8tFTCmBP72228ek95UN3vuuafHnTt3liQtueSSPnbSSSdV+fpXX33VY1vHOzYCeuqppzyOpSdIn/79+3tMCUl6WOr0euutV+XzPv7441JsTqPWpUsXSdKnn37qY7///nuZtgbnnHOOx4MGDcp6vLKyxr322kuS1L17dx+79NJLPR49erQk6YcffijIdqJ6VgoiSUsvvbTHNq+XX365j8VzSPt9bNu2rY9RQlIeVnJ8xRVX+NjPP//s8dFHHy1Jeuutt7Jeu+qqq3rcrl27Ym0i/rLGGmtIyjRWXdABBxxQys3BAuLfSwMGDJAk9e3b18dOOOEEj+NvZ7mRgQEAAAAAAFKvXmZgLL/88h4/++yzHlujmMUWW8zH4h0ru5Iel8WaPXu2x3YHZM6cOT4Wl3u0RiTnnnuuj82aNauW/xeNQ2zUY8vzSFKHDh3yer01XZKSzZYs3n333X3MsjIkaf3115ckff311zXcYtSUXVWP+0Vk++Xf//53H/vnP/9Z/A1DjR1xxBGSkncYc7nttttKsTmNTtyHhgwZIinZEDfeCbHftpgZWF2zLeQn3pXdY489JEnHHHNMnd6zR48eHsf9x+4U85tYfJaFG5eJtmxQSXrvvfckSV9++aWPxaU3W7duLUnq2rWrj1mzSBRfPHe/5ZZbsh6/7LLLPH788ccrfZ+lllqqsBuGLDE73u7qx4z3mHE2fvz40m0Ysvzyyy8eP/roo4n/StLkyZM9XnnllSVJp59+epXvGTMWi4UMDAAAAAAAkHpcwAAAAAAAAKlXL0tIjj/+eI9j+p/J1dhTyjTZiim3sYTE0qZjCcrCC2e+op49e0qSXn75ZR8bN25cjba9sYmpSTFF1hp2xjS/Cy64wGMrHYlNmWL62S677CJJWmSRRXxs6NChHtva7auvvnqdth/Ve/PNNyVVnr5u+93DDz9csm1C/qwZmiSdffbZVT73nnvuKfbmNDpbbLGFx1Y2IkljxoyRlGx81rt3b4/79esnSWrWrJmPxbROay5I8+n8tG/f3uMRI0Z4vOmmm1b5uokTJ0qSHnroIR+LZQUHH3xwle+zzz77SKKEpJRiafH777/v8bRp0yQlG7Ja487ou+++K+LWoTL777+/x5tssokk6YMPPvCxWEJSlddee83jWCKEwonl47vttpuk5N9mN998s8dz584t3YahxmKJz8knn1zp8+L5SyxBKRYyMAAAAAAAQOpxAQMAAAAAAKRevSwh+eqrrzyOqYCW1hdTAmPKkq1SEdM7J02a5PE666wjSVpuueV8rH///h5bCcOaa67pY5SQ5C+mp990002Skmuox3Ke6px//vmSMitcSJnuuJK09957S5IOPPBAH7v99ttruMWoTEx7v/DCC6t8rpUGxbWmkR5xv4xpn+bXX3/1+P777y/JNjUGyyyzjKRkGV08tu28886SkqVZn3zyice2KlYsMenYsaPH1uWdEpL8rLvuuh7nKveIZQW2Wo8kPfjgg5KSx7LIVh+prITkqaeeqvnGolZsX4qlrTGeMWOGpGQZcVz5wvYlW60ExRfLuA877DCPbS7j6nRx1bqqvP766wXaOlQmlqZ26tRJUrJU5Oqrry75NqF63bp1k5Rc7fO8887zOK7AZKx05PLLLy/y1iWRgQEAAAAAAFKvXmZgXHLJJR7feuutHlsznsruOOVqMhjv4P/73/+WJG2wwQY+tvXWW3tsV+Lj1XnUTrzTWBdrr722x7vvvrvHdqW3srtiqJuVVlrJ4+7du2c9HrNdTjvttJJsE/L3t7/9zeO99trL41y/kXfffbfHo0ePLu6GNXDxeHPnnXdKSn7nselwrrmIY7/99pukZJPBtdZay+O63CWO2xkzD6LKmmXXV5ahKWXuxEtSu3btJGWacUrSHXfcUeV7jRo1yuMdd9yxyuda40iUTmUNp5s0aSIp02Rckpo3b+6xZezme6cfdbfHHnt4vMYaa3hsWbzMRTodffTRHlsWTa6GuSiPmG1r2aBSpklnbJgbfy+//PJLSclsqFI07MyFDAwAAAAAAJB6XMAAAAAAAACpVy9LSGKJSF0bA8b3mjVrliRpyy239DFLH41iUzuUzlJLLeXx8OHDJUkHHXSQjzVt2tTjsWPHSpLGjBlTmo1rBGITuosvvjjr8bie+rXXXpv3+7Zp00aS1LNnTx979tlna7OJyNNOO+2U93Njk0nUTUzb3HDDDSVlUjIl6aeffsr7vez3bs899/Sx2JB1zpw5td7OWB7SrFmz5IN/Nc6OZSYNwbvvvuvxdttt5/GwYcMkSQ888EDO19l3teKKK/qYNQSXkk0IjZ1rSNJ///vf2m0wCq5fv36SpH/84x8+Fs8RrdyuLvsW8mO/ldawXUruN2eddVbJtwlVi+fo++23X9bjt9xyi8c1adqPwuvbt6/H1f2ddM4553hsi2CUq2wkalhnIAAAAAAAoEHiAgYAAAAAAEi9ellCUiwtW7aUJB1++OE+Zl2ppUw39pdffrm0G9YIWenObbfd5mNxRZistGZJH3zwgcdHHHFEEbeucerVq5fHtq9EcbWKCRMmZD3epUsXjx955BGP43rTxtLTY5roDTfc4HGhVrFpbGzFmF122aXK58UU6bqW6SEjfq9WcvX000/7WCzdqGylBNO2bVtJUqdOnXzs008/zfv1VYkrj8Q4vmdlq301BLGso3///lU+t2vXrpKkiRMnVvm8WHq61VZbefzqq6/WZhNRIJ07d/b4sssuk5Q8v4jp03EVBRTXiSeeKCn5+3bllVd6zDlA+sSVRxZZZBGP7VhnK8egtGL59zPPPCOp8tXFnnvuOUnS22+/7WPXXHONx9OnTy/CFtYOGRgAAAAAACD1yMAI7CqTNRVc0C+//CKJDIxCat++vcfx6uzOO++c1+tvv/12jwcOHFi4DYNba621JElrrrmmj+W6u2sNziRp/PjxHluzoPi43T2u7L3s6vCBBx7oY3feeWeNtx1JxxxzjKTcGTTRZptt5vErr7xSzE1qVGITz6eeekqSNHToUB+r7K6IiRka9913X9bY888/X5DtrEv2RmNjzeh+/vlnH1t88cU9/uGHHyQls544hyiv1q1bexybs/bo0UNSMuvskksu8bghZx2lQTwuHXrooZKSzXVjNgzSY//995cknXrqqTkfP/PMMyVlfgtRfDfffLPH8dhj5xjffPONj/3nP//x+Pjjj5dUP+aKDAwAAAAAAJB6XMAAAAAAAACp1+hLSOIa7dtuu62kyte3nzlzpiTpt99+K/6GNUAxbfPqq6+WJO20004+1qpVqypfP3nyZI9HjBghSRo2bFgBtxAmllFZaU9s4pkrxdwar0rSPffc47GluNcmLf3DDz/0eNq0aTV+PZK/cdYwNZYdxN+766+/XhJlI8Uyd+5cjwcPHiypZk1Sd9xxR4833HBDSdIdd9zhY7FJKErjo48+kiTdddddPvZ///d/Hv/000+SpBkzZpR2w5DFfvdio/Z4XLNzu7XXXtvH6kMqdUMRS4c7duwoKVk2Yufg0TLLLOPxyiuv7LH9rtJ4tThio9tDDjlEktS0aVMfi02LYzN+FNe6664rKXmuEP/2mjJliiTp2GOP9bFHH320RFtXWGRgAAAAAACA1OMCBgAAAAAASL1GX0KyySabeJxr9ZHYdTrflTGQSdWM3++NN97ocZcuXbJeY6m2kjR16lRJ0imnnOJjjz/+uMcxFRuFFzvqT5gwQVIy1bZUVl99dY9jeuibb75Z8m2pr+LqPFtttZWkZDmPrdEuZUq7UBxxv8o3NT0el+JvqKXonnHGGQXaOtSFrWImSXvuuafHyy23nKRkp3fbD6VkaSSKy1ZXimUJ8bewd+/ekqQvvviipNuFP8WVysyzzz7rcdxvbrjhBknSkksu6WNNmjTx2Eq71lhjjYJvJ6SRI0d6bOWM0cUXX+xxPLdHcdn+EFd4jE477TRJ9bdsJCIDAwAAAAAApF6jz8A46qijPI7N7kxsHPj222+XZJsagl133VVS8iptLq+++qrHu+++u8eff/55la9bYYUVJCUbEMYGQv37989rO2MDqLXWWkuSNGnSJB87//zzPf7qq6/yes+GIH4v1qCplOyuS2zyGu9eI3/xO8wl7mvvvvtusTen0Ym/UbF5ar769OnjcTxGPfHEE5Kk33//vQ5bh0KJ+0487lnDSGtKKCWzCe2uMpkYxdG2bVuPb731VknJBoQx64zfv9KLd+932GEHjx944AFJyYarMZvQsjBjttNqq63m8YABAwq/sY1cPBZtvPHGHtu596xZs3zs3HPPLd2GwVn2+meffeZj1rxdyhyb3nnnHR+L2TL/+te/ir2JBUMGBgAAAAAASD0uYAAAAAAAgNRrlCUkMX1w8803r/K5lTV7QtWGDRtW5eO//PKLJOmOO+7wsYMOOshjS/vcdNNNc76+Z8+ekpJNmwo1P/HfhK2pLOVuVNRQxcaO48ePl5RpgCZJ8+bNy/u9LIW+Jq954403JCXnF7Vjjekq0xCaOaVZLBtp1aqVxzNnzqzyuZaWG5t0xjK2F154QVKmnE5KljzG0pWqPic2qkZhDBo0yGMrS7jiiit8LJaTnHzyyZKkgw8+uERb1/DFf/vWtE7K7CvPPfecjw0ePNhjzvFKL5Z9RP369ZMktWzZ0seuv/56j48//nhJyYbuSyyxhMe5fl9RN3fddZfH8bs2VjouSXPmzCnJNiHJjjd/+9vffOzBBx/02H4Du3bt6mPWEFfKNM6/8847s94zbcjAAAAAAAAAqccFDAAAAAAAkHqNsoTkxhtv9DhXGlRMn4/PReG0aNFCUrIDeG1UlvJp6WsTJ06s8vUxzdBWvvj66699rDGl16+zzjoeP/TQQx7biiSxBKQmqbb2uspe8+WXX0qSNthgAx/74osv8n5/ZDvxxBM9zvUbFztQn3feeSXZpsYq7jdxRYTZs2dLSqa7x3TpvfbaS1JmdSQpkzYtZVYhiSUk9rsqSccee6wkabHFFvOx6667TlLyNw6FZ3MrSddee60kaf311/exvffe2+MDDzxQkvTUU0/5WEzfRc2tuOKKHtt+IGVWSYgrV5DqXl6bbLKJx7G0rU2bNpKka665xsfiXDZv3lySdNhhh/nYtttu63FcQQ51Y6WPHTp08LE4V7ZCnJUb11ZcSdCOZfH4GVfcst9Yyr5yi6tmxtV9Ro8eLUnq3Lmzj8Xv3UoaY5lj3MfS9HtJBgYAAAAAAEi9RpWBYXe6rDmQlLyKaJ5//nmPaXBWO0OHDpUkXXjhhT62yiqr1Ph9Xn/9dY/jXS0TMwWip59+WpI0YcKEGn9mYxWvwlrWRbHEDABrbkfWRd3ZvB133HE+tvDC2T/zdhVeotlZscU7RJ9//rnHdjyK+1187qqrripJ+vjjj30sNlGzY1P8XYxzPWnSJEmZTA1J+vXXX2v5f4HasjuI++67r49tvfXWHltWzgknnOBjZGDUzuKLLy4peQ4XG0EfeeSRkqTp06eXdsOQZemll5Yk7bLLLj4Wf//sty5mnXXq1MljO/eL2WRDhgzx+K233irwFjdeSy21lKRM1ouUnCtruh7P8adMmeKx/QbGDIp43LOMqdgo345/I0eO9LE4p2Re5G/y5MkeW9PcmHlrWRfR/vvv7/Hw4cM9/uijj4qxibVCBgYAAAAAAEg9LmAAAAAAAIDUa1QlJJYGs9xyy+V83NaTPuigg0q1SQ2WrTscm2BaI6Ca+Pbbbz2mnKe4dt555zq9Ps6PNeaUpJNOOinruVbiI0kzZsyo0+cio3fv3pKSJUAx1XLUqFGSpIsuuqi0GwZJmSaC0W+//eZxLAGx8sbY+LN79+4eWwlKbAIaS+YefvjhAmwxiuGf//ynx6eddpqkZHq2HSt//PHH0m5YPdSsWTOPx40bJylTniBJt99+u8e33nqrpGRjQJSHNSeO54Ux1f3KK6+UlGzGuc8++3hsv5uxOW6aGgw2JDfffLOk5PEpli4OHDhQUrJEcpFFFvG4V69ekpJlI4suuqjHVvrVunVrH7MSonfffdfH7G801J41wj3kkEN8LFcrhXhekVbp30IAAAAAANDoNaoMDFs6K9fVJkl68803JXFHuJBi0zgayKXbVVdd5XG8un766afn9frrr7/e49hEEsXVp08fj++5554qn/vII49Iyt0QF+URM2TiHcT7779fktSzZ08f++677zy2u12xMRqNzQoj7lO2HF2u7Jma2HjjjT2OS9+auGxdly5dJCWbWCO3M844w+O+fftKSjYmjksAknmRHiuvvHLW2Oqrr+7xK6+8Ikn6/vvvfeyWW27x2OadrIvii/Ni4u+hNZqOx594jvHcc89JSv7tFe/w2+vi6zmWSQcccICkTJZeIVij1eq+67Fjx3qc1r/dyMAAAAAAAACpxwUMAAAAAACQehUlTdOpqJgvSbkLOIojrmVrDZxiI5rYeNBSaz799NPSbFxgs1Ahaf78+aX8inKq+GuuUDXmqv5oqHMV1+geMmSIpMrTL60hVv/+/X1s6tSphd6kOkvDXJXjeBV169ZNkrTpppv6WCzTKleKbTxW/bUdZZ2rQu1T1113ncfxvGHKlCmSkqU6tWFNC6XkOYh56623PLamd4VU7nmS/pyrBf/91EYswfnkk088tn2iTZs2PlZfGqE2tnNAm8OJEyf62H//+1+P7733XknSQw895GNff/11MTepVtIwV8U+Vlnzzfi3UfyNmjZtWpE+ue7q8351zDHHSJIuv/zyQn6+pOT5Q2y6b02PY2leOeQzV2RgAAAAAACA1OMCBgAAAAAASL0GvwpJXFkhV9pmTD9MYyo1AFTFSt+kzIoxBx10kI+NHj3a43POOUdS/UmrbswsLfe+++7zMTqzF89qq63m8WKLLebxmmuuWdTPfeGFFyQlS8GQm6U/X3bZZTkft9Ifft/Sz8oRWrZsWd4NQbVspZe1117bx7799ttybU6jYau3TJ8+3cfat29fp/fMtULgmDFjPK5PfweTgQEAAAAAAFKvQTbxjA2c4pWrJk2aZD13xIgRHu+1117F3bAq1OdGM40Zc1V/MFf1RxrmqtxNPPfbbz9J0rhx43zsu+++K9PWZDTUJp7xTnDM1rRmdVtuuaWPtWjRwuOjjjpKkjRq1Cgf++ijj6r8rEsuucTjn3/+WZI0e/bs2mx23so9T1Ldm3gutNCf99yeeeYZH5s7d67HW2+9ddZYfcE5YP2Uhrkq97Eqzdiv6ieaeAIAAAAAgAaBCxgAAAAAACD1GmQJSSwViWtMd+3aVZL0wQcf+Fj37t09LmfaIWlO9RNzVX8wV/VHGuaqHGm5sXTBGq7G9ditmVo5NdQSkoau3PMk1b2EpCHjHLB+SsNcUUKSzY6lc/76u67JQgvpjz/+KPtXxH6VH0pIAAAAAABAg8AFDAAAAAAAkHoLV/+U+uePP/7wuFu3bh5bB+t58+aVfJsAAKjKKqus4rGVi8TjGQAAyGZ/40lS27Zt/wy++UaSVNJ2CSgJMjAAAAAAAEDqNcgmnqVkDUPj91ibDA8aONVPzFX9wVzVH2mYq3Icr5o2beqxHUfSloFBE8/6qdzzJNHEsyqcA9ZPaZirhvi3VW1UVGS+AfubjP2qfspnrspSQtKgZi9lJ5cAgMIp6fEqBauMAKXQoM4DgRRo9PsUZSKNCiUkAAAAAAAg9UpbQgIAAAAAAFALZGAAAAAAAIDU4wIGAAAAAABIPS5gAAAAAACA1OMCBgAAAAAASD0uYAAAAAAAgNTjAgYAAAAAAEg9LmAAAAAAAIDU4wIGAAAAAABIPS5gAAAAAACA1OMCBgAAAAAASD0uYAAAAAAAgNTjAgYAAAAAAEg9LmAAAAAAAIDU4wIGAAAAAABIPS5gAAAAAACA1OMCBgAAAAAASD0uYAAAAAAAgNTjAgYAAAAAAEg9LmAAAAAAAIDU4wIGAAAAAABIPS5gAAAAAACA1OMCBgAAAAAASD0uYAAAAAAAgNTjAgYAAAAAAEg9LmAAAAAAAIDU4wIGAAAAAABIPS5gAAAAAACA1OMCBgAAAAAASD0uYAAAAAAAgNTjAgYAAAAAAEg9LmAAAAAAAIDUW7iUH1ZRUTG/lJ9XX82fP7+i3NvAXOWHuao/mKv6g7mqP8o9V8xTfso9TxJzlS/mqv5gruoP5qr+yGeuSnoBA/UHe1jVyv4rGDBXVUvTXKH+YL+qWpr2K+aqammaKwCFxe9f9dLyG8hcVS/fuaKEBAAAAAAApB4ZGKhSWq5apkWar54yV0lpnivUH+xXSWner5irpDTPFYDC4vcvW1p/A5mrbDWdq0Z/AePss8/2+PTTT88aGzZsWKk3CQAAAAAALIASEgAAAAAAkHpcwAAAAAAAAKlXMX9+6SqE0rJ8zB133OHx3nvv7fFCC/15PeeFF17wsb59+5Zuw/6ShqV+9NdcFXJDWrVq5fEtt9wiSVp55ZV9bPnll/d4scUWkyTFf5/vvPOOx6eccook6bnnnvOxP/74o4Bbm5ttjX0vDXWuGoI0zlVafgPTLg1zxX6VW9r2q4qKivkLbhP+FL+Xcs+TxO9fvpir+iMNc8WxqnJp+w1kripX07kiAwMAAAAAAKQeFzAAAAAAAEDqNapVSKzsYN999/WxXCU048aNK9k2NSbHH3+8x7vssoukTNmOJFVUVJ0xtO6663o8atQoSVKvXr187NNPPy3EZgJAWTRv3tzjxx57TJLUsWNHH+vSpYvHpSiZA4A069atm8eTJk3y+MUXX5QkbbTRRiXfpsYgnq/ffffdkpIl+fFvKztPf/PNN0u0dWgMyMAAAAAAAACp1+AzMJZYYgmPBw8enNdrJkyYUKzNaXTiVdoTTzzR4yZNmtTpvRZffHFJUocOHXyMDAygME499VSPH3jgAY/bt28vSZo3b56PffPNN1mv//XXXz3++uuvi7GJDVLTpk09tgbHyyyzjI999tlnHtudxx9++KFEW4eqxLlbZJFFPLasmf3228/H3nvvPY/vvPNOSdJvv/1W7E1EDj169PDYsp5+//13H1thhRVKvUmopXhcWm211SRJI0eO9LEDDzxQUvL41FBVltFcqIUb4u9dv379qvz8MWPGSJI6depUkM8GJDIwAAAAAABAPcAFDAAAAAAAkHoNvoTklltu8djSn6OY5jR58mRJ0jvvvFP8DWskYrraL7/84rGVgPz8888+FktApk2bJimZMm2NPyWpRYsWkphaWtUAACAASURBVKStttrKx1555ZUCbTXqKqbdDh8+XFKyAWFsvjpnzhxJ0mmnneZjV111lSQaFZbLgAEDPD733HNr/HrbfyVp6NChkqSbb7657hvWwMXfSPsOYwlJbOg5evRoSdLmm2/uY4VKD0ZG69atJUlnnXWWj6255poeL7fccpKkZZdd1scWXXRRj2OjahPnyfYPS3mXGkeKe1ocfvjhHi+99NKSpKlTp5Zrc1AgVj7+1FNP+Vhj2q9iiUcsiSqU+Bs2e/bsKp/btm1bScnfwljug+KK37uVMp555pk+tuKKK3ps8/r000/7WP/+/T1OU6kjGRgAAAAAACD1GmQGxsYbb+zxDjvs4LFdWbruuut87JJLLvF45syZkqSffvqp2JvYKPXu3dvj8ePHS8o0VZKkF154wWO7OtuuXTsf23HHHT1eeOE//+kedNBBPnbOOecUdoNRIzEbxu4qSlKfPn0kJbOd4h0Buzr8j3/8w8escSR3woovXl23bItVVlmlTu8Zm+tahg2qF+9KPfnkk5Kknj17+ljch1ZddVVJyYaRs2bNKvYmNgp2x1CSXn75ZUnJrDI7/ki5m+XFu5M2p3Fu4nK5dtffMj2kxnWnOE1sLjt37uxjW2+9tcfW5BPlZ/tLZRmCtr811vP5Uh53K2sYauwYFbNCqsvaQOEcffTRHtu5eTzGxfmzODZmjX8zH3zwwZLSke1JBgYAAAAAAEg9LmAAAAAAAIDUa1AlJJamNGTIEB+LqZ6WlnnMMceUdsMgSfrf//7ncXVrq1sa05577uljuVKeqktdQ/Htu+++kqTrr7/ex2ITO2vEedRRR/mYlYhI0s477ywp2cQzphqi8LbcckuP77vvPo9jOUK+Hn74YUnS999/72MHHHCAx1bmdfvtt9f4vRub+HuWq/ljZPsYJSSFF8vZrFSnMtbU7JFHHvGxWEL3+eefS0qWZVlZSvTjjz/WbmNRJ7ka2MX90I5PEiUkaXLYYYdJknbaaaecj0+YMEGSdOedd5Zsm9Kk2Cn+sdyxWbNmVT7XjmWxTO6bb74pzoZBUrKVgjXSl6RWrVpJSv77iOcNNpfx/MPO8aVMydaUKVMKvMU1RwYGAAAAAABIPS5gAAAAAACA1GtQJSQDBw6UJG2zzTY+Frt5n3jiiSXfJuQvlg1cc801kjIdbyWpSZMmHtu8du/evURbhyiWi9h+F+fv66+/9vjKK6+UJN12220+Fueyb9++kpIrk0yfPr3AWwwps5LP3Xff7WOx3Of999+XJC233HI+tthii3lsaYNxDfGHHnpIknT11Vfn/ExbZQE1s9pqq0mqvEzOVrKgjK7wYkqtpUrHlNv33nvPY1t9adq0aT4Wn2vzs9lmm/lYTM+1EhS68peOHXMkabvttqvyucsuu2yxNwd5WnLJJT0ePHhwGbcEVhosSS+99JKkZLlVZL+Bcf4oISmOxRdfXFKyTNvKRqTMsWns2LE+FldztMffeOMNH+vYsaPHm2yyiSRKSAAAAAAAAPLSoDIwTjrpJEnJO1IffPCBxzfccEPJtwlVW3nllT22O7mS1K1bN0mVN7Kzq4vctSqd448/3mNroCVl5ihmXay77roe23hs+tS1a1eP99lnH0nSL7/84mPx6j7qJjZHtSy0Fi1a+Ni4ceOynhsbHffv39/jXXfdVZI0adKkvD8/ZsGhavHOvR27tt9++5zPtQbV1TX7RM1dfPHFHlu22VdffeVj8besOjY/sSF1PEd58803JfGbV0qXXnqpx3H/sUbjnTp1Kvk2oXqxKf9SSy1Vxi1BZBnTlWVgGMs2Q/FMnDhRktS+ffucj1uz6QEDBvjYzz//nPW8m266yeOzzjorK77jjjt8bO7cuXXY4trjzAcAAAAAAKQeFzAAAAAAAEDq1fsSkj322MNjW887pqKfffbZJd8mVM8aPtpa3VKy0YyJKdVvvfWWx5ayFhsQkp5WHJaqecopp/hYTLv96aefJGWaDkrSjz/+mPU+1lxIksaPH+/xIossIkl6/PHHfSxXShvyZ40FJWnIkCEe2/7y4osv+lhs4DRjxgxJyRKhdu3aZT0e2brhPXv2zLktlJDkL/7effbZZ1ljsfTAyhj43Su8+PuV67esJk4//XRJ0jrrrJPz8TFjxkhKzjMKJ+4zG264oSRpjTXW8LEnnnjC46efflqSdO6555Zo6+qv2LR7pZVWkpRpAl0sNWna/u677xZxSxDZ+cScOXN8LP77MPEc8eOPPy7+hjUSo0eP9rhz586Skr973333nceDBg2SVP059kcffeRxPMew0pRYZnz55ZfXZrPrjAwMAAAAAACQelzAAAAAAAAAqVcvS0iaNGnisa1gEH344Ycex9QapIelsseyglxiGtSaa67p8XPPPScpWS702GOPeXzkkUdKSqZOoXZ22WUXSZV3/b7iiiskVZ5qbSUGliotSW3atPHYOhjH1TJIp64d+w5zlY1I0lNPPSUps5qIlCkBqkyuspFomWWWkVR5ivz+++9f5euRm+0vF154oY/FtFzryL/88sv72OTJk0u0dahKPG5ZiVYsu5s1a5bHN954Y8m2qzGylGopWbpo4nFp+vTpJdmmhiD+e15iiSVK8pn/+Mc/8n7u+eefX8QtQWRloi+88IKPbbbZZh7b+Vw8X0fdxGPM2muv7bHtl3GlrLffftvjKVOmVPm+ti9fdtllPhbPIU0sPba/AUp93k4GBgAAAAAASL16mYGx5JJLepxr3eEnn3yylJuDWrC7vuedd56PxTvw8eqiiVf87a6+/VeS9tprL4932mknSdKVV17pYzW5eo+M6rJYvvrqK0nJzKg4f9YQrW/fvjlf/8ADD0iS3nnnnTptZ2NijU+lZAMly0jLlXUhSXvuuaek6rMuasKaFEZ33XWXx9OmTSvYZzUm1uTsjTfe8LE+ffp4bPvbgw8+6GPdunXzmCym8rnqqqs8jhky5p577vF45syZJdmmxmTZZZf1+NJLL816PB5r4lxss802Wc+NdzKRMXv2bI9ffvnlon3OwIEDPa7sHMKcddZZHk+dOrVo24Tc4jl6ZOeDMfPTsqhRO/F8u0OHDlmP//HHHx7beZ+U+T2L54hrrbWWx5ZNsfTSS/tYrr/HYkb8K6+8Iknq16+fj5WiET8ZGAAAAAAAIPW4gAEAAAAAAFKvXpaQbLTRRh7nSm255JJL8n6v2AT0mmuukZRsSBSb0lhK73XXXedjljqD2jnjjDM8vu222zweN26cpMz64lIyZSrGuTRv3lySdOqpp/qYlZX06NHDx0izrt6ECRMkSb///ruPxWaCgwcPliS1bNky5+uPOOIIScn0wphedthhh0kiVbcmYhPU//u//8t63JpqSTVr2JmvuJ57LN0ysewhriGO/NlvU2w8uO6663ps+9Nyyy3nY7GkLqZ4o/hWWGEFjw8//HCP7RwlzsfQoUNLtl2N0YYbbuhx/P2zJoIxpTo27rR5i8e6mpxPonDst+yoo47ysVwlCp9//rnH9913n8ec25Xea6+95nGucp9Y+oq66dixo8fxuG9iadz333/vsf1NFUuPe/fu7bE1Za8Je308v/z00089thKVH374ocbvXRUyMAAAAAAAQOpxAQMAAAAAAKRevSwhWXHFFT2OaWLPPvusJOnbb7/N+7122203jy0tO75nLFextMSYkmhr5Z555pl5fyZysxIdSeratWvW47Fs5OCDD5YkHXnkkT62xhpreLzwwtn/tO0945rJVh6Bylkq2DHHHONjceWJTp06SZKOPvpoH4sdwFu0aCEpWSISU6x//PHHwm5wA7bttttKkh5++GEfi2V0X3zxhaRkV+lCrjhinattO6RM6VBMu6a0ru6sDC524Y9zPWfOHEnJtOr4u/nmm28WexMbrVhCZ53X7733Xh/LldIbV9yKae8oHFul5/rrr8/5+DPPPCNJateunY+ddNJJHsdzA5SXne9VNyfxWPj+++8XdZuQm81V/Nsol1y/i6idnj17Vvl4XCXEfvekzP4UVyGpjblz51b5eNu2bT3eb7/9JEnXXnttnT5zQWRgAAAAAACA1KuXGRiVsTuANWkGGO/65xIb0NkVq8UWW8zH7E50bJp34YUX5v35yF9c1/imm26SJN16660+dsMNN3h8yCGHZL3e7l726tXLx8jAqJ5dab355pt9bMSIER5vv/32kqRtttnGx2Jmk33vsSFubLaFqsUr2XYFO2YjxYyxc845R5I0Y8aMomyLZXZY5pmU+b197LHHfOzFF18syuc3Jt26dZMktWrVysfisc32J3uelGmoK0kHHHCAJJrZ1dUq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Ukl1J91fHQ/b1GbTWWedZXFotvbII4/YmG8g+e2335b7+fNtrSpi2223lSQtXLjQxh577DGLL7zwQknxZ1IUwlqlstVWW1kctqzt16+fjdWqVcviX375RVLyXeHNNkskVd5www2SpOuvv97GfvzxxzTPOPdrlevPqnCsNWnSxMb88RUynGrWrFni8/jGkosWLUrnFCXlfp2k3GzN6beJvvTSS4uN+TuJq1atkpTIVJOkc845x+JMni/HuDVnNtbKZ1j4zMHbb79dUvI54HnnnWdxLjNuY1yrXM+hvELjTilxbuePr/D1FStWpO01Y1irXGyj2rx5c4vDOXXY3ltK/rmHjLRwfvFH/hzjj/773/9avP/++1vss3hLwjaqAAAAAACgyuECBgAAAAAAiF7BN/EMDUkk6f/+7/9K/F6fiov0q169usU33nhjmR4zduxYi2vUqGExDT3Lz6evH3TQQRZna+91n0J9zDHHJP0rSf/73/8sDiUmvvkQEmmXvtTg1VdftTj20pFCtPXWW1s8adIkiw855BBJ0pgxY2zMN1+dOnWqpORyqtBQUpJGjhwpSXrzzTdtbPz48emaNn53O/RrTAAAFbVJREFU1VVXSZIeffRRG7v11lstDs3sfGNIZI9Paz733HMlSd27d7ex/v37WxzSpufOnWtjNO7MrN69e1scmjlK0s8//ywpuayE87r8VqdOHYuffPJJi+vVqycpuQloOktHClH9+vUt9uXXoZGxt3z5covD31EdOnSwsdD4U0ocjw0bNrSxsMGF/4zLxrkmGRgAAAAAACB6XMAAAAAAAADRK/gSEr9vrU+hR/bdcsstFoeUpNWrV6f83pAiX61aNRsLXfcl6bLLLsvEFPPe4MGDJUmDBg0q9rXtttvOYr8TT6ZLSMJab7PNNiV+31577WVxKC2hhCSZ7ywdhD26EZdQOvLMM8/YWOvWrS2+5pprJJWvdNGXm3Tt2lWSdMEFF9gYJSTpF37mPiXad3D3qbbIrZDW7MuFN9kkcR/viy++kCQtW7YsuxMrQPvuu6+kxDmJlLwWoby7IjuOlSbstCBRIpQNYdefF1980cbq1q1r8WeffSYpuSQclXPkkUdanOozaOjQoRZfe+21Fh933HGSkkuP582bZ/Hmm28uSbr88sttLBxDX375pY35YzlTyMAAAAAAAADRK/gMjM6d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\n", | |
"text/plain": [ | |
"<Figure size 1080x432 with 40 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# The red outlined digits are generated by the adversarial network.\n", | |
"\n", | |
"import matplotlib.patches as plot_patch\n", | |
"\n", | |
"plt.figure(figsize=(15,6))\n", | |
"noise = np.random.uniform(-1.0, 1.0, size=[40, 100])\n", | |
"images_fake = net_generator.predict(noise)\n", | |
"images_real = x_train[np.random.randint(0, x_train.shape[0], size=40), :, :, :]\n", | |
"choice_vector = np.random.uniform(0, 1, size=40)\n", | |
"\n", | |
"for i in range(40):\n", | |
" \n", | |
" if choice_vector[i] > 0.5:\n", | |
" image = images_fake[i, :, :, :]\n", | |
" else:\n", | |
" image = images_real[i]\n", | |
" image = np.reshape(image, [28, 28])\n", | |
"\n", | |
" plt.subplot(4, 10, i+1)\n", | |
" plt.imshow(image, cmap='gray')\n", | |
" plt.axis('off')\n", | |
"\n", | |
"plt.tight_layout()\n", | |
"plt.show()\n", | |
"\n", | |
"plt.figure(figsize=(15,6))\n", | |
"\n", | |
"border = np.zeros((28,28,3))\n", | |
"border[0,:] = [255,0,0]\n", | |
"border[:,0] = [255,0,0]\n", | |
"\n", | |
"for i in range(40):\n", | |
" \n", | |
" if choice_vector[i] > 0.5:\n", | |
" image = images_fake[i, :, :, :]\n", | |
" else:\n", | |
" image = images_real[i]\n", | |
" image = np.reshape(image, [28, 28])\n", | |
" \n", | |
" ax = plt.subplot(4, 10, i+1)\n", | |
" plt.imshow(image, cmap='gray')\n", | |
" if choice_vector[i] > 0.5:\n", | |
" ax.add_patch(plot_patch.Rectangle((0,0), 27, 27, edgecolor=\"red\", linewidth=2, fill=False)) \n", | |
" plt.axis('off')\n", | |
"\n", | |
"plt.tight_layout()\n", | |
"plt.savefig(r'output/mnist-normal/final_results_sample.png'.format(i))\n", | |
"experiment.log_image(r'output/mnist-normal/final_results_sample.png'.format(i))\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"COMET INFO: ----------------------------\n", | |
"COMET INFO: Comet.ml Experiment Summary:\n", | |
"COMET INFO: Data:\n", | |
"COMET INFO: url: https://www.comet.ml/ceceshao1/mnist-gan/cf310adacd724bf280323e2eef92d1cd\n", | |
"COMET INFO: Metrics:\n", | |
"COMET INFO: acc_adv: 0.35546875\n", | |
"COMET INFO: acc_dis: 0.7246094\n", | |
"COMET INFO: loss_adv: 1.024724\n", | |
"COMET INFO: loss_dis: 0.5381024\n", | |
"COMET INFO: sys.gpu.0.free_memory: 6392709120\n", | |
"COMET INFO: sys.gpu.0.gpu_utilization: 0\n", | |
"COMET INFO: sys.gpu.0.total_memory: 11996954624\n", | |
"COMET INFO: sys.gpu.0.used_memory: 5604245504\n", | |
"COMET INFO: Other:\n", | |
"COMET INFO: dataset_info: [[[[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" ...\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]]\n", | |
"\n", | |
"\n", | |
" [[[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" ...\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]]\n", | |
"\n", | |
"\n", | |
" [[[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" ...\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]]\n", | |
"\n", | |
"\n", | |
" ...\n", | |
"\n", | |
"\n", | |
" [[[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" ...\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]]\n", | |
"\n", | |
"\n", | |
" [[[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" ...\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]]\n", | |
"\n", | |
"\n", | |
" [[[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" ...\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]\n", | |
"\n", | |
" [[0.]\n", | |
" [0.]\n", | |
" [0.]\n", | |
" ...\n", | |
" [0.]\n", | |
" [0.]\n", | |
" [0.]]]]\n", | |
"COMET INFO: Uploads:\n", | |
"COMET INFO: assets: 0\n", | |
"COMET INFO: figures: 0\n", | |
"COMET INFO: images: 24\n", | |
"COMET INFO: ----------------------------\n", | |
"COMET INFO: Uploading stats to Comet before program termination (may take several seconds)\n" | |
] | |
} | |
], | |
"source": [ | |
"# at the end of your training, end the Comet experiment\n", | |
"experiment.end()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python [default]", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.5.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How the discriminator could be trained (in 4th step) if it's layers have been frozen (in 3rd step)?