1272 lines
102 KiB
Plaintext
1272 lines
102 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Deep Learning Models -- A collection of various deep learning architectures, models, and tips for TensorFlow and PyTorch in Jupyter Notebooks.\n",
|
|
"- Author: Sebastian Raschka\n",
|
|
"- GitHub Repository: https://github.com/rasbt/deeplearning-models"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Sebastian Raschka \n",
|
|
"\n",
|
|
"CPython 3.7.3\n",
|
|
"IPython 7.6.1\n",
|
|
"\n",
|
|
"torch 1.2.0\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"%load_ext watermark\n",
|
|
"%watermark -a 'Sebastian Raschka' -v -p torch"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"- Runs on CPU or GPU (if available)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Convolutional GAN with Label Smoothing"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"Same as [./gan-conv.ipynb](./gan-conv.ipynb) but with **label smoothing**.\n",
|
|
"\n",
|
|
"Here, the label smoothing approach is to replace real image labels (1's) by 0.9, based on the idea in\n",
|
|
"\n",
|
|
"- Salimans, Tim, Ian Goodfellow, Wojciech Zaremba, Vicki Cheung, Alec Radford, and Xi Chen. \"Improved techniques for training GANs.\" In Advances in Neural Information Processing Systems, pp. 2234-2242. 2016.\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Imports"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import time\n",
|
|
"import numpy as np\n",
|
|
"import torch\n",
|
|
"import torch.nn.functional as F\n",
|
|
"from torchvision import datasets\n",
|
|
"from torchvision import transforms\n",
|
|
"import torch.nn as nn\n",
|
|
"from torch.utils.data import DataLoader\n",
|
|
"\n",
|
|
"\n",
|
|
"if torch.cuda.is_available():\n",
|
|
" torch.backends.cudnn.deterministic = True"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Settings and Dataset"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Image batch dimensions: torch.Size([128, 1, 28, 28])\n",
|
|
"Image label dimensions: torch.Size([128])\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"##########################\n",
|
|
"### SETTINGS\n",
|
|
"##########################\n",
|
|
"\n",
|
|
"# Device\n",
|
|
"device = torch.device(\"cuda:3\" if torch.cuda.is_available() else \"cpu\")\n",
|
|
"\n",
|
|
"# Hyperparameters\n",
|
|
"random_seed = 1\n",
|
|
"generator_learning_rate = 0.0001\n",
|
|
"discriminator_learning_rate = 0.0001\n",
|
|
"NUM_EPOCHS = 100\n",
|
|
"BATCH_SIZE = 128\n",
|
|
"LATENT_DIM = 100\n",
|
|
"IMG_SHAPE = (1, 28, 28)\n",
|
|
"IMG_SIZE = 1\n",
|
|
"for x in IMG_SHAPE:\n",
|
|
" IMG_SIZE *= x\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"##########################\n",
|
|
"### MNIST DATASET\n",
|
|
"##########################\n",
|
|
"\n",
|
|
"# Note transforms.ToTensor() scales input images\n",
|
|
"# to 0-1 range\n",
|
|
"train_dataset = datasets.MNIST(root='data', \n",
|
|
" train=True, \n",
|
|
" transform=transforms.ToTensor(),\n",
|
|
" download=True)\n",
|
|
"\n",
|
|
"test_dataset = datasets.MNIST(root='data', \n",
|
|
" train=False, \n",
|
|
" transform=transforms.ToTensor())\n",
|
|
"\n",
|
|
"\n",
|
|
"train_loader = DataLoader(dataset=train_dataset, \n",
|
|
" batch_size=BATCH_SIZE,\n",
|
|
" num_workers=4,\n",
|
|
" shuffle=True)\n",
|
|
"\n",
|
|
"test_loader = DataLoader(dataset=test_dataset, \n",
|
|
" batch_size=BATCH_SIZE,\n",
|
|
" num_workers=4,\n",
|
|
" shuffle=False)\n",
|
|
"\n",
|
|
"# Checking the dataset\n",
|
|
"for images, labels in train_loader: \n",
|
|
" print('Image batch dimensions:', images.shape)\n",
|
|
" print('Image label dimensions:', labels.shape)\n",
|
|
" break"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Model"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"##########################\n",
|
|
"### MODEL\n",
|
|
"##########################\n",
|
|
"\n",
|
|
"class Flatten(nn.Module):\n",
|
|
" def forward(self, input):\n",
|
|
" return input.view(input.size(0), -1)\n",
|
|
" \n",
|
|
"class Reshape1(nn.Module):\n",
|
|
" def forward(self, input):\n",
|
|
" return input.view(input.size(0), 64, 7, 7)\n",
|
|
"\n",
|
|
"\n",
|
|
"class GAN(torch.nn.Module):\n",
|
|
"\n",
|
|
" def __init__(self):\n",
|
|
" super(GAN, self).__init__()\n",
|
|
" \n",
|
|
" \n",
|
|
" self.generator = nn.Sequential(\n",
|
|
" \n",
|
|
" nn.Linear(LATENT_DIM, 3136, bias=False),\n",
|
|
" nn.BatchNorm1d(num_features=3136),\n",
|
|
" nn.LeakyReLU(inplace=True, negative_slope=0.0001),\n",
|
|
" Reshape1(),\n",
|
|
" \n",
|
|
" nn.ConvTranspose2d(in_channels=64, out_channels=32, kernel_size=(3, 3), stride=(2, 2), padding=1, bias=False),\n",
|
|
" nn.BatchNorm2d(num_features=32),\n",
|
|
" nn.LeakyReLU(inplace=True, negative_slope=0.0001),\n",
|
|
" #nn.Dropout2d(p=0.2),\n",
|
|
" \n",
|
|
" nn.ConvTranspose2d(in_channels=32, out_channels=16, kernel_size=(3, 3), stride=(2, 2), padding=1, bias=False),\n",
|
|
" nn.BatchNorm2d(num_features=16),\n",
|
|
" nn.LeakyReLU(inplace=True, negative_slope=0.0001),\n",
|
|
" #nn.Dropout2d(p=0.2),\n",
|
|
" \n",
|
|
" nn.ConvTranspose2d(in_channels=16, out_channels=8, kernel_size=(3, 3), stride=(1, 1), padding=0, bias=False),\n",
|
|
" nn.BatchNorm2d(num_features=8),\n",
|
|
" nn.LeakyReLU(inplace=True, negative_slope=0.0001),\n",
|
|
" #nn.Dropout2d(p=0.2),\n",
|
|
" \n",
|
|
" nn.ConvTranspose2d(in_channels=8, out_channels=1, kernel_size=(2, 2), stride=(1, 1), padding=0, bias=False),\n",
|
|
" nn.Tanh()\n",
|
|
" )\n",
|
|
" \n",
|
|
" self.discriminator = nn.Sequential(\n",
|
|
" nn.Conv2d(in_channels=1, out_channels=8, padding=1, kernel_size=(3, 3), stride=(2, 2), bias=False),\n",
|
|
" nn.BatchNorm2d(num_features=8),\n",
|
|
" nn.LeakyReLU(inplace=True, negative_slope=0.0001), \n",
|
|
" #nn.Dropout2d(p=0.2),\n",
|
|
" \n",
|
|
" nn.Conv2d(in_channels=8, out_channels=32, padding=1, kernel_size=(3, 3), stride=(2, 2), bias=False),\n",
|
|
" nn.BatchNorm2d(num_features=32),\n",
|
|
" nn.LeakyReLU(inplace=True, negative_slope=0.0001), \n",
|
|
" #nn.Dropout2d(p=0.2),\n",
|
|
" \n",
|
|
" Flatten(),\n",
|
|
"\n",
|
|
" nn.Linear(7*7*32, 1),\n",
|
|
" #nn.Sigmoid()\n",
|
|
" )\n",
|
|
"\n",
|
|
" \n",
|
|
" def generator_forward(self, z):\n",
|
|
" img = self.generator(z)\n",
|
|
" return img\n",
|
|
" \n",
|
|
" def discriminator_forward(self, img):\n",
|
|
" pred = model.discriminator(img)\n",
|
|
" return pred.view(-1)\n",
|
|
"\n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"GAN(\n",
|
|
" (generator): Sequential(\n",
|
|
" (0): Linear(in_features=100, out_features=3136, bias=False)\n",
|
|
" (1): BatchNorm1d(3136, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
|
" (2): LeakyReLU(negative_slope=0.0001, inplace=True)\n",
|
|
" (3): Reshape1()\n",
|
|
" (4): ConvTranspose2d(64, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
|
|
" (5): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
|
" (6): LeakyReLU(negative_slope=0.0001, inplace=True)\n",
|
|
" (7): ConvTranspose2d(32, 16, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
|
|
" (8): BatchNorm2d(16, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
|
" (9): LeakyReLU(negative_slope=0.0001, inplace=True)\n",
|
|
" (10): ConvTranspose2d(16, 8, kernel_size=(3, 3), stride=(1, 1), bias=False)\n",
|
|
" (11): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
|
" (12): LeakyReLU(negative_slope=0.0001, inplace=True)\n",
|
|
" (13): ConvTranspose2d(8, 1, kernel_size=(2, 2), stride=(1, 1), bias=False)\n",
|
|
" (14): Tanh()\n",
|
|
" )\n",
|
|
" (discriminator): Sequential(\n",
|
|
" (0): Conv2d(1, 8, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
|
|
" (1): BatchNorm2d(8, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
|
" (2): LeakyReLU(negative_slope=0.0001, inplace=True)\n",
|
|
" (3): Conv2d(8, 32, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)\n",
|
|
" (4): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n",
|
|
" (5): LeakyReLU(negative_slope=0.0001, inplace=True)\n",
|
|
" (6): Flatten()\n",
|
|
" (7): Linear(in_features=1568, out_features=1, bias=True)\n",
|
|
" )\n",
|
|
")\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"torch.manual_seed(random_seed)\n",
|
|
"\n",
|
|
"#del model\n",
|
|
"model = GAN()\n",
|
|
"model = model.to(device)\n",
|
|
"\n",
|
|
"print(model)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'\\noutputs = []\\ndef hook(module, input, output):\\n outputs.append(output)\\n\\n#for i, layer in enumerate(model.discriminator):\\n# if isinstance(layer, torch.nn.modules.conv.Conv2d):\\n# model.discriminator[i].register_forward_hook(hook)\\n\\nfor i, layer in enumerate(model.generator):\\n if isinstance(layer, torch.nn.modules.ConvTranspose2d):\\n model.generator[i].register_forward_hook(hook)\\n'"
|
|
]
|
|
},
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"### ## FOR DEBUGGING\n",
|
|
"\n",
|
|
"\"\"\"\n",
|
|
"outputs = []\n",
|
|
"def hook(module, input, output):\n",
|
|
" outputs.append(output)\n",
|
|
"\n",
|
|
"#for i, layer in enumerate(model.discriminator):\n",
|
|
"# if isinstance(layer, torch.nn.modules.conv.Conv2d):\n",
|
|
"# model.discriminator[i].register_forward_hook(hook)\n",
|
|
"\n",
|
|
"for i, layer in enumerate(model.generator):\n",
|
|
" if isinstance(layer, torch.nn.modules.ConvTranspose2d):\n",
|
|
" model.generator[i].register_forward_hook(hook)\n",
|
|
"\"\"\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"optim_gener = torch.optim.Adam(model.generator.parameters(), lr=generator_learning_rate)\n",
|
|
"optim_discr = torch.optim.Adam(model.discriminator.parameters(), lr=discriminator_learning_rate)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Training"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Epoch: 001/100 | Batch 000/469 | Gen/Dis Loss: 0.5320/0.7922\n",
|
|
"Epoch: 001/100 | Batch 100/469 | Gen/Dis Loss: 1.4870/0.3290\n",
|
|
"Epoch: 001/100 | Batch 200/469 | Gen/Dis Loss: 1.6836/0.2914\n",
|
|
"Epoch: 001/100 | Batch 300/469 | Gen/Dis Loss: 1.6206/0.3252\n",
|
|
"Epoch: 001/100 | Batch 400/469 | Gen/Dis Loss: 1.3477/0.3873\n",
|
|
"Time elapsed: 0.10 min\n",
|
|
"Epoch: 002/100 | Batch 000/469 | Gen/Dis Loss: 1.1881/0.4570\n",
|
|
"Epoch: 002/100 | Batch 100/469 | Gen/Dis Loss: 1.0543/0.5261\n",
|
|
"Epoch: 002/100 | Batch 200/469 | Gen/Dis Loss: 1.0355/0.5480\n",
|
|
"Epoch: 002/100 | Batch 300/469 | Gen/Dis Loss: 1.0210/0.5513\n",
|
|
"Epoch: 002/100 | Batch 400/469 | Gen/Dis Loss: 1.0446/0.5411\n",
|
|
"Time elapsed: 0.20 min\n",
|
|
"Epoch: 003/100 | Batch 000/469 | Gen/Dis Loss: 0.9950/0.5798\n",
|
|
"Epoch: 003/100 | Batch 100/469 | Gen/Dis Loss: 1.0264/0.5392\n",
|
|
"Epoch: 003/100 | Batch 200/469 | Gen/Dis Loss: 1.0358/0.5289\n",
|
|
"Epoch: 003/100 | Batch 300/469 | Gen/Dis Loss: 1.0154/0.5382\n",
|
|
"Epoch: 003/100 | Batch 400/469 | Gen/Dis Loss: 1.0329/0.5386\n",
|
|
"Time elapsed: 0.30 min\n",
|
|
"Epoch: 004/100 | Batch 000/469 | Gen/Dis Loss: 0.9942/0.5350\n",
|
|
"Epoch: 004/100 | Batch 100/469 | Gen/Dis Loss: 0.9935/0.5596\n",
|
|
"Epoch: 004/100 | Batch 200/469 | Gen/Dis Loss: 1.0723/0.5326\n",
|
|
"Epoch: 004/100 | Batch 300/469 | Gen/Dis Loss: 0.9673/0.5343\n",
|
|
"Epoch: 004/100 | Batch 400/469 | Gen/Dis Loss: 0.9634/0.5457\n",
|
|
"Time elapsed: 0.46 min\n",
|
|
"Epoch: 005/100 | Batch 000/469 | Gen/Dis Loss: 0.9763/0.5381\n",
|
|
"Epoch: 005/100 | Batch 100/469 | Gen/Dis Loss: 1.0243/0.5313\n",
|
|
"Epoch: 005/100 | Batch 200/469 | Gen/Dis Loss: 1.1074/0.4962\n",
|
|
"Epoch: 005/100 | Batch 300/469 | Gen/Dis Loss: 1.0888/0.5450\n",
|
|
"Epoch: 005/100 | Batch 400/469 | Gen/Dis Loss: 1.0268/0.5335\n",
|
|
"Time elapsed: 0.67 min\n",
|
|
"Epoch: 006/100 | Batch 000/469 | Gen/Dis Loss: 1.0481/0.5334\n",
|
|
"Epoch: 006/100 | Batch 100/469 | Gen/Dis Loss: 1.0659/0.5359\n",
|
|
"Epoch: 006/100 | Batch 200/469 | Gen/Dis Loss: 1.0606/0.5353\n",
|
|
"Epoch: 006/100 | Batch 300/469 | Gen/Dis Loss: 1.0148/0.5581\n",
|
|
"Epoch: 006/100 | Batch 400/469 | Gen/Dis Loss: 1.0480/0.5270\n",
|
|
"Time elapsed: 0.87 min\n",
|
|
"Epoch: 007/100 | Batch 000/469 | Gen/Dis Loss: 1.1187/0.5311\n",
|
|
"Epoch: 007/100 | Batch 100/469 | Gen/Dis Loss: 1.0766/0.5436\n",
|
|
"Epoch: 007/100 | Batch 200/469 | Gen/Dis Loss: 1.0922/0.5150\n",
|
|
"Epoch: 007/100 | Batch 300/469 | Gen/Dis Loss: 1.0813/0.5352\n",
|
|
"Epoch: 007/100 | Batch 400/469 | Gen/Dis Loss: 1.0612/0.5482\n",
|
|
"Time elapsed: 1.06 min\n",
|
|
"Epoch: 008/100 | Batch 000/469 | Gen/Dis Loss: 1.1072/0.5301\n",
|
|
"Epoch: 008/100 | Batch 100/469 | Gen/Dis Loss: 1.0544/0.5223\n",
|
|
"Epoch: 008/100 | Batch 200/469 | Gen/Dis Loss: 1.1581/0.4927\n",
|
|
"Epoch: 008/100 | Batch 300/469 | Gen/Dis Loss: 1.0709/0.5446\n",
|
|
"Epoch: 008/100 | Batch 400/469 | Gen/Dis Loss: 1.0505/0.5157\n",
|
|
"Time elapsed: 1.25 min\n",
|
|
"Epoch: 009/100 | Batch 000/469 | Gen/Dis Loss: 1.0234/0.5477\n",
|
|
"Epoch: 009/100 | Batch 100/469 | Gen/Dis Loss: 1.0853/0.5574\n",
|
|
"Epoch: 009/100 | Batch 200/469 | Gen/Dis Loss: 1.0813/0.5295\n",
|
|
"Epoch: 009/100 | Batch 300/469 | Gen/Dis Loss: 1.1477/0.5230\n",
|
|
"Epoch: 009/100 | Batch 400/469 | Gen/Dis Loss: 1.0494/0.5382\n",
|
|
"Time elapsed: 1.46 min\n",
|
|
"Epoch: 010/100 | Batch 000/469 | Gen/Dis Loss: 1.0925/0.5289\n",
|
|
"Epoch: 010/100 | Batch 100/469 | Gen/Dis Loss: 1.1235/0.5244\n",
|
|
"Epoch: 010/100 | Batch 200/469 | Gen/Dis Loss: 0.9995/0.5589\n",
|
|
"Epoch: 010/100 | Batch 300/469 | Gen/Dis Loss: 1.1845/0.5210\n",
|
|
"Epoch: 010/100 | Batch 400/469 | Gen/Dis Loss: 1.0900/0.5516\n",
|
|
"Time elapsed: 1.65 min\n",
|
|
"Epoch: 011/100 | Batch 000/469 | Gen/Dis Loss: 1.0603/0.5348\n",
|
|
"Epoch: 011/100 | Batch 100/469 | Gen/Dis Loss: 1.0729/0.5681\n",
|
|
"Epoch: 011/100 | Batch 200/469 | Gen/Dis Loss: 1.0606/0.5342\n",
|
|
"Epoch: 011/100 | Batch 300/469 | Gen/Dis Loss: 1.1485/0.5209\n",
|
|
"Epoch: 011/100 | Batch 400/469 | Gen/Dis Loss: 1.0348/0.5702\n",
|
|
"Time elapsed: 1.84 min\n",
|
|
"Epoch: 012/100 | Batch 000/469 | Gen/Dis Loss: 1.0810/0.5220\n",
|
|
"Epoch: 012/100 | Batch 100/469 | Gen/Dis Loss: 1.1326/0.5712\n",
|
|
"Epoch: 012/100 | Batch 200/469 | Gen/Dis Loss: 1.0990/0.5533\n",
|
|
"Epoch: 012/100 | Batch 300/469 | Gen/Dis Loss: 1.0621/0.5568\n",
|
|
"Epoch: 012/100 | Batch 400/469 | Gen/Dis Loss: 1.1725/0.5415\n",
|
|
"Time elapsed: 2.03 min\n",
|
|
"Epoch: 013/100 | Batch 000/469 | Gen/Dis Loss: 1.1411/0.5407\n",
|
|
"Epoch: 013/100 | Batch 100/469 | Gen/Dis Loss: 1.0399/0.5808\n",
|
|
"Epoch: 013/100 | Batch 200/469 | Gen/Dis Loss: 1.0423/0.5356\n",
|
|
"Epoch: 013/100 | Batch 300/469 | Gen/Dis Loss: 1.1102/0.5274\n",
|
|
"Epoch: 013/100 | Batch 400/469 | Gen/Dis Loss: 1.0668/0.5330\n",
|
|
"Time elapsed: 2.22 min\n",
|
|
"Epoch: 014/100 | Batch 000/469 | Gen/Dis Loss: 1.0714/0.5416\n",
|
|
"Epoch: 014/100 | Batch 100/469 | Gen/Dis Loss: 1.0760/0.5599\n",
|
|
"Epoch: 014/100 | Batch 200/469 | Gen/Dis Loss: 1.1349/0.5670\n",
|
|
"Epoch: 014/100 | Batch 300/469 | Gen/Dis Loss: 1.1845/0.5673\n",
|
|
"Epoch: 014/100 | Batch 400/469 | Gen/Dis Loss: 1.1341/0.5306\n",
|
|
"Time elapsed: 2.41 min\n",
|
|
"Epoch: 015/100 | Batch 000/469 | Gen/Dis Loss: 1.0499/0.6021\n",
|
|
"Epoch: 015/100 | Batch 100/469 | Gen/Dis Loss: 1.1554/0.5127\n",
|
|
"Epoch: 015/100 | Batch 200/469 | Gen/Dis Loss: 1.0708/0.5380\n",
|
|
"Epoch: 015/100 | Batch 300/469 | Gen/Dis Loss: 1.0891/0.5775\n",
|
|
"Epoch: 015/100 | Batch 400/469 | Gen/Dis Loss: 1.0872/0.5662\n",
|
|
"Time elapsed: 2.60 min\n",
|
|
"Epoch: 016/100 | Batch 000/469 | Gen/Dis Loss: 1.0491/0.5729\n",
|
|
"Epoch: 016/100 | Batch 100/469 | Gen/Dis Loss: 1.0154/0.5615\n",
|
|
"Epoch: 016/100 | Batch 200/469 | Gen/Dis Loss: 0.9762/0.5606\n",
|
|
"Epoch: 016/100 | Batch 300/469 | Gen/Dis Loss: 1.1872/0.5477\n",
|
|
"Epoch: 016/100 | Batch 400/469 | Gen/Dis Loss: 1.0967/0.5339\n",
|
|
"Time elapsed: 2.80 min\n",
|
|
"Epoch: 017/100 | Batch 000/469 | Gen/Dis Loss: 1.1712/0.5244\n",
|
|
"Epoch: 017/100 | Batch 100/469 | Gen/Dis Loss: 1.0325/0.5837\n",
|
|
"Epoch: 017/100 | Batch 200/469 | Gen/Dis Loss: 1.1879/0.5272\n",
|
|
"Epoch: 017/100 | Batch 300/469 | Gen/Dis Loss: 1.1488/0.5301\n",
|
|
"Epoch: 017/100 | Batch 400/469 | Gen/Dis Loss: 1.1142/0.5530\n",
|
|
"Time elapsed: 2.99 min\n",
|
|
"Epoch: 018/100 | Batch 000/469 | Gen/Dis Loss: 1.1366/0.5606\n",
|
|
"Epoch: 018/100 | Batch 100/469 | Gen/Dis Loss: 1.1510/0.5812\n",
|
|
"Epoch: 018/100 | Batch 200/469 | Gen/Dis Loss: 1.0945/0.5411\n",
|
|
"Epoch: 018/100 | Batch 300/469 | Gen/Dis Loss: 1.0829/0.5528\n",
|
|
"Epoch: 018/100 | Batch 400/469 | Gen/Dis Loss: 1.0869/0.5694\n",
|
|
"Time elapsed: 3.17 min\n",
|
|
"Epoch: 019/100 | Batch 000/469 | Gen/Dis Loss: 1.1290/0.5084\n",
|
|
"Epoch: 019/100 | Batch 100/469 | Gen/Dis Loss: 1.0626/0.5566\n",
|
|
"Epoch: 019/100 | Batch 200/469 | Gen/Dis Loss: 1.0842/0.5612\n",
|
|
"Epoch: 019/100 | Batch 300/469 | Gen/Dis Loss: 1.0065/0.5908\n",
|
|
"Epoch: 019/100 | Batch 400/469 | Gen/Dis Loss: 0.9998/0.5711\n",
|
|
"Time elapsed: 3.37 min\n",
|
|
"Epoch: 020/100 | Batch 000/469 | Gen/Dis Loss: 1.0631/0.5676\n",
|
|
"Epoch: 020/100 | Batch 100/469 | Gen/Dis Loss: 1.0952/0.6067\n",
|
|
"Epoch: 020/100 | Batch 200/469 | Gen/Dis Loss: 1.1171/0.5492\n",
|
|
"Epoch: 020/100 | Batch 300/469 | Gen/Dis Loss: 1.0411/0.5744\n",
|
|
"Epoch: 020/100 | Batch 400/469 | Gen/Dis Loss: 1.0759/0.5379\n",
|
|
"Time elapsed: 3.59 min\n",
|
|
"Epoch: 021/100 | Batch 000/469 | Gen/Dis Loss: 1.0226/0.5858\n",
|
|
"Epoch: 021/100 | Batch 100/469 | Gen/Dis Loss: 1.1105/0.5660\n",
|
|
"Epoch: 021/100 | Batch 200/469 | Gen/Dis Loss: 1.0240/0.6026\n",
|
|
"Epoch: 021/100 | Batch 300/469 | Gen/Dis Loss: 1.1665/0.5466\n",
|
|
"Epoch: 021/100 | Batch 400/469 | Gen/Dis Loss: 1.1050/0.6089\n",
|
|
"Time elapsed: 3.78 min\n",
|
|
"Epoch: 022/100 | Batch 000/469 | Gen/Dis Loss: 1.0061/0.5985\n",
|
|
"Epoch: 022/100 | Batch 100/469 | Gen/Dis Loss: 1.1183/0.5675\n",
|
|
"Epoch: 022/100 | Batch 200/469 | Gen/Dis Loss: 1.0606/0.5838\n",
|
|
"Epoch: 022/100 | Batch 300/469 | Gen/Dis Loss: 1.1386/0.6011\n",
|
|
"Epoch: 022/100 | Batch 400/469 | Gen/Dis Loss: 1.1208/0.5674\n",
|
|
"Time elapsed: 3.96 min\n",
|
|
"Epoch: 023/100 | Batch 000/469 | Gen/Dis Loss: 1.0082/0.5942\n",
|
|
"Epoch: 023/100 | Batch 100/469 | Gen/Dis Loss: 0.9857/0.5843\n",
|
|
"Epoch: 023/100 | Batch 200/469 | Gen/Dis Loss: 0.9313/0.6361\n",
|
|
"Epoch: 023/100 | Batch 300/469 | Gen/Dis Loss: 1.0739/0.5524\n",
|
|
"Epoch: 023/100 | Batch 400/469 | Gen/Dis Loss: 1.0840/0.5623\n",
|
|
"Time elapsed: 4.17 min\n",
|
|
"Epoch: 024/100 | Batch 000/469 | Gen/Dis Loss: 0.9677/0.5934\n",
|
|
"Epoch: 024/100 | Batch 100/469 | Gen/Dis Loss: 1.1458/0.5657\n",
|
|
"Epoch: 024/100 | Batch 200/469 | Gen/Dis Loss: 1.0225/0.5821\n",
|
|
"Epoch: 024/100 | Batch 300/469 | Gen/Dis Loss: 1.0983/0.5959\n",
|
|
"Epoch: 024/100 | Batch 400/469 | Gen/Dis Loss: 1.0693/0.5773\n",
|
|
"Time elapsed: 4.36 min\n",
|
|
"Epoch: 025/100 | Batch 000/469 | Gen/Dis Loss: 1.0839/0.6029\n",
|
|
"Epoch: 025/100 | Batch 100/469 | Gen/Dis Loss: 1.0004/0.6399\n",
|
|
"Epoch: 025/100 | Batch 200/469 | Gen/Dis Loss: 1.0044/0.5849\n",
|
|
"Epoch: 025/100 | Batch 300/469 | Gen/Dis Loss: 0.9312/0.6572\n",
|
|
"Epoch: 025/100 | Batch 400/469 | Gen/Dis Loss: 0.9938/0.5910\n",
|
|
"Time elapsed: 4.55 min\n",
|
|
"Epoch: 026/100 | Batch 000/469 | Gen/Dis Loss: 0.9641/0.5836\n",
|
|
"Epoch: 026/100 | Batch 100/469 | Gen/Dis Loss: 1.0659/0.5984\n",
|
|
"Epoch: 026/100 | Batch 200/469 | Gen/Dis Loss: 1.0551/0.5856\n",
|
|
"Epoch: 026/100 | Batch 300/469 | Gen/Dis Loss: 1.0279/0.5927\n",
|
|
"Epoch: 026/100 | Batch 400/469 | Gen/Dis Loss: 0.9705/0.6792\n",
|
|
"Time elapsed: 4.75 min\n",
|
|
"Epoch: 027/100 | Batch 000/469 | Gen/Dis Loss: 0.9604/0.6380\n",
|
|
"Epoch: 027/100 | Batch 100/469 | Gen/Dis Loss: 0.9590/0.6085\n",
|
|
"Epoch: 027/100 | Batch 200/469 | Gen/Dis Loss: 0.9089/0.6264\n",
|
|
"Epoch: 027/100 | Batch 300/469 | Gen/Dis Loss: 0.9990/0.5850\n",
|
|
"Epoch: 027/100 | Batch 400/469 | Gen/Dis Loss: 0.9640/0.6527\n",
|
|
"Time elapsed: 4.95 min\n",
|
|
"Epoch: 028/100 | Batch 000/469 | Gen/Dis Loss: 1.0161/0.6081\n",
|
|
"Epoch: 028/100 | Batch 100/469 | Gen/Dis Loss: 1.0219/0.6123\n",
|
|
"Epoch: 028/100 | Batch 200/469 | Gen/Dis Loss: 1.0578/0.6017\n",
|
|
"Epoch: 028/100 | Batch 300/469 | Gen/Dis Loss: 1.0244/0.6309\n",
|
|
"Epoch: 028/100 | Batch 400/469 | Gen/Dis Loss: 1.0143/0.6120\n",
|
|
"Time elapsed: 5.14 min\n",
|
|
"Epoch: 029/100 | Batch 000/469 | Gen/Dis Loss: 0.9761/0.5912\n",
|
|
"Epoch: 029/100 | Batch 100/469 | Gen/Dis Loss: 0.8794/0.6594\n",
|
|
"Epoch: 029/100 | Batch 200/469 | Gen/Dis Loss: 0.9777/0.6007\n",
|
|
"Epoch: 029/100 | Batch 300/469 | Gen/Dis Loss: 0.8981/0.6379\n",
|
|
"Epoch: 029/100 | Batch 400/469 | Gen/Dis Loss: 0.9711/0.6454\n",
|
|
"Time elapsed: 5.34 min\n",
|
|
"Epoch: 030/100 | Batch 000/469 | Gen/Dis Loss: 0.9695/0.6218\n",
|
|
"Epoch: 030/100 | Batch 100/469 | Gen/Dis Loss: 0.9793/0.6096\n",
|
|
"Epoch: 030/100 | Batch 200/469 | Gen/Dis Loss: 1.0565/0.6410\n",
|
|
"Epoch: 030/100 | Batch 300/469 | Gen/Dis Loss: 0.9631/0.6679\n",
|
|
"Epoch: 030/100 | Batch 400/469 | Gen/Dis Loss: 0.9781/0.6153\n",
|
|
"Time elapsed: 5.52 min\n",
|
|
"Epoch: 031/100 | Batch 000/469 | Gen/Dis Loss: 0.9347/0.5942\n",
|
|
"Epoch: 031/100 | Batch 100/469 | Gen/Dis Loss: 0.9340/0.5984\n",
|
|
"Epoch: 031/100 | Batch 200/469 | Gen/Dis Loss: 0.9283/0.6416\n",
|
|
"Epoch: 031/100 | Batch 300/469 | Gen/Dis Loss: 1.0474/0.6204\n",
|
|
"Epoch: 031/100 | Batch 400/469 | Gen/Dis Loss: 0.9788/0.6065\n",
|
|
"Time elapsed: 5.73 min\n",
|
|
"Epoch: 032/100 | Batch 000/469 | Gen/Dis Loss: 0.9352/0.6080\n",
|
|
"Epoch: 032/100 | Batch 100/469 | Gen/Dis Loss: 0.8874/0.6449\n",
|
|
"Epoch: 032/100 | Batch 200/469 | Gen/Dis Loss: 0.9189/0.6215\n",
|
|
"Epoch: 032/100 | Batch 300/469 | Gen/Dis Loss: 0.9705/0.6757\n",
|
|
"Epoch: 032/100 | Batch 400/469 | Gen/Dis Loss: 0.9382/0.6260\n",
|
|
"Time elapsed: 5.93 min\n",
|
|
"Epoch: 033/100 | Batch 000/469 | Gen/Dis Loss: 1.0194/0.6070\n",
|
|
"Epoch: 033/100 | Batch 100/469 | Gen/Dis Loss: 0.9278/0.5882\n",
|
|
"Epoch: 033/100 | Batch 200/469 | Gen/Dis Loss: 0.9658/0.5919\n",
|
|
"Epoch: 033/100 | Batch 300/469 | Gen/Dis Loss: 0.9989/0.6067\n",
|
|
"Epoch: 033/100 | Batch 400/469 | Gen/Dis Loss: 1.0065/0.6097\n",
|
|
"Time elapsed: 6.13 min\n",
|
|
"Epoch: 034/100 | Batch 000/469 | Gen/Dis Loss: 0.8918/0.6565\n",
|
|
"Epoch: 034/100 | Batch 100/469 | Gen/Dis Loss: 0.9476/0.6564\n",
|
|
"Epoch: 034/100 | Batch 200/469 | Gen/Dis Loss: 0.9889/0.6139\n",
|
|
"Epoch: 034/100 | Batch 300/469 | Gen/Dis Loss: 0.9204/0.6231\n",
|
|
"Epoch: 034/100 | Batch 400/469 | Gen/Dis Loss: 0.9453/0.6558\n",
|
|
"Time elapsed: 6.32 min\n",
|
|
"Epoch: 035/100 | Batch 000/469 | Gen/Dis Loss: 0.9531/0.6304\n",
|
|
"Epoch: 035/100 | Batch 100/469 | Gen/Dis Loss: 0.9402/0.6524\n",
|
|
"Epoch: 035/100 | Batch 200/469 | Gen/Dis Loss: 1.0085/0.6098\n",
|
|
"Epoch: 035/100 | Batch 300/469 | Gen/Dis Loss: 0.9529/0.6294\n",
|
|
"Epoch: 035/100 | Batch 400/469 | Gen/Dis Loss: 0.9086/0.6743\n",
|
|
"Time elapsed: 6.51 min\n",
|
|
"Epoch: 036/100 | Batch 000/469 | Gen/Dis Loss: 0.9465/0.6449\n",
|
|
"Epoch: 036/100 | Batch 100/469 | Gen/Dis Loss: 0.8743/0.6269\n",
|
|
"Epoch: 036/100 | Batch 200/469 | Gen/Dis Loss: 0.9682/0.6181\n",
|
|
"Epoch: 036/100 | Batch 300/469 | Gen/Dis Loss: 1.0213/0.6172\n",
|
|
"Epoch: 036/100 | Batch 400/469 | Gen/Dis Loss: 1.0728/0.5829\n",
|
|
"Time elapsed: 6.68 min\n",
|
|
"Epoch: 037/100 | Batch 000/469 | Gen/Dis Loss: 0.9110/0.6454\n",
|
|
"Epoch: 037/100 | Batch 100/469 | Gen/Dis Loss: 0.9418/0.6336\n",
|
|
"Epoch: 037/100 | Batch 200/469 | Gen/Dis Loss: 0.9703/0.6371\n",
|
|
"Epoch: 037/100 | Batch 300/469 | Gen/Dis Loss: 1.0006/0.6264\n",
|
|
"Epoch: 037/100 | Batch 400/469 | Gen/Dis Loss: 0.9831/0.6291\n",
|
|
"Time elapsed: 6.87 min\n",
|
|
"Epoch: 038/100 | Batch 000/469 | Gen/Dis Loss: 0.9877/0.6091\n",
|
|
"Epoch: 038/100 | Batch 100/469 | Gen/Dis Loss: 0.8961/0.6820\n",
|
|
"Epoch: 038/100 | Batch 200/469 | Gen/Dis Loss: 0.9768/0.6413\n",
|
|
"Epoch: 038/100 | Batch 300/469 | Gen/Dis Loss: 0.9086/0.6131\n",
|
|
"Epoch: 038/100 | Batch 400/469 | Gen/Dis Loss: 0.9212/0.6473\n",
|
|
"Time elapsed: 7.06 min\n",
|
|
"Epoch: 039/100 | Batch 000/469 | Gen/Dis Loss: 0.9597/0.6557\n",
|
|
"Epoch: 039/100 | Batch 100/469 | Gen/Dis Loss: 1.0108/0.6188\n",
|
|
"Epoch: 039/100 | Batch 200/469 | Gen/Dis Loss: 0.9724/0.6409\n",
|
|
"Epoch: 039/100 | Batch 300/469 | Gen/Dis Loss: 1.0631/0.6000\n",
|
|
"Epoch: 039/100 | Batch 400/469 | Gen/Dis Loss: 1.0164/0.6078\n",
|
|
"Time elapsed: 7.23 min\n",
|
|
"Epoch: 040/100 | Batch 000/469 | Gen/Dis Loss: 0.9027/0.6829\n",
|
|
"Epoch: 040/100 | Batch 100/469 | Gen/Dis Loss: 0.9385/0.6331\n",
|
|
"Epoch: 040/100 | Batch 200/469 | Gen/Dis Loss: 0.9257/0.6692\n",
|
|
"Epoch: 040/100 | Batch 300/469 | Gen/Dis Loss: 1.0278/0.6281\n",
|
|
"Epoch: 040/100 | Batch 400/469 | Gen/Dis Loss: 0.8908/0.6434\n",
|
|
"Time elapsed: 7.41 min\n",
|
|
"Epoch: 041/100 | Batch 000/469 | Gen/Dis Loss: 0.8392/0.6464\n",
|
|
"Epoch: 041/100 | Batch 100/469 | Gen/Dis Loss: 0.9264/0.6450\n",
|
|
"Epoch: 041/100 | Batch 200/469 | Gen/Dis Loss: 0.8712/0.6496\n",
|
|
"Epoch: 041/100 | Batch 300/469 | Gen/Dis Loss: 0.9087/0.6096\n",
|
|
"Epoch: 041/100 | Batch 400/469 | Gen/Dis Loss: 0.9793/0.6604\n",
|
|
"Time elapsed: 7.61 min\n",
|
|
"Epoch: 042/100 | Batch 000/469 | Gen/Dis Loss: 0.9750/0.6290\n",
|
|
"Epoch: 042/100 | Batch 100/469 | Gen/Dis Loss: 0.9613/0.6369\n",
|
|
"Epoch: 042/100 | Batch 200/469 | Gen/Dis Loss: 0.8647/0.6712\n",
|
|
"Epoch: 042/100 | Batch 300/469 | Gen/Dis Loss: 0.8525/0.6741\n",
|
|
"Epoch: 042/100 | Batch 400/469 | Gen/Dis Loss: 0.8626/0.6453\n",
|
|
"Time elapsed: 7.80 min\n",
|
|
"Epoch: 043/100 | Batch 000/469 | Gen/Dis Loss: 0.8535/0.6526\n",
|
|
"Epoch: 043/100 | Batch 100/469 | Gen/Dis Loss: 0.9141/0.6216\n",
|
|
"Epoch: 043/100 | Batch 200/469 | Gen/Dis Loss: 0.9024/0.6430\n",
|
|
"Epoch: 043/100 | Batch 300/469 | Gen/Dis Loss: 0.9806/0.6424\n",
|
|
"Epoch: 043/100 | Batch 400/469 | Gen/Dis Loss: 0.8825/0.6430\n",
|
|
"Time elapsed: 7.98 min\n",
|
|
"Epoch: 044/100 | Batch 000/469 | Gen/Dis Loss: 0.9506/0.6323\n",
|
|
"Epoch: 044/100 | Batch 100/469 | Gen/Dis Loss: 0.8813/0.6536\n",
|
|
"Epoch: 044/100 | Batch 200/469 | Gen/Dis Loss: 0.9125/0.6537\n",
|
|
"Epoch: 044/100 | Batch 300/469 | Gen/Dis Loss: 0.8490/0.6530\n",
|
|
"Epoch: 044/100 | Batch 400/469 | Gen/Dis Loss: 0.9261/0.6601\n",
|
|
"Time elapsed: 8.18 min\n",
|
|
"Epoch: 045/100 | Batch 000/469 | Gen/Dis Loss: 0.8833/0.6435\n",
|
|
"Epoch: 045/100 | Batch 100/469 | Gen/Dis Loss: 0.8944/0.6543\n",
|
|
"Epoch: 045/100 | Batch 200/469 | Gen/Dis Loss: 0.8968/0.6511\n",
|
|
"Epoch: 045/100 | Batch 300/469 | Gen/Dis Loss: 0.8690/0.6522\n",
|
|
"Epoch: 045/100 | Batch 400/469 | Gen/Dis Loss: 0.8871/0.6439\n",
|
|
"Time elapsed: 8.37 min\n",
|
|
"Epoch: 046/100 | Batch 000/469 | Gen/Dis Loss: 0.8794/0.6417\n",
|
|
"Epoch: 046/100 | Batch 100/469 | Gen/Dis Loss: 0.9484/0.6256\n",
|
|
"Epoch: 046/100 | Batch 200/469 | Gen/Dis Loss: 0.8949/0.6643\n",
|
|
"Epoch: 046/100 | Batch 300/469 | Gen/Dis Loss: 0.9169/0.6477\n",
|
|
"Epoch: 046/100 | Batch 400/469 | Gen/Dis Loss: 0.9111/0.6740\n",
|
|
"Time elapsed: 8.56 min\n",
|
|
"Epoch: 047/100 | Batch 000/469 | Gen/Dis Loss: 0.9315/0.6471\n",
|
|
"Epoch: 047/100 | Batch 100/469 | Gen/Dis Loss: 0.9397/0.6290\n",
|
|
"Epoch: 047/100 | Batch 200/469 | Gen/Dis Loss: 0.9085/0.6481\n",
|
|
"Epoch: 047/100 | Batch 300/469 | Gen/Dis Loss: 0.8705/0.6527\n",
|
|
"Epoch: 047/100 | Batch 400/469 | Gen/Dis Loss: 0.9047/0.6465\n",
|
|
"Time elapsed: 8.75 min\n",
|
|
"Epoch: 048/100 | Batch 000/469 | Gen/Dis Loss: 0.8974/0.6480\n",
|
|
"Epoch: 048/100 | Batch 100/469 | Gen/Dis Loss: 0.8152/0.6822\n",
|
|
"Epoch: 048/100 | Batch 200/469 | Gen/Dis Loss: 0.9224/0.6479\n",
|
|
"Epoch: 048/100 | Batch 300/469 | Gen/Dis Loss: 0.8793/0.6455\n",
|
|
"Epoch: 048/100 | Batch 400/469 | Gen/Dis Loss: 0.8849/0.6653\n",
|
|
"Time elapsed: 8.95 min\n",
|
|
"Epoch: 049/100 | Batch 000/469 | Gen/Dis Loss: 0.9057/0.6376\n",
|
|
"Epoch: 049/100 | Batch 100/469 | Gen/Dis Loss: 0.9147/0.6287\n",
|
|
"Epoch: 049/100 | Batch 200/469 | Gen/Dis Loss: 0.9788/0.6402\n",
|
|
"Epoch: 049/100 | Batch 300/469 | Gen/Dis Loss: 0.8769/0.6447\n",
|
|
"Epoch: 049/100 | Batch 400/469 | Gen/Dis Loss: 0.8975/0.6359\n",
|
|
"Time elapsed: 9.15 min\n",
|
|
"Epoch: 050/100 | Batch 000/469 | Gen/Dis Loss: 0.9455/0.6467\n",
|
|
"Epoch: 050/100 | Batch 100/469 | Gen/Dis Loss: 0.8935/0.6917\n",
|
|
"Epoch: 050/100 | Batch 200/469 | Gen/Dis Loss: 0.8943/0.6494\n",
|
|
"Epoch: 050/100 | Batch 300/469 | Gen/Dis Loss: 0.8874/0.6232\n",
|
|
"Epoch: 050/100 | Batch 400/469 | Gen/Dis Loss: 0.8918/0.6746\n",
|
|
"Time elapsed: 9.33 min\n",
|
|
"Epoch: 051/100 | Batch 000/469 | Gen/Dis Loss: 0.8766/0.6614\n",
|
|
"Epoch: 051/100 | Batch 100/469 | Gen/Dis Loss: 0.8982/0.6424\n",
|
|
"Epoch: 051/100 | Batch 200/469 | Gen/Dis Loss: 0.8892/0.6196\n",
|
|
"Epoch: 051/100 | Batch 300/469 | Gen/Dis Loss: 0.8533/0.6741\n",
|
|
"Epoch: 051/100 | Batch 400/469 | Gen/Dis Loss: 0.8637/0.6509\n",
|
|
"Time elapsed: 9.51 min\n",
|
|
"Epoch: 052/100 | Batch 000/469 | Gen/Dis Loss: 0.8511/0.6680\n",
|
|
"Epoch: 052/100 | Batch 100/469 | Gen/Dis Loss: 0.8697/0.6568\n",
|
|
"Epoch: 052/100 | Batch 200/469 | Gen/Dis Loss: 0.8437/0.6725\n",
|
|
"Epoch: 052/100 | Batch 300/469 | Gen/Dis Loss: 0.8739/0.6908\n",
|
|
"Epoch: 052/100 | Batch 400/469 | Gen/Dis Loss: 0.9267/0.6464\n",
|
|
"Time elapsed: 9.71 min\n",
|
|
"Epoch: 053/100 | Batch 000/469 | Gen/Dis Loss: 0.8242/0.6720\n",
|
|
"Epoch: 053/100 | Batch 100/469 | Gen/Dis Loss: 0.8904/0.6410\n",
|
|
"Epoch: 053/100 | Batch 200/469 | Gen/Dis Loss: 0.8620/0.6560\n",
|
|
"Epoch: 053/100 | Batch 300/469 | Gen/Dis Loss: 0.8165/0.6990\n",
|
|
"Epoch: 053/100 | Batch 400/469 | Gen/Dis Loss: 0.9925/0.6468\n",
|
|
"Time elapsed: 9.90 min\n",
|
|
"Epoch: 054/100 | Batch 000/469 | Gen/Dis Loss: 0.8690/0.6812\n",
|
|
"Epoch: 054/100 | Batch 100/469 | Gen/Dis Loss: 0.8796/0.6673\n",
|
|
"Epoch: 054/100 | Batch 200/469 | Gen/Dis Loss: 0.8629/0.6625\n",
|
|
"Epoch: 054/100 | Batch 300/469 | Gen/Dis Loss: 0.8851/0.6427\n",
|
|
"Epoch: 054/100 | Batch 400/469 | Gen/Dis Loss: 0.9085/0.6378\n",
|
|
"Time elapsed: 10.09 min\n",
|
|
"Epoch: 055/100 | Batch 000/469 | Gen/Dis Loss: 0.9116/0.6681\n",
|
|
"Epoch: 055/100 | Batch 100/469 | Gen/Dis Loss: 0.9058/0.6517\n",
|
|
"Epoch: 055/100 | Batch 200/469 | Gen/Dis Loss: 0.8960/0.6652\n",
|
|
"Epoch: 055/100 | Batch 300/469 | Gen/Dis Loss: 0.8504/0.6793\n",
|
|
"Epoch: 055/100 | Batch 400/469 | Gen/Dis Loss: 0.9018/0.6498\n",
|
|
"Time elapsed: 10.29 min\n",
|
|
"Epoch: 056/100 | Batch 000/469 | Gen/Dis Loss: 0.8087/0.6975\n",
|
|
"Epoch: 056/100 | Batch 100/469 | Gen/Dis Loss: 0.9034/0.6551\n",
|
|
"Epoch: 056/100 | Batch 200/469 | Gen/Dis Loss: 0.8600/0.6592\n",
|
|
"Epoch: 056/100 | Batch 300/469 | Gen/Dis Loss: 0.8801/0.6692\n",
|
|
"Epoch: 056/100 | Batch 400/469 | Gen/Dis Loss: 0.8501/0.6948\n",
|
|
"Time elapsed: 10.48 min\n",
|
|
"Epoch: 057/100 | Batch 000/469 | Gen/Dis Loss: 0.8765/0.6890\n",
|
|
"Epoch: 057/100 | Batch 100/469 | Gen/Dis Loss: 0.8667/0.6659\n",
|
|
"Epoch: 057/100 | Batch 200/469 | Gen/Dis Loss: 0.8265/0.6724\n",
|
|
"Epoch: 057/100 | Batch 300/469 | Gen/Dis Loss: 0.8454/0.6812\n",
|
|
"Epoch: 057/100 | Batch 400/469 | Gen/Dis Loss: 0.8842/0.6953\n",
|
|
"Time elapsed: 10.69 min\n",
|
|
"Epoch: 058/100 | Batch 000/469 | Gen/Dis Loss: 0.8508/0.6527\n",
|
|
"Epoch: 058/100 | Batch 100/469 | Gen/Dis Loss: 0.8790/0.6718\n",
|
|
"Epoch: 058/100 | Batch 200/469 | Gen/Dis Loss: 0.8515/0.6719\n",
|
|
"Epoch: 058/100 | Batch 300/469 | Gen/Dis Loss: 0.8757/0.6311\n",
|
|
"Epoch: 058/100 | Batch 400/469 | Gen/Dis Loss: 0.9075/0.6461\n",
|
|
"Time elapsed: 10.86 min\n",
|
|
"Epoch: 059/100 | Batch 000/469 | Gen/Dis Loss: 0.8903/0.6573\n",
|
|
"Epoch: 059/100 | Batch 100/469 | Gen/Dis Loss: 0.8772/0.6456\n",
|
|
"Epoch: 059/100 | Batch 200/469 | Gen/Dis Loss: 0.8487/0.6886\n",
|
|
"Epoch: 059/100 | Batch 300/469 | Gen/Dis Loss: 0.8758/0.6656\n",
|
|
"Epoch: 059/100 | Batch 400/469 | Gen/Dis Loss: 0.7832/0.7048\n",
|
|
"Time elapsed: 11.07 min\n",
|
|
"Epoch: 060/100 | Batch 000/469 | Gen/Dis Loss: 0.8813/0.6634\n",
|
|
"Epoch: 060/100 | Batch 100/469 | Gen/Dis Loss: 0.8211/0.6760\n",
|
|
"Epoch: 060/100 | Batch 200/469 | Gen/Dis Loss: 0.8294/0.6861\n",
|
|
"Epoch: 060/100 | Batch 300/469 | Gen/Dis Loss: 0.8535/0.6794\n",
|
|
"Epoch: 060/100 | Batch 400/469 | Gen/Dis Loss: 0.8986/0.6499\n",
|
|
"Time elapsed: 11.27 min\n",
|
|
"Epoch: 061/100 | Batch 000/469 | Gen/Dis Loss: 0.8992/0.6577\n",
|
|
"Epoch: 061/100 | Batch 100/469 | Gen/Dis Loss: 0.8802/0.6738\n",
|
|
"Epoch: 061/100 | Batch 200/469 | Gen/Dis Loss: 0.8823/0.6861\n",
|
|
"Epoch: 061/100 | Batch 300/469 | Gen/Dis Loss: 0.8590/0.6601\n",
|
|
"Epoch: 061/100 | Batch 400/469 | Gen/Dis Loss: 0.8702/0.6688\n",
|
|
"Time elapsed: 11.46 min\n",
|
|
"Epoch: 062/100 | Batch 000/469 | Gen/Dis Loss: 0.8650/0.6517\n",
|
|
"Epoch: 062/100 | Batch 100/469 | Gen/Dis Loss: 0.8796/0.6479\n",
|
|
"Epoch: 062/100 | Batch 200/469 | Gen/Dis Loss: 0.9608/0.6564\n",
|
|
"Epoch: 062/100 | Batch 300/469 | Gen/Dis Loss: 0.8365/0.6959\n",
|
|
"Epoch: 062/100 | Batch 400/469 | Gen/Dis Loss: 0.8407/0.6635\n",
|
|
"Time elapsed: 11.65 min\n",
|
|
"Epoch: 063/100 | Batch 000/469 | Gen/Dis Loss: 0.8371/0.6663\n",
|
|
"Epoch: 063/100 | Batch 100/469 | Gen/Dis Loss: 0.8306/0.6620\n",
|
|
"Epoch: 063/100 | Batch 200/469 | Gen/Dis Loss: 0.8949/0.6656\n",
|
|
"Epoch: 063/100 | Batch 300/469 | Gen/Dis Loss: 0.8633/0.6690\n",
|
|
"Epoch: 063/100 | Batch 400/469 | Gen/Dis Loss: 0.8143/0.6708\n",
|
|
"Time elapsed: 11.83 min\n",
|
|
"Epoch: 064/100 | Batch 000/469 | Gen/Dis Loss: 0.8591/0.6857\n",
|
|
"Epoch: 064/100 | Batch 100/469 | Gen/Dis Loss: 0.8329/0.6863\n",
|
|
"Epoch: 064/100 | Batch 200/469 | Gen/Dis Loss: 0.8904/0.6684\n",
|
|
"Epoch: 064/100 | Batch 300/469 | Gen/Dis Loss: 0.8345/0.6737\n",
|
|
"Epoch: 064/100 | Batch 400/469 | Gen/Dis Loss: 0.8772/0.6603\n",
|
|
"Time elapsed: 12.02 min\n",
|
|
"Epoch: 065/100 | Batch 000/469 | Gen/Dis Loss: 0.8387/0.6540\n",
|
|
"Epoch: 065/100 | Batch 100/469 | Gen/Dis Loss: 0.8358/0.6991\n",
|
|
"Epoch: 065/100 | Batch 200/469 | Gen/Dis Loss: 0.7720/0.7111\n",
|
|
"Epoch: 065/100 | Batch 300/469 | Gen/Dis Loss: 0.8285/0.6822\n",
|
|
"Epoch: 065/100 | Batch 400/469 | Gen/Dis Loss: 0.8025/0.6701\n",
|
|
"Time elapsed: 12.21 min\n",
|
|
"Epoch: 066/100 | Batch 000/469 | Gen/Dis Loss: 0.8651/0.6684\n",
|
|
"Epoch: 066/100 | Batch 100/469 | Gen/Dis Loss: 0.8062/0.6797\n",
|
|
"Epoch: 066/100 | Batch 200/469 | Gen/Dis Loss: 0.9133/0.6643\n",
|
|
"Epoch: 066/100 | Batch 300/469 | Gen/Dis Loss: 0.8128/0.6684\n",
|
|
"Epoch: 066/100 | Batch 400/469 | Gen/Dis Loss: 0.8464/0.6777\n",
|
|
"Time elapsed: 12.40 min\n",
|
|
"Epoch: 067/100 | Batch 000/469 | Gen/Dis Loss: 0.8408/0.6792\n",
|
|
"Epoch: 067/100 | Batch 100/469 | Gen/Dis Loss: 0.8878/0.6793\n",
|
|
"Epoch: 067/100 | Batch 200/469 | Gen/Dis Loss: 0.8082/0.6872\n",
|
|
"Epoch: 067/100 | Batch 300/469 | Gen/Dis Loss: 0.8299/0.6611\n",
|
|
"Epoch: 067/100 | Batch 400/469 | Gen/Dis Loss: 0.8407/0.6531\n",
|
|
"Time elapsed: 12.59 min\n",
|
|
"Epoch: 068/100 | Batch 000/469 | Gen/Dis Loss: 0.8564/0.6520\n",
|
|
"Epoch: 068/100 | Batch 100/469 | Gen/Dis Loss: 0.8364/0.6977\n",
|
|
"Epoch: 068/100 | Batch 200/469 | Gen/Dis Loss: 0.8073/0.6688\n",
|
|
"Epoch: 068/100 | Batch 300/469 | Gen/Dis Loss: 0.8770/0.6818\n",
|
|
"Epoch: 068/100 | Batch 400/469 | Gen/Dis Loss: 0.8454/0.6738\n",
|
|
"Time elapsed: 12.79 min\n",
|
|
"Epoch: 069/100 | Batch 000/469 | Gen/Dis Loss: 0.8455/0.6630\n",
|
|
"Epoch: 069/100 | Batch 100/469 | Gen/Dis Loss: 0.8016/0.6751\n",
|
|
"Epoch: 069/100 | Batch 200/469 | Gen/Dis Loss: 0.7976/0.6843\n",
|
|
"Epoch: 069/100 | Batch 300/469 | Gen/Dis Loss: 0.8515/0.6635\n",
|
|
"Epoch: 069/100 | Batch 400/469 | Gen/Dis Loss: 0.8309/0.6798\n",
|
|
"Time elapsed: 12.97 min\n",
|
|
"Epoch: 070/100 | Batch 000/469 | Gen/Dis Loss: 0.8545/0.6897\n",
|
|
"Epoch: 070/100 | Batch 100/469 | Gen/Dis Loss: 0.8726/0.6868\n",
|
|
"Epoch: 070/100 | Batch 200/469 | Gen/Dis Loss: 0.8559/0.6552\n",
|
|
"Epoch: 070/100 | Batch 300/469 | Gen/Dis Loss: 0.8333/0.6826\n",
|
|
"Epoch: 070/100 | Batch 400/469 | Gen/Dis Loss: 0.8670/0.6838\n",
|
|
"Time elapsed: 13.14 min\n",
|
|
"Epoch: 071/100 | Batch 000/469 | Gen/Dis Loss: 0.8459/0.6764\n",
|
|
"Epoch: 071/100 | Batch 100/469 | Gen/Dis Loss: 0.7693/0.6981\n",
|
|
"Epoch: 071/100 | Batch 200/469 | Gen/Dis Loss: 0.8273/0.6906\n",
|
|
"Epoch: 071/100 | Batch 300/469 | Gen/Dis Loss: 0.8965/0.6696\n",
|
|
"Epoch: 071/100 | Batch 400/469 | Gen/Dis Loss: 0.7930/0.6637\n",
|
|
"Time elapsed: 13.31 min\n",
|
|
"Epoch: 072/100 | Batch 000/469 | Gen/Dis Loss: 0.8628/0.6897\n",
|
|
"Epoch: 072/100 | Batch 100/469 | Gen/Dis Loss: 0.8148/0.7031\n",
|
|
"Epoch: 072/100 | Batch 200/469 | Gen/Dis Loss: 0.8407/0.6823\n",
|
|
"Epoch: 072/100 | Batch 300/469 | Gen/Dis Loss: 0.8590/0.6731\n",
|
|
"Epoch: 072/100 | Batch 400/469 | Gen/Dis Loss: 0.8184/0.6741\n",
|
|
"Time elapsed: 13.51 min\n",
|
|
"Epoch: 073/100 | Batch 000/469 | Gen/Dis Loss: 0.7666/0.6783\n",
|
|
"Epoch: 073/100 | Batch 100/469 | Gen/Dis Loss: 0.8279/0.6769\n",
|
|
"Epoch: 073/100 | Batch 200/469 | Gen/Dis Loss: 0.8110/0.6930\n",
|
|
"Epoch: 073/100 | Batch 300/469 | Gen/Dis Loss: 0.8663/0.6692\n",
|
|
"Epoch: 073/100 | Batch 400/469 | Gen/Dis Loss: 0.8638/0.6722\n",
|
|
"Time elapsed: 13.70 min\n",
|
|
"Epoch: 074/100 | Batch 000/469 | Gen/Dis Loss: 0.8186/0.6884\n",
|
|
"Epoch: 074/100 | Batch 100/469 | Gen/Dis Loss: 0.8437/0.6959\n",
|
|
"Epoch: 074/100 | Batch 200/469 | Gen/Dis Loss: 0.8497/0.6886\n",
|
|
"Epoch: 074/100 | Batch 300/469 | Gen/Dis Loss: 0.8581/0.6837\n",
|
|
"Epoch: 074/100 | Batch 400/469 | Gen/Dis Loss: 0.8172/0.6859\n",
|
|
"Time elapsed: 13.88 min\n",
|
|
"Epoch: 075/100 | Batch 000/469 | Gen/Dis Loss: 0.8053/0.6592\n",
|
|
"Epoch: 075/100 | Batch 100/469 | Gen/Dis Loss: 0.8656/0.6731\n",
|
|
"Epoch: 075/100 | Batch 200/469 | Gen/Dis Loss: 0.8292/0.6771\n",
|
|
"Epoch: 075/100 | Batch 300/469 | Gen/Dis Loss: 0.8372/0.6708\n",
|
|
"Epoch: 075/100 | Batch 400/469 | Gen/Dis Loss: 0.7856/0.7005\n",
|
|
"Time elapsed: 14.06 min\n",
|
|
"Epoch: 076/100 | Batch 000/469 | Gen/Dis Loss: 0.7723/0.6855\n",
|
|
"Epoch: 076/100 | Batch 100/469 | Gen/Dis Loss: 0.8779/0.6654\n",
|
|
"Epoch: 076/100 | Batch 200/469 | Gen/Dis Loss: 0.8270/0.6864\n",
|
|
"Epoch: 076/100 | Batch 300/469 | Gen/Dis Loss: 0.8166/0.6800\n",
|
|
"Epoch: 076/100 | Batch 400/469 | Gen/Dis Loss: 0.8451/0.6660\n",
|
|
"Time elapsed: 14.25 min\n",
|
|
"Epoch: 077/100 | Batch 000/469 | Gen/Dis Loss: 0.8800/0.6756\n",
|
|
"Epoch: 077/100 | Batch 100/469 | Gen/Dis Loss: 0.8517/0.6399\n",
|
|
"Epoch: 077/100 | Batch 200/469 | Gen/Dis Loss: 0.7910/0.6974\n",
|
|
"Epoch: 077/100 | Batch 300/469 | Gen/Dis Loss: 0.8447/0.7101\n",
|
|
"Epoch: 077/100 | Batch 400/469 | Gen/Dis Loss: 0.8225/0.7023\n",
|
|
"Time elapsed: 14.45 min\n",
|
|
"Epoch: 078/100 | Batch 000/469 | Gen/Dis Loss: 0.8520/0.6680\n",
|
|
"Epoch: 078/100 | Batch 100/469 | Gen/Dis Loss: 0.8277/0.6806\n",
|
|
"Epoch: 078/100 | Batch 200/469 | Gen/Dis Loss: 0.8407/0.6542\n",
|
|
"Epoch: 078/100 | Batch 300/469 | Gen/Dis Loss: 0.8216/0.6805\n",
|
|
"Epoch: 078/100 | Batch 400/469 | Gen/Dis Loss: 0.7893/0.6845\n",
|
|
"Time elapsed: 14.64 min\n",
|
|
"Epoch: 079/100 | Batch 000/469 | Gen/Dis Loss: 0.8530/0.6718\n",
|
|
"Epoch: 079/100 | Batch 100/469 | Gen/Dis Loss: 0.8236/0.6928\n",
|
|
"Epoch: 079/100 | Batch 200/469 | Gen/Dis Loss: 0.8575/0.6589\n",
|
|
"Epoch: 079/100 | Batch 300/469 | Gen/Dis Loss: 0.8002/0.6664\n",
|
|
"Epoch: 079/100 | Batch 400/469 | Gen/Dis Loss: 0.8154/0.6842\n",
|
|
"Time elapsed: 14.83 min\n",
|
|
"Epoch: 080/100 | Batch 000/469 | Gen/Dis Loss: 0.8235/0.6611\n",
|
|
"Epoch: 080/100 | Batch 100/469 | Gen/Dis Loss: 0.8061/0.6910\n",
|
|
"Epoch: 080/100 | Batch 200/469 | Gen/Dis Loss: 0.8549/0.6424\n",
|
|
"Epoch: 080/100 | Batch 300/469 | Gen/Dis Loss: 0.8395/0.6650\n",
|
|
"Epoch: 080/100 | Batch 400/469 | Gen/Dis Loss: 0.8219/0.6905\n",
|
|
"Time elapsed: 15.01 min\n",
|
|
"Epoch: 081/100 | Batch 000/469 | Gen/Dis Loss: 0.7948/0.7008\n",
|
|
"Epoch: 081/100 | Batch 100/469 | Gen/Dis Loss: 0.8199/0.6954\n",
|
|
"Epoch: 081/100 | Batch 200/469 | Gen/Dis Loss: 0.7884/0.6894\n",
|
|
"Epoch: 081/100 | Batch 300/469 | Gen/Dis Loss: 0.8397/0.6713\n",
|
|
"Epoch: 081/100 | Batch 400/469 | Gen/Dis Loss: 0.8352/0.6776\n",
|
|
"Time elapsed: 15.20 min\n",
|
|
"Epoch: 082/100 | Batch 000/469 | Gen/Dis Loss: 0.8150/0.6710\n",
|
|
"Epoch: 082/100 | Batch 100/469 | Gen/Dis Loss: 0.8771/0.6653\n",
|
|
"Epoch: 082/100 | Batch 200/469 | Gen/Dis Loss: 0.8921/0.6677\n",
|
|
"Epoch: 082/100 | Batch 300/469 | Gen/Dis Loss: 0.8528/0.6654\n",
|
|
"Epoch: 082/100 | Batch 400/469 | Gen/Dis Loss: 0.8173/0.6834\n",
|
|
"Time elapsed: 15.40 min\n",
|
|
"Epoch: 083/100 | Batch 000/469 | Gen/Dis Loss: 0.7978/0.6876\n",
|
|
"Epoch: 083/100 | Batch 100/469 | Gen/Dis Loss: 0.7637/0.6887\n",
|
|
"Epoch: 083/100 | Batch 200/469 | Gen/Dis Loss: 0.8266/0.6630\n",
|
|
"Epoch: 083/100 | Batch 300/469 | Gen/Dis Loss: 0.8486/0.6562\n",
|
|
"Epoch: 083/100 | Batch 400/469 | Gen/Dis Loss: 0.8664/0.6574\n",
|
|
"Time elapsed: 15.58 min\n",
|
|
"Epoch: 084/100 | Batch 000/469 | Gen/Dis Loss: 0.8384/0.6714\n",
|
|
"Epoch: 084/100 | Batch 100/469 | Gen/Dis Loss: 0.8248/0.6801\n",
|
|
"Epoch: 084/100 | Batch 200/469 | Gen/Dis Loss: 0.8184/0.6847\n",
|
|
"Epoch: 084/100 | Batch 300/469 | Gen/Dis Loss: 0.8493/0.6565\n",
|
|
"Epoch: 084/100 | Batch 400/469 | Gen/Dis Loss: 0.8411/0.6944\n",
|
|
"Time elapsed: 15.76 min\n",
|
|
"Epoch: 085/100 | Batch 000/469 | Gen/Dis Loss: 0.8351/0.6915\n",
|
|
"Epoch: 085/100 | Batch 100/469 | Gen/Dis Loss: 0.7990/0.6961\n",
|
|
"Epoch: 085/100 | Batch 200/469 | Gen/Dis Loss: 0.7945/0.6906\n",
|
|
"Epoch: 085/100 | Batch 300/469 | Gen/Dis Loss: 0.8430/0.6504\n",
|
|
"Epoch: 085/100 | Batch 400/469 | Gen/Dis Loss: 0.7981/0.6782\n",
|
|
"Time elapsed: 15.94 min\n",
|
|
"Epoch: 086/100 | Batch 000/469 | Gen/Dis Loss: 0.8331/0.6794\n",
|
|
"Epoch: 086/100 | Batch 100/469 | Gen/Dis Loss: 0.8097/0.6724\n",
|
|
"Epoch: 086/100 | Batch 200/469 | Gen/Dis Loss: 0.8284/0.6881\n",
|
|
"Epoch: 086/100 | Batch 300/469 | Gen/Dis Loss: 0.8113/0.6980\n",
|
|
"Epoch: 086/100 | Batch 400/469 | Gen/Dis Loss: 0.7919/0.6913\n",
|
|
"Time elapsed: 16.14 min\n",
|
|
"Epoch: 087/100 | Batch 000/469 | Gen/Dis Loss: 0.8008/0.7018\n",
|
|
"Epoch: 087/100 | Batch 100/469 | Gen/Dis Loss: 0.8206/0.7019\n",
|
|
"Epoch: 087/100 | Batch 200/469 | Gen/Dis Loss: 0.8046/0.6866\n",
|
|
"Epoch: 087/100 | Batch 300/469 | Gen/Dis Loss: 0.7627/0.6903\n",
|
|
"Epoch: 087/100 | Batch 400/469 | Gen/Dis Loss: 0.8056/0.6777\n",
|
|
"Time elapsed: 16.32 min\n",
|
|
"Epoch: 088/100 | Batch 000/469 | Gen/Dis Loss: 0.8370/0.6740\n",
|
|
"Epoch: 088/100 | Batch 100/469 | Gen/Dis Loss: 0.7858/0.6904\n",
|
|
"Epoch: 088/100 | Batch 200/469 | Gen/Dis Loss: 0.8060/0.6836\n",
|
|
"Epoch: 088/100 | Batch 300/469 | Gen/Dis Loss: 0.8020/0.6937\n",
|
|
"Epoch: 088/100 | Batch 400/469 | Gen/Dis Loss: 0.7650/0.6909\n",
|
|
"Time elapsed: 16.50 min\n",
|
|
"Epoch: 089/100 | Batch 000/469 | Gen/Dis Loss: 0.7933/0.6834\n",
|
|
"Epoch: 089/100 | Batch 100/469 | Gen/Dis Loss: 0.8216/0.6727\n",
|
|
"Epoch: 089/100 | Batch 200/469 | Gen/Dis Loss: 0.8293/0.6709\n",
|
|
"Epoch: 089/100 | Batch 300/469 | Gen/Dis Loss: 0.8014/0.6920\n",
|
|
"Epoch: 089/100 | Batch 400/469 | Gen/Dis Loss: 0.7817/0.6994\n",
|
|
"Time elapsed: 16.69 min\n",
|
|
"Epoch: 090/100 | Batch 000/469 | Gen/Dis Loss: 0.8630/0.6739\n",
|
|
"Epoch: 090/100 | Batch 100/469 | Gen/Dis Loss: 0.8315/0.6730\n",
|
|
"Epoch: 090/100 | Batch 200/469 | Gen/Dis Loss: 0.7934/0.6899\n",
|
|
"Epoch: 090/100 | Batch 300/469 | Gen/Dis Loss: 0.8192/0.6777\n",
|
|
"Epoch: 090/100 | Batch 400/469 | Gen/Dis Loss: 0.8106/0.7134\n",
|
|
"Time elapsed: 16.87 min\n",
|
|
"Epoch: 091/100 | Batch 000/469 | Gen/Dis Loss: 0.7778/0.6685\n",
|
|
"Epoch: 091/100 | Batch 100/469 | Gen/Dis Loss: 0.7780/0.6948\n",
|
|
"Epoch: 091/100 | Batch 200/469 | Gen/Dis Loss: 0.8179/0.6919\n",
|
|
"Epoch: 091/100 | Batch 300/469 | Gen/Dis Loss: 0.8324/0.6767\n",
|
|
"Epoch: 091/100 | Batch 400/469 | Gen/Dis Loss: 0.7972/0.6918\n",
|
|
"Time elapsed: 17.05 min\n",
|
|
"Epoch: 092/100 | Batch 000/469 | Gen/Dis Loss: 0.8004/0.6804\n",
|
|
"Epoch: 092/100 | Batch 100/469 | Gen/Dis Loss: 0.8496/0.6824\n",
|
|
"Epoch: 092/100 | Batch 200/469 | Gen/Dis Loss: 0.8352/0.6727\n",
|
|
"Epoch: 092/100 | Batch 300/469 | Gen/Dis Loss: 0.7924/0.6836\n",
|
|
"Epoch: 092/100 | Batch 400/469 | Gen/Dis Loss: 0.8173/0.6735\n",
|
|
"Time elapsed: 17.24 min\n",
|
|
"Epoch: 093/100 | Batch 000/469 | Gen/Dis Loss: 0.7848/0.7050\n",
|
|
"Epoch: 093/100 | Batch 100/469 | Gen/Dis Loss: 0.7997/0.6791\n",
|
|
"Epoch: 093/100 | Batch 200/469 | Gen/Dis Loss: 0.8102/0.6733\n",
|
|
"Epoch: 093/100 | Batch 300/469 | Gen/Dis Loss: 0.7786/0.7098\n",
|
|
"Epoch: 093/100 | Batch 400/469 | Gen/Dis Loss: 0.8201/0.6757\n",
|
|
"Time elapsed: 17.42 min\n",
|
|
"Epoch: 094/100 | Batch 000/469 | Gen/Dis Loss: 0.8135/0.6697\n",
|
|
"Epoch: 094/100 | Batch 100/469 | Gen/Dis Loss: 0.8209/0.6749\n",
|
|
"Epoch: 094/100 | Batch 200/469 | Gen/Dis Loss: 0.8009/0.6885\n",
|
|
"Epoch: 094/100 | Batch 300/469 | Gen/Dis Loss: 0.8136/0.6814\n",
|
|
"Epoch: 094/100 | Batch 400/469 | Gen/Dis Loss: 0.7999/0.6860\n",
|
|
"Time elapsed: 17.61 min\n",
|
|
"Epoch: 095/100 | Batch 000/469 | Gen/Dis Loss: 0.8331/0.6654\n",
|
|
"Epoch: 095/100 | Batch 100/469 | Gen/Dis Loss: 0.7905/0.6873\n",
|
|
"Epoch: 095/100 | Batch 200/469 | Gen/Dis Loss: 0.7920/0.6876\n",
|
|
"Epoch: 095/100 | Batch 300/469 | Gen/Dis Loss: 0.7752/0.6944\n",
|
|
"Epoch: 095/100 | Batch 400/469 | Gen/Dis Loss: 0.8004/0.6750\n",
|
|
"Time elapsed: 17.81 min\n",
|
|
"Epoch: 096/100 | Batch 000/469 | Gen/Dis Loss: 0.8572/0.6645\n",
|
|
"Epoch: 096/100 | Batch 100/469 | Gen/Dis Loss: 0.7788/0.7004\n",
|
|
"Epoch: 096/100 | Batch 200/469 | Gen/Dis Loss: 0.8079/0.7025\n",
|
|
"Epoch: 096/100 | Batch 300/469 | Gen/Dis Loss: 0.8139/0.6936\n",
|
|
"Epoch: 096/100 | Batch 400/469 | Gen/Dis Loss: 0.7975/0.6916\n",
|
|
"Time elapsed: 17.99 min\n",
|
|
"Epoch: 097/100 | Batch 000/469 | Gen/Dis Loss: 0.7780/0.7176\n",
|
|
"Epoch: 097/100 | Batch 100/469 | Gen/Dis Loss: 0.8270/0.6750\n",
|
|
"Epoch: 097/100 | Batch 200/469 | Gen/Dis Loss: 0.8101/0.6973\n",
|
|
"Epoch: 097/100 | Batch 300/469 | Gen/Dis Loss: 0.8122/0.6742\n",
|
|
"Epoch: 097/100 | Batch 400/469 | Gen/Dis Loss: 0.8158/0.6763\n",
|
|
"Time elapsed: 18.17 min\n",
|
|
"Epoch: 098/100 | Batch 000/469 | Gen/Dis Loss: 0.8231/0.6770\n",
|
|
"Epoch: 098/100 | Batch 100/469 | Gen/Dis Loss: 0.8054/0.6920\n",
|
|
"Epoch: 098/100 | Batch 200/469 | Gen/Dis Loss: 0.8291/0.6844\n",
|
|
"Epoch: 098/100 | Batch 300/469 | Gen/Dis Loss: 0.8211/0.6835\n",
|
|
"Epoch: 098/100 | Batch 400/469 | Gen/Dis Loss: 0.8166/0.6829\n",
|
|
"Time elapsed: 18.35 min\n",
|
|
"Epoch: 099/100 | Batch 000/469 | Gen/Dis Loss: 0.7991/0.7082\n",
|
|
"Epoch: 099/100 | Batch 100/469 | Gen/Dis Loss: 0.8127/0.6762\n",
|
|
"Epoch: 099/100 | Batch 200/469 | Gen/Dis Loss: 0.7681/0.6932\n",
|
|
"Epoch: 099/100 | Batch 300/469 | Gen/Dis Loss: 0.7964/0.6856\n",
|
|
"Epoch: 099/100 | Batch 400/469 | Gen/Dis Loss: 0.8375/0.6877\n",
|
|
"Time elapsed: 18.54 min\n",
|
|
"Epoch: 100/100 | Batch 000/469 | Gen/Dis Loss: 0.7788/0.6775\n",
|
|
"Epoch: 100/100 | Batch 100/469 | Gen/Dis Loss: 0.7719/0.6917\n",
|
|
"Epoch: 100/100 | Batch 200/469 | Gen/Dis Loss: 0.8062/0.6970\n",
|
|
"Epoch: 100/100 | Batch 300/469 | Gen/Dis Loss: 0.8263/0.6865\n",
|
|
"Epoch: 100/100 | Batch 400/469 | Gen/Dis Loss: 0.8079/0.6748\n",
|
|
"Time elapsed: 18.73 min\n",
|
|
"Total Training Time: 18.73 min\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"start_time = time.time() \n",
|
|
"\n",
|
|
"discr_costs = []\n",
|
|
"gener_costs = []\n",
|
|
"for epoch in range(NUM_EPOCHS):\n",
|
|
" model = model.train()\n",
|
|
" for batch_idx, (features, targets) in enumerate(train_loader):\n",
|
|
"\n",
|
|
" \n",
|
|
" # Normalize images to [-1, 1] range\n",
|
|
" features = (features - 0.5)*2.\n",
|
|
" features = features.view(-1, IMG_SIZE).to(device) \n",
|
|
"\n",
|
|
" targets = targets.to(device)\n",
|
|
"\n",
|
|
" valid = torch.ones(targets.size(0)).float().to(device)\n",
|
|
" fake = torch.zeros(targets.size(0)).float().to(device)\n",
|
|
" \n",
|
|
"\n",
|
|
" ### FORWARD AND BACK PROP\n",
|
|
" \n",
|
|
" \n",
|
|
" # --------------------------\n",
|
|
" # Train Generator\n",
|
|
" # --------------------------\n",
|
|
" \n",
|
|
" # Make new images\n",
|
|
" z = torch.zeros((targets.size(0), LATENT_DIM)).uniform_(-1.0, 1.0).to(device)\n",
|
|
" generated_features = model.generator_forward(z)\n",
|
|
" \n",
|
|
" # Loss for fooling the discriminator\n",
|
|
" discr_pred = model.discriminator_forward(generated_features.view(targets.size(0), 1, 28, 28))\n",
|
|
" \n",
|
|
" gener_loss = F.binary_cross_entropy_with_logits(discr_pred, valid*0.9)\n",
|
|
" \n",
|
|
" optim_gener.zero_grad()\n",
|
|
" gener_loss.backward()\n",
|
|
" optim_gener.step()\n",
|
|
" \n",
|
|
" # --------------------------\n",
|
|
" # Train Discriminator\n",
|
|
" # -------------------------- \n",
|
|
" \n",
|
|
" discr_pred_real = model.discriminator_forward(features.view(targets.size(0), 1, 28, 28))\n",
|
|
" real_loss = F.binary_cross_entropy_with_logits(discr_pred_real, valid*0.9)\n",
|
|
" \n",
|
|
" discr_pred_fake = model.discriminator_forward(generated_features.view(targets.size(0), 1, 28, 28).detach())\n",
|
|
" fake_loss = F.binary_cross_entropy_with_logits(discr_pred_fake, fake)\n",
|
|
" \n",
|
|
" discr_loss = 0.5*(real_loss + fake_loss)\n",
|
|
"\n",
|
|
" optim_discr.zero_grad()\n",
|
|
" discr_loss.backward()\n",
|
|
" optim_discr.step() \n",
|
|
" \n",
|
|
" discr_costs.append(discr_loss.item())\n",
|
|
" gener_costs.append(gener_loss.item())\n",
|
|
" \n",
|
|
" \n",
|
|
" ### LOGGING\n",
|
|
" if not batch_idx % 100:\n",
|
|
" print ('Epoch: %03d/%03d | Batch %03d/%03d | Gen/Dis Loss: %.4f/%.4f' \n",
|
|
" %(epoch+1, NUM_EPOCHS, batch_idx, \n",
|
|
" len(train_loader), gener_loss, discr_loss))\n",
|
|
"\n",
|
|
" print('Time elapsed: %.2f min' % ((time.time() - start_time)/60))\n",
|
|
" \n",
|
|
"print('Total Training Time: %.2f min' % ((time.time() - start_time)/60))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'\\nfor i in outputs:\\n print(i.size())\\n'"
|
|
]
|
|
},
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"### For Debugging\n",
|
|
"\n",
|
|
"\"\"\"\n",
|
|
"for i in outputs:\n",
|
|
" print(i.size())\n",
|
|
"\"\"\""
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Evaluation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"%matplotlib inline\n",
|
|
"import matplotlib.pyplot as plt"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAE2CAYAAABsoZXqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+17YcXAAAgAElEQVR4nOzdd3gU1frA8e9JDyEk9BYk9BoIUpUOCogF67WgCBbkqnAFL4oVLFex/VQERVTADiqoSFU60kF67xB6S0iA9PP7Y2ZbdtOzafN+nidPdmdmZ84uZN857T1Ka40QQgjr8inqAgghhChaEgiEEMLiJBAIIYTFSSAQQgiLk0AghBAWJ4FACCEszmuBQCk1WSl1Rim1PZP9YUqpP5RSW5RSO5RSg7xVFiGEEJnzZo1gKtAni/1PATu11i2BbsAHSqkAL5ZHCCGEB37eOrHWerlSKjKrQ4BQpZQCygIXgNTszuvj46ODg4MLpIxCCGEVV65c0Vprjzf/XgsEOTAemAWcAEKBe7XW6dm9KDg4mMuXL3u7bEIIUaoopa5mtq8oO4t7A5uBGkA0MF4pVc7TgUqpwUqpDUqpDamp2VYahBBC5EJRBoJBwExt2A8cAhp7OlBrPUlr3UZr3cbPrygrMUIIUfoUZSA4CvQEUEpVBRoBB4uwPEIIYUleu71WSv2IMRqoklIqBhgN+ANorScCbwBTlVLbAAU8r7U+563yCGFFKSkpxMTEkJiYWNRFEYUkKCiIiIgI/P39c/waVdLSUIeEhGjpLBYiZw4dOkRoaCgVK1bEGKAnSjOtNefPnyc+Pp46deq47FNKXdFah3h6ncwsFqIUS0xMlCBgIUopKlasmOsaoAQCIUo5CQLWkpd/b8sFggU7TnEmXtpLhRDCxlKBICk1jSe+3cgDX6wt6qIIYRmnT5/mgQceoG7durRu3ZrrrruOX3/9tcjKs3TpUlatWpXvc9xyyy0FVKKiZ6lAYOsXP3r+StEWRAiL0Fpz++2306VLFw4ePMjGjRuZNm0aMTExXr1uVhNP8xIISvtEVksFgnQzEiSnZZvJQghRABYvXkxAQABDhgyxb6tduzZDhw4FIC0tjZEjR9K2bVtatGjB559/Dhhf1t26dePuu++mcePG9O/fH9sIx40bN9K1a1dat25N7969OXnyJADdunXjxRdfpGvXrnz88cf88ccftG/fnlatWnHDDTdw+vRpDh8+zMSJE/nwww+Jjo5mxYoVHDlyhJ49e9KiRQt69uzJ0aNHARg4cCAjRoyge/fuPP/885m+xwsXLnD77bfTokULOnTowNatWwFYtmwZ0dHRREdH06pVK+Lj4zl58iRdunQhOjqa5s2bs2LFioL/0PPAUtN0528/VdRFEKLIvPbHDnaeuFSg52xaoxyjb22W6f4dO3Zw7bXXZrr/q6++IiwsjPXr15OUlETHjh3p1asXAJs2bWLHjh3UqFGDjh07snLlStq3b8/QoUP5/fffqVy5MtOnT+ell15i8uTJAMTGxrJs2TIALl68yJo1a1BK8eWXX/Luu+/ywQcfMGTIEMqWLct///tfAG699VYGDBjAww8/zOTJkxk2bBi//fYbAHv37mXhwoX4+vpm+h5Gjx5Nq1at+O2331i8eDEDBgxg8+bNvP/++0yYMIGOHTuSkJBAUFAQkyZNonfv3rz00kukpaVx5UrxaJ2wVCBISy9ZcyaEKG2eeuop/v77bwICAli/fj1//vknW7du5ZdffgEgLi6Offv2ERAQQLt27YiIiAAgOjqaw4cPEx4ezvbt27nxxhsBo0ZRvXp1+/nvvfde++OYmBjuvfdeTp48SXJystu4epvVq1czc+ZMAB566CGee+45+7577rknyyAA8PfffzNjxgwAevTowfnz54mLi6Njx46MGDGC/v37c+eddxIREUHbtm155JFHSElJ4fbbbyc6Ojq3H6FXWCoQ7CjguyEhSpKs7ty9pVmzZvYvSYAJEyZw7tw52rRpAxh9CJ988gm9e/d2ed3SpUsJDAy0P/f19SU1NRWtNc2aNWP16tUerxcS4pgvNXToUEaMGMFtt93G0qVLGTNmTI7K7Dz80vl8mfE0KVcpxahRo7j55puZO3cuHTp0YOHChXTp0oXly5czZ84cHnroIUaOHMmAAQNyVC5vslQfwY4TcUVdBCEspUePHiQmJvLZZ5/Ztzk3h/Tu3ZvPPvuMlJQUwGiKySpzQKNGjTh79qw9EKSkpLBjxw6Px8bFxVGzZk0Avv76a/v20NBQ4uPj7c+vv/56pk2bBsD3339Pp06dcvUeu3Tpwvfffw8YAaxSpUqUK1eOAwcOEBUVxfPPP0+bNm3YvXs3R44coUqVKjz++OM8+uij/PPPP7m6lrdYqkYgE2uEKFxKKX777TeGDx/Ou+++S+XKlQkJCeGdd94B4LHHHuPw4cNce+21aK2pXLmyvX3ek4CAAH755ReGDRtGXFwcqampPPPMMzRr5l7bGTNmDPfccw81a9akQ4cOHDp0CDD6BO6++25+//13PvnkE8aNG8cjjzzCe++9R+XKlZkyZUqu3uOYMWMYNGgQLVq0oEyZMvag89FHH7FkyRJ8fX1p2rQpN910E9OmTeO9997D39+fsmXL8s033+TqWt5iqVxD909aw+qD5wE4PPbmgiyWEMXSrl27aNKkSVEXQxQyT//ukmvI5GOpdyuEEDljqa9GH2kaEkIIN5YKBH4+EgiEECIjSwUCX6dAUNL6RoQQwlssFQiqlAuyP5a5ZUIIYbBUIAgLdizdFnOxeEztFkKIomapQODcQ3AyTtYkEKIw+Pr6Eh0dTbNmzWjZsiX/93//R3q6kfhxw4YNDBs2LN/XmDhxYq7H5F9//fV5vt7UqVM5ceJEnl8PxvyD999/P1/nKCjeXLx+MnALcEZr3TyTY7oBH2Esan9Oa93VW+UB11FDkndIiMIRHBzM5s2bAThz5gwPPPAAcXFxvPbaa7Rp08aebiKvUlNTXbKb5lR+1iSYOnUqzZs3p0aNGjl+TVpaWrZ5i4qKN2sEU4E+me1USoUDnwK3aa2bAfd4sSzmNR2PJRW1EIWvSpUqTJo0ifHjx6O1dlngxVPaZoB3332XqKgoWrZsyahRowD3lNPOd9fdunVj+PDhdOnShSZNmrB+/XruvPNOGjRowMsvv2wvS9myZYGsU16//vrrtG3blubNmzN48GC01vzyyy9s2LCB/v37Ex0dzdWrV1m0aBGtWrUiKiqKRx55hKSkJAAiIyN5/fXX6dSpEz///HOmn8vmzZvp0KEDLVq04I477uDixYsAjBs3jqZNm9KiRQvuu+++LD+n/PBajUBrvVwpFZnFIQ8AM7XWR83jz3irLDbOKSZSUiUQCIuZNwpObSvYc1aLgpvG5uoldevWJT09nTNnXP/kPaVtnjdvHr/99htr166lTJkyXLhwwX68c8rpjAnlAgICWL58OR9//DH9+vVj48aNVKhQgXr16jF8+HAqVqzocrynlNedOnXi6aef5tVXXwWMzKSzZ8/m7rvvZvz48bz//vu0adOGxMREBg4cyKJFi2jYsCEDBgzgs88+45lnngEgKCiIv//+O8vPZMCAAXzyySd07dqVV199lddee42PPvqIsWPHcujQIQIDA4mNjc30c8qvouwjaAiUV0otVUptVEplmoJPKTVYKbVBKbUhPysFNahS1v44JU2ahoQoKp6Gb9vSNo8bN47Y2Fj8/PxYuHAhgwYNokyZMgBUqFDBfrxzyumMbrvtNgCioqJo1qwZ1atXJzAwkLp163Ls2DG3420pr318fOwprwGWLFlC+/btiYqKYvHixR4T3O3Zs4c6derQsGFDAB5++GGWL1+eo3KCkRwvNjaWrl27ur2+RYsW9O/fn++++w4/P79MP6f8Ksqkc35Aa6AnEAysVkqt0VrvzXig1noSMAmMXEN5vWD5MgH2xzLJWFhOLu/cveXgwYP4+vpSpUoVdu3aZd/uKW2z1jrTZJFZpYi2pbD28fFxSWft4+PjcdlJTymvExMTefLJJ9mwYQO1atVizJgxJCa6DzLJbk5STlJZZ2bOnDksX76cWbNm8cYbb7Bjxw6Pn1Pjxo3zfA0o2hpBDDBfa31Za30OWA609OYFNY5/sIZVQ715KSGEB2fPnmXIkCE8/fTTbl/wntI29+rVi8mTJ9tTVzs3DXmb7Uu/UqVKJCQk2BfPAddU1o0bN+bw4cPs378fgG+//dZ+d58TYWFhlC9f3r5spe316enpHDt2jO7du/Puu+8SGxtLQkKCx88pv4qyRvA7MF4p5QcEAO2BD715QefAnZiS5s1LCSFMV69eJTo6mpSUFPz8/HjooYcYMWKE23Ge0jYHBgayefNm2rRpQ0BAAH379uWtt94qlHKHh4fz+OOPExUVRWRkJG3btrXvGzhwIEOGDCE4OJjVq1czZcoU7rnnHlJTU2nbtm2uRzF9/fXXDBkyhCtXrlC3bl2mTJlCWloaDz74IHFxcWitGT58OOHh4bzyyitun1N+eS0NtVLqR6AbUAk4DYzGGCaK1nqiecxIYBCQDnyptf4ou/PmJw31sr1neXjyOvtzSUUtSjtJQ21NuU1D7c1RQ/fn4Jj3gPe8VQYP1yusSwkhRIlhqZnFEgaEEMKdpQKBRAJhRVITtpa8/HtbKhBoiQTCYoKCgjh//rwEA4vQWnP+/PlcTzKz1OL18rcgrCYiIoKYmBjOnj1b1EURhSQoKIiIiIhcvUYCgRClmL+/P3Xq1CnqYohizmJNQ0IIITKyVCDYFhNb1EUQQohix1KBYNzi/UVdBCGEKHYsFQiEEEK4k0AghBAWJ4FACCEsTgKBEEJYnGUDwX1taxV1EYQQoliwbCCQyWVCCGGwbCBIk0gghBCAhQNBeroEAiGEAAsHAqkRCCGEwbqBQGoEQggBeDEQKKUmK6XOKKW2Z3NcW6VUmlLqbm+VJSM/H0W61AiEEALwbo1gKtAnqwOUUr7AO8ACL5bDja+PkhqBEEKYvBYItNbLgQvZHDYUmAGc8VY5PPHzUaSlF+YVhRCi+CqyPgKlVE3gDmBiDo4drJTaoJTakJqamu9rGzUCiQRCCAFF21n8EfC81jotuwO11pO01m201m38/PK/qJq/rw9p0jIkhBBA0S5V2QaYppQCqAT0VUqlaq1/8/aFfX2UzCMQQghTkQUCrbV9IVWl1FRgdmEEAbD1EUggEEII8GIgUEr9CHQDKimlYoDRgD+A1jrbfgFv8vVVMqFMCCFMXgsEWuv7c3HsQG+VwxM/Hx9pGhJCCJMlZxb7+kiNQAghbCwZCPyks1gIIewsGQikRiCEEA7WDQQyn0wIIQALBwJpGhJCCIMlA8Gmo7HsOR1f1MXI1jerDxM5ag5JqdlOvhZCiDyzZCAoKT5euA+A+MT851cSQojMSCAoxmyNV6pISyGEKO0kEBRj2hzZZOZjEkIIr5BAUIwVdo3gwNkE6Y8QwoIsHQiuJhfvL72cTnVIS9ekZBgPO27RPiJHzSE1h+NkL15OpucHy3hxZpYriwohSiFLB4Lzl5OKughuft0Uw0NfreV8QhJxV1MA8MmmaeiBL9bQ4KV5Lts+W3oAgOQcBoKEJKNDeu2h87ktshCihLN0IEgtZqvTLNt7luHTt7Bi3zlGzdxm3z5pxQF2nbyU6evWHspuRVAhhMicpQPBmfiirxFsi4kjctQcPl26n4cnr7Nvv5zkGDI6YckBbvp4Bcv2nrVvS0/XDJi8jiavzC/U8gohSh9LB4IXf92W/UFeNn/HSQDenb/HZbun/gHnQHE2IYnle89yNcVzP4cmb7UdScEkhPVYOhDsP5NQ1EXgarLnNvzs+i9sfQBCCJFflg4Ehe3N2TsZNWMrJ2Kv8vHCfZy5lMiKfWc9HnsqLtHj9shRczhzKdGl6cgTJdPQhBA5VJSL15cqm45epHpYMNXCguzbTl9KpGo5x/Mv/z4EwLT1xwD4cOHePF2r3VuLMt13JTmVD/7ca28y+mn9MVbsO8dXA9vm6Nwyd00I6/FajUApNVkpdUYp5XFgulKqv1Jqq/mzSinV0ltlKQx3fLqKru8tQWvNhCX7mbvtJO3fWsTvm48D2H/n1KU85he689NVfGUGHIAxf+xk0e4zOX699BEIYT3erBFMBcYD32Sy/xDQVWt9USl1EzAJaO/F8nhdUmo6m4/F8t4CR8fvhsMXSUvXjPhpS6GUYfcpz1lVtdb8vf8cnepXkpQVQggXXqsRaK2XA5kOcNdar9JaXzSfrgEivFWWwvTmnF0uz79dc6TQgsB7C3Znum/ET1t46Kt1/Lwxho5jF/Pm7J2FUiYhRPFXXDqLHwXmZXtUMXU+wTHCZ+ORi1kc6V0TlmQ+kujXTUbT1HO/bOV47FV7f4VNVk1XO09cIjlVlnQTorQq8kCglOqOEQiez+KYwUqpDUqpDampRZ+bPzk1nTPxiRyPvcrpS4kcOHu5qIuUJ8cuXOHi5WQA3v/Tc8f1idir9B23gtGzdhRm0YQQhahIRw0ppVoAXwI3aa0zTXKjtZ6E0YdASEhIkXdn/mfaJuZtP2V//tMT1xVhafKu87tLKBvox4rnunvcH3c1hQ1mDWfTUeO31prxi/dze6ua1KpQptDKKoTwniKrESilrgFmAg9prfM2jrKIOAeBki4hKZVWb/xlf3489ioHzxoT7e6YsJJhP25yOf547FU++Gsvg6auL9RyCiG8x5vDR38EVgONlFIxSqlHlVJDlFJDzENeBSoCnyqlNiulNnirLBkF+uXubZ+5lEjkqDlsPGL0fWccdPOvz1cXVNGKhfu/WENauubgOfcmL9vw0v1nEth96hJaa/p/uYbIUXMKuZRCiILitaYhrfX92ex/DHjMW9fPykMdart1lmZl1QGj1errVUdoXbsCCvKYyadkOH0piXovzs32uNG/7+BqShpbY+IKoVRCCG+x5Mzia2uXh1wEAlsCNx8FO07EkV6ao0AmtIZZW05QNTTQvk3SXwtROlgyEOR29my6OXLyt80n+G3ziYIvUAmw53S8W39Bfvyx5QSdG1QivExAgZ1TCJE3RT58tDhLTUtnxE+b2VcMspSWVIfPXSbdqQp1yycrePybDQz9cRNDMwSWtHTNE99uYMux2MIuphCWZslAkNMMCztOXGLmP8eZuExSPufF23N30e39pUxYst++bfvxS/y18zRgzFFwFnPxCgt2nHYLEEII77JkIOhYv1K2x1xNTqPfhJWFUJrSafr6o3y+/CAA6w577kuwYFeLEMWSpQJB9bAgOjeoRFiwf5bHLd1zhudmbC2kUpUe7f63kJ0njLWVn5/hWP0tJ2tDa61JNZuQjl64ku3x24/HMWNjTB5LKoRwZqnOYl8fReWygdkeN3CKTJbKizPxSfQdt4Kpg3K29oGtSrBkzxl+33Q8Vx3xt3zyNwB3tS4VuQqFKFKWCgQAGRfuunA5mQohjpErhzxMohK54ymQaq35eNE+l20Hz12WiWhCFAOWahryNGx00a7TRI6aQ31zAlVpmyVcHGg0E5cd5KOF+7I/OAfSrDiRQwgvslQgAPe1fEf+YvQFpKZrnv1pC/GJKUVRrFLvnfmZr5WQWyN+2lxg5xJCWKxpSGud5dDRGf9I56M3rDlYsDOQf7fopD4hvMVSNQKNWxeBKKa01sQnphA5ag53f7aqqIsjRKmWo0CglKqnlAo0H3dTSg1TSoV7t2gFT+ucTyYTRe/TpcZEvg1HLnLBXEAno72n4+1DVgHmbz9Frw+XST+CELmQ0xrBDCBNKVUf+AqoA/zgtVJ5iUa79RGI4qnOC3P5bKljRve1TmsmOOv14XL6jlthfz7ku43sPZ3A0j1ncnW9hKRUen6wlK0xkt5CWE9OA0G61joVuAP4SGs9HKjuvWJ5j9QISrYpKzPPGpuUmmZ/nNnSm5nZeOQiB85e5r0Fe1y2y1rNwgpy2lmcopS6H3gYuNXclvX03GIot1lHRfHy+bIDvD3P8+ij/83ZyRcrHEHC1+kWR2vNntPxLN1zljOXkoi5eIWFu05z8O2bAdh8LJa0dPcv/LnbTvLk9/+w4JkuNKoWWrBvRohiJKeBYBAwBPif1vqQUqoO8J33iuUdGqkRlGSZBQHAJQgA+Dr9Q9d5IfNFdnaeuMTtE1bSpHo5l+0JSak8+f0/gJHOIrtAkJCUShl/X3x85D+YKHly1DSktd6ptR6mtf5RKVUeCNVaj/Vy2QpcerrGRyKBJWyJict2Tsj3a49wNiEJgF0njQ5nW16kF2Y6ciVlV5G8cDmZ5qMX8Mz0gpvfkJqWzjerD5OaJk1TwvtyOmpoqVKqnFKqArAFmKKU+j/vFq3gpWmNr9yxWcak5QcZNGVdpvtf+nU7OkN74eqD57mclMqCHafs27TWrDl4ng2HLxA5ag6ztzrmMRw4m8D//WX0K8zaUnDzG75efYRXf9/BN6uPFNg5hchMTpuGwrTWl5RSjwFTtNajlVJZpudUSk0GbgHOaK2be9ivgI+BvsAVYKDW+p/cFT93pEZgLZ8s3p/tMXO2nnTb1mz0ApfnGrhv0hr7869XHeaWFjUA6PnBMrfXa605duEq11Qsk8sSO8RdTXH5LYQ35XTUkJ9SqjrwL2B2Dl8zFeiTxf6bgAbmz2DgsxyeN8/SNRIIhIufc5LKOpeDDKasPEyX95aw/XgcYPQfJCSl5uoccVeMeRMp0jQkCkFOA8HrwALggNZ6vVKqLpBlBjGt9XIgq9wC/YBvtGENEG4GG69JS9f20SQBfpaaVC0K0PrDFzl07jIxF93XTbh4OZkNR4z/9v/9eQsAzUcvoHmGWgYYQ2EjR83xGCS+NpuEZnuosQhR0HLaWfyz1rqF1vrf5vODWuu78nntmsAxp+cx5jY3SqnBSqkNSqkNqam5u7Nylq61fVRH+zoV8nweYS2eFinq/v5SOr2zxG17qzf+IsXscN59Kp4V+87a9607dIEnv99oX8N5ysrDAJyLT8r02lrWcROFIKedxRFKqV+VUmeUUqeVUjOUUvldEcRTG43H//Va60la6zZa6zZ+fnnPk5euHX0E5csEZHN07rWLNILL0B713faVL+M+7aJWheACL4Moeokpjolt09Y77nUembqeudtOkZBs3MzYVmLzUYr0dM2MjTHSFCSKRE7bR6YAs4AaGHftf5jb8iMGqOX0PALwalrJtHRtH1+e3XKVeTFlUFsWP9uVOpVC3PZ1blAZgECnJqkVz/Vg7J1RBV4OUbRW7Dtnf+zcJ2XLf+SrlMuCPP+Zvom6L87l2Z+30OCleZyKS3R7/Yjpm2n66nz79jOXElm133EdIfIjp4GgstZ6itY61fyZClTO57VnAQOUoQMQp7X2aoNouoZz5rjx1rXL5/r12fUrhAT6UbdyWfsQ1arlHMtiPn9TYwD6Rddg+cjuzH+mMwDVwoJyXQ5RcvzhNKT0qllT+Hr1YZdjNh11zW/U4e1F9se2MDJz03GuJDtqGreO/5sHvlxrf27rb0hL12w8YgxzPZaDtZ+FgJwPHz2nlHoQ+NF8fj9wPqsXKKV+BLoBlZRSMcBozLQUWuuJwFyMoaP7MYaPDspt4XPDFgCmrT/G2LtacGvLGlQJDXT5Y1r63268Pnsni3d7Tli2fGR3Tl9K5OKVZFLTNDXLB3PgbALT1x+jQ92K9uNujqrOrpPx/LtrPc5fTqJsoB9VygUxe2gnGlQtS6Cfb6blfLJbPZ7r05iTcVf5vz/38u9u9ejhYYiiKLnenb8n+4NMSimixjg6mh/7ej0paZrTl1z7Fcaas66TU9N59iejk3rVgXPcFRaBUkrmz4gs5TQQPAKMBz7EaMdfRTZf3Frr+7PZr4Gncnj9fEvKkDzM10dxff1K9uftIitwTYUyfNr/Whq/4qiCVwgJoHezqnRuUJlqYUFud/BNqpezjym38fP1YZRZAwhz6htoXjPMrVy2ThFfH0Vauubaa4yaSvWwYN67pyUnYq+6XMs2AzajLg0rs3zvWY/7RMmVcQ3thbtcb1ImLjtA72bV7P+/Vx04x+HzRk1g87E43py9C38/H/555cbCKbAokXIUCLTWR4HbnLcppZ4BPvJGobwhPZP89LOHdmL6+mO83q8ZSimCfIy79ZAAX/o0r86DHa6h1TW5b0bKrU71K/HBv1pSqWygy3ZbE3PVcoE8e2NDHvtmg8fXy/2eNY2dt9teGwBYdcBRUY9PTCE+KRWSYMGOU/RqWpUd5toNnm5KhHXlZ6nKEZSgQBDo77l9v3nNMLc/ivUv3UCgvw/lggo3wWrGIACuayzbQlm7yApsPHrRZfGVnMyT+2XIddw9cXV+iymKsa/+diTfc56D8MS3G+nf/hq+X3sUgMNjb2bf6Xi+WHGQt+9sIU1HFpefWVUl6n+OrV3+xb6Nsz22cmhgoQWB6IhwfBQ80bVulsc5p8QpF+zHTc2r5fpabSJl7oSV2YIAGDmSbvxwOT9tiGHzsYuAkRojs5qzs6Pnr/DKb9tdbkRmbz3BhCWZp/RIS9cuw2pF8ZKfGkGJmuliSy527MLVbI4sXOVDAux58T1xvtN3TpB2Y9OqLnd8OU2dEVmxjL0NWViXc46kuz5bTcf6FVm532hWujmqOr2bV+O2lq59Xx/+tZeygX78b+4uAO5uHUHLWsaKtU//sAmAp7q7z6EBGPnzFmZuOs7H90VzW8saKEn1UqxkWSNQSsUrpS55+InHmFNQYsReMZJ3TV9/LJsji69wcxJcRPky9IuuySanDkC/HFbtb2hS1StlEyWbLQgAzNl2kmE/biI9XdPj/aX0m7CSI+cv8/GiffYgAOSqOWnmpuMA/GfaZuq8MDfbZHr7Tsez73R8Lt9F/qSmpXM2i1nepVmWgUBrHaq1LufhJ1RrnZ/aRKELDTKKaxvNU1IEmU1ajauXo12dCnz+UGteMJu3yocEMPHB1h5f17lBJY/bZeEUkVN9x63g4LnLbDkWyxuzd7ntn77+GJGj5jDSzKnkLCUtnctJqSzfe5ajHmqg6w9llYYMbvxwOTd+uNz+fPepS1xNznnT0vK9Z4kavYCEpFSe+HaDy7YWfMwAACAASURBVAS+zLw5Zxdt/7eQuKspHDib4NL0VdpZJvOa7Z/Uz7dkfRGGlfHnpyeuY8IDrQDo3axalvMQbMY/cK3HVBf3tI5AKRh9a1MAvnmkXcEWWJQau0857sgX7jrttv/bNUZiPE8ZXBu8NI9moxcwYPI6ur7vnpMpPimFyFFzeOW37Uxff9Rtv83BswlsORZLn49WMPTHTTku+/t/7iE+KZX9ZxJYsMMoe3b9H3/tNI7bGhNLzw+W2deZsALrBALz/0DJCgOGdnUqEJpJ5/V1dStSMzyYYT0b2Le9eXtzwoL9efj6SLfjG1QN5dDbNzOoYx0Oj72ZLg3dJ4h/MaBNgZVdWMvV5DS3u29Pa4UPn27UIr5dc4TnZ2wjctQc+yzsWDMFN0Cfj1bQb8JKwAhGs7ac4FxCEuMX7+NKcior9p0lctQcJi47wMKdjmBlu6ZzBXjoNPdAciU5lbUHXefG2lJ8bDh8MYfvuuQrUc07+WHL4ljaOqnCyvizclQPAB7qUJsAPx8e7FAbMIajHh57c7bV4hn/vp6klDT7LOsbm1bNtFO5V9Oq/LnT/e5QCIAmTvmQcmvoj5uYvPKQS8qN5AxJ+IY51Qre/3MvlUONIde2uRRPda/HhCUH7H1mtnWnwViE6M1+yZQPcSScHDF9C/N3nOLmFtU5bk7ezKzeMHfbSTrUrUiFkJwnrNRac+pSItXDineCSesEAluNoHTFARdv3O62EJzdoI6Rme7zlHfp7tYRvP/nXsLL+BN7JYXwMv6seaEnB89elkAgvCZj3qXsZOzcnbDkAACpZjNQzEXXUYKt3viLYT0bMG6R63IqzivVbYsxFhSyjcT75+hFIsKDefL7f2gXWYGfhlxnPzYtXbP6wHk6ZdInN239MV6YuY2O9Svy/WMdMn0fO09colaF4Exr/t5mvUBQIhuH8ufw2MyHp2bmqe716dygMrFXU3h48jqiaoYR5O9L0xrlPB5ft1II11Qsw9I9kuZCFG8Zg0BGtr6P1QfP22vTthFS6w5fIDk1ne0n4nh77i4qlQ1k3vZTTHqoNb2aGXN7Vh84T7WwIOpUCmGd2SnuPCorI601fcetAOB/dzSnf/va+XuDeWCdQGBvGirigpQQSila1gq35y9ybuetX6Us+88kuBy/+L/dGPLtxsIsohCFxnkEUcOX57ntH/ztRg6PvZn+X66xf+krBZEVHSnp5207iY+PolLZAFrXNiZ3vjBzK90bVbEf89Kv210CwaajF6lTKcQ+dNxbrBMIPHQeCXfVyrkm1bMFTueVshaO6Mrzv2xl+gbXORm26niAnw/JqbLAirAWT53kzkkD/+3UX+Hsx3Wuf0eRo+bQv/01/O+OKO74dBWNq4Xyx9BOHDl/hfpVyhZ8wbHQqKF0MxJYsWkop35/qiOzh3Vy2RZgLvIc7O96z/DWnVHsfqOPyzbbZ/zpA9fy0b3R9u2f3N8qV+s/5CV9hhClyfdrj9ozCew+FU+Dl+Zxw/8ts3doFzTLBAJ704bEgUy1rBXulviuXZ0K/LdXQ965y3UlNV8fRZC/63wG20I85YL9ub2VY/npW1vWoE2kEQie6JJ1TiWAAddF2h93a5Tf9Y+EKJnqvDDXbdupOO8EAss0DdlIHMgdpRRP92iQ/YHAK7c0pX2dirSr457c7sH2tZm95SQDO0bSJrICj2eSTnvdiz2p4tQ8NXVQO05fSmTcon0uSdOEsCJbqpyCZrkaQU6Ts4mcs32kZQL8XGoCzmpVKMPKUT2oHhZsH4fd6ppwtxFNVcq5L91ZtVwQN7eoXrCFFqIEevRrzzdQ+WWZQGDvI5A4UKC+f6w9y0d2z3R/WLD7uGhbE1LnBq7NPqtf6GF/PPHBa5n3n8725yEBRuW1X3QN9v/vJrdzrn6hBx/e2zJ3hc/CXddGFNi5hCjuvNo0pJTqA3wM+AJfaq3HZth/DfA1EG4eM0pr7d4wVgDsXQQSCApUx/qeJ9JA5vMXIsqXYfULPagaatz9/zzkOmpXLEOVUEdtoE9z1xpAy1rhfHhvS25sWg0/Xx8mD2zD1eR0nvrBGIlRPSyYepUdIyqaVi9HjfAgWteuwDvzd5OZX5+8nlbXlCf2SjJB/r72ZUprhAex5dVetHz9z2w+ASFKPq8FAqWULzABuBGIAdYrpWZprXc6HfYy8JPW+jOlVFOMBe0jvVEeLaOGihXnKfdtc7hgzh2tHHfpPRob6bSH/+QYqtq8hmOlublOtYndpy7x++YTHs9pW4bU0zht5/WmhSjNvNk01A7Yr7U+qLVOBqYB/TIcowHbVNUwwPNfawGQGkHpNHdYJ97o1wwwUmwvH9mdLa/2cjlm7J0tmD64A9tf653j8w7qWAeAHa/15vk+rqnL+0bJ8FZRungzENQEnGdKxJjbnI0BHlRKxWDUBoZ6OpFSarBSaoNSakNqamqeCuN38QCP+s4hIDl3uUxE8Va/SigPOQ03vaZiGbc7+eAAX9rXrUjZQD82vnxDluf74XGjz8PWoR0S6Ee9ysbs0EZVQwHX2sOspzvyw+PtAUffR8bHAP3bX5PpNUf2buTyvGZ48U5QJkofb/YReLr3zpjY735gqtb6A6XUdcC3SqnmWmuXaala60nAJICQkJA8rRYRcG4nr/h/z5Kke/PyclFKVCwbyNxhnTl4LoFbWrgvsnd9Pfc+j17NqjHj39fTqlY436w+zD1tavF878YEBfgQ6OfLrpOXAAgPDuDrR9qRmqa5cDmZAZPX2c/xyi1NaVg1lFOXEqlWLojRs3YAsG1MLy5cTua9BXucrlcVH6VcFqIXwpu8GQhigFpOzyNwb/p5FOgDoLVerZQKAioBZwq6MLbo4VOylloWXtC0RrlMk+dlxjYzeqDZZOTMubmxcTXjvMvMHE1VQgP55tF2BPn7uqwPYQsEoUH+bhkna1coY8+aOfD6SKqUC2TXyXh7vn4bW4KypNQ0Gr2cffrnZ29sSJC/r8tyk9m5oUlVj4vSAESUD3bL7ilKJm8GgvVAA6VUHeA4cB/wQIZjjgI9galKqSZAEOCV9JXarKBIriFRmBpVC7UHh5zo0bgKD18fyVvml3XN8GAe71KXC5eTCfTz4ZeNMYSbq9Y1MPPO+Plk3sI7d1hn0tI1fr6KJtWNcvy+5Tjbj1/KUXm+fNhYpMjTmhYLnulCs9ELcvzeRP519bCQVEHwWh+B1joVeBpYAOzCGB20Qyn1ulLqNvOwZ4HHlVJbgB+BgVp7Ws+oAMpjBgLlndMLC4usGELjaqGMua2ZfZstR1M5D/MoACY+2JqFI7q6bZ88sK19Nvf97WrRv4PRt1AhJIBXbjGWF40oH0zDqqH2RZZ8fVSmQ3Wb1ihHVESYPQjkhvOqdwMzrHb31/AuHpd9DQlwpB3Jag2MjD64x5gD4mmt7RuaVHXb5ml+SmZK2jrlWekX7d6cWRCUl753vSYkJERfvnw5+wMzOLbqJ2r9+Tgre86kY+eeXiiZEA5aa776+xD3tK6Vo2Gov28+TliwP92cUhJ7MnfbSdrVqeCWE8rG+c691TXh/PpkR7djth+P44WZ2+gXXYM352TeTPT5Q63p3SzzEVKpaenUf8lIyXxDkyrEXU3h5yHXsy0mjllbjjPixkZsiYll/OL9xCem8GjnuvYVxmb8+zq2xcTx1rzd/PBYe9pEViA1LR0fpZi97aTLSmR737yJtHRtX/2sT7NqTHyoNSfjrnLd24sB+G+vhrz/5163Mn7a/1rCgv3pb66+B0ZNpvdHywEjAD378xb7vm6NKud6TY0W6gDbdB10IczPPfhWX3zy2KyhlLqitQ7xtM8yuYbsNYIiLoewBqUUj3XOPsGeTb9oz6k5MuoblXWqjV+fvJ7dp+LpG1WdIH/PX0zNa4bxx9BOJKak2QPB4bE38/Wqw3yyeB/nEpL54J6WWQYBcCzWAjCyd2MaVTNGVUVFhBEVYczp6FC3Ih3qVrQfN339UaqWMyb6ta5dwaXPxc+e6daoVZQN9HMZ8rv/fzeRkqYJNmsdtrkonRtU4ukeDVwCQZkAX3a+bmTHXbn/nH17oJ8PjaqFcvCtvqRrjZ+vDze3qM77C/ZQPTyYRzvV4Wpymj3o3N/uGn5c58hx1TeqGnO3nbI//2dAGSr89Apvp9xPQpunmLPtpEs+oJa1wrmzVU1OxF2lc/3KPPiVEZBqhAVxIi6RBlXKss9c26NS2UB+GXIdGqhVPhg/Xx82HrnAA1+sJcmcK5PXIJAdywUCHyRPvii9Wl1T3j5JLjtB/r78379aUrtiCMQe5eF6l5m1JYRzCcnUrlgm29crpdj0yo3M33HKHgRIS4X0VPB3zxkFZLlco02XBhX4pOYiWt090mW7n68Pfq4Jb1k+srt93eKVo3pw5lIi78zfzRNd6tmPaV27PD0bV+GFvo2pX8Uop4+Pwsf8Tgjy9+Vls9kNjOHGb/RrRqtryrPz5CV+XHeUIH8fElPSeeeuFjStXo4le85St1IIFVKMWetPN0si9I4o/ndHFMmp6Qz98R+e6l6fFhHh9vPaltUc1DGS5/s05oM/9/CfGxrSfPQCtyUwHWWvwA+Pd+Cuz1YxtEf9bD+7PNNal6ifMmXK6Lw4tHKG1qPL6TUr/szT64VwMfVWrSd0KNhzbvxG66uxnvddOqX1weWe922YqvXhVfm79uhyWo8up9cePK+vf3uRTkhM8Xxc0mWt09IyP8939xjnyo89841z/PJY/s6TE5fPa31oRaa709PTdeI7jbQeXU4nr/7C/YDN08yyPpr5Na7GaT1rmNaJ8frYhcs6JdX18zsXn6ivJqdmWczElKz35wRwWWfyvWqZpHParFFJZ7Eg+QpcPpf9cVk5tAzO7Mz+uJw4uxeWvgOznoZZHudUwhc94OtbPO/7YxhM6QPxp400uxePwMpxObv25fNwwTFfoZ3vPlaO6kFIoIfGgrRUeKs6zHsu8/Pty8UoorQUSIzzvB1g2085P1dG856H+S9mf9x3d8LUmx3XzEAlnCHwirGwvf/8ZyE1Gc445a6yjR3e91fm11g1DjZOhbWfEVEmHb9Tm1x2Vywb6La2R0aBGatCBcxCTUNGzFMyj6Do7ZoNO3+Du74snOslnIGAEOMH4Msb4MwOGOPhS8iTc/sgtBoEhuavHKsnwDUdoGZr1+0T2joeH3f9krC7FON5e6LTMNAPGrrui7oHylU3vrx8fI0f59elp8LHLSDZaf3pyb2gbje4fzps+xlqRMPuOUbg7PSMccz6L2DHr5AUD5UaQt93oXJjKOOUM2pMGHR9HrqbX8arPjG+9LfPhJrXwi0fwdtmv8jAObDvT6h/I9Tp7Doxw3bjtnoCRD9gXOP8AaPMZatBXAyc3w8t74WDS6F8pPGzdqLxuj5vef7czh+A2cPhxCbHdc7sMv5vdh0JZ/fA5D7gmyEH1Zvm8M3hOyDMKUNtolPGgisXjNcFZlhWcvGbsH8xHF0F90+DalEQUNb4fznnWeg8AkKrw/qvoPld4B8MJ/6BMpUgONz1egXMMqOGDqz+nXoLBrDxhum07tQn+xcI7xljJod7do/xBZtbC8fAhYPwr29yfr0qzeDJVa7XtwWCnb8b5+s03P21i16HFR9ARFt4bKH7e8gsmCQlGF9093wN4bVgyduw37xrHDQfKjcygmFwBfj5YdfXjjxgfPlWqGNc1z/YcT2AWh3gUfPO+51IuHrRcxnaPWF8SY8Jg4Z9oNf/4M+X4a4v4O0SlGY7sBwkmQFvTJzrZ2HT7UVYan7pP/AT/PAv4/HzR4wv/bRkqFjP+ILe9B38+ZLr6587BO+aHdeRneHwiqzLVKUpdHwGfh3suv2RP41gCjA61rgJyRig8+rOL6DFv/L88qxGDVkmEOxb/TsNFgzgnxumcW0n93z2ohDZ/pBrd4L7vjfudnLi2DpITzOaQcDxJRx/Gsa3gXrdPQcH5y/t+S/CmgnG83+vhs+cOuj8y8CL5uxd212p85fOS6dApxs1hEnmHIDBy4yawq9PGL/bPGp8iTS6Cb7JmGPRSeUmcDbnM3zdhF8DsTlYsa3jf2Dlx3m/jiheur0I3Z7P00slEAB7V/9BwwUPsumGH2nVqa8XSmZRu/6A6Q/CCzHuTSdaG80HQRkmMzl/uTboDfd+Bz8PhJ6vQJUmjn37FhpV7qi7jQDweoZ01UP+NpoD/nzZsa3Xm7BzFsSfgodmQqUGjuuNjoXXsgk6trvBqHug83/h0/Y5+RTc+ZeBlCt5e60QWclpk2YGMo/AifQRONkzH6bdD6OO5r39e6m51tCFQ1C9hes+5y/d9kOgy3MQUtH1mH0LHO2up7dD8zsh4Sxs/s5xTNTdsPgN92tP7OS+zTkojG8DL570XJ7M2JoEtv1s/OSVBAFRglgmENg6iyXpnJMlbxpNHecPGJ2CeXF6u/Fb+UDsMYg9ApEevqDXTjR++n2a+blij8DfH7pv99QmnFNvyVrHQmTHMsNH0yXXkLucrtYzayiMdxrZMrGT0e6cnubYphSMizaG4r2WxYSm35/Mc3GFEN5hoRqBGQiUBAIHeyRw35WeDms+hSa3wD9OHbAXD8OpbcbPbqflpTdMMYYjglHLyM9dvBCiUFmmRmD/ypMagYOtWWfW0y6TigDYM8cYYvdxS8e2leOMjmGbY2scj9d/4b1yCiEM4ZmvdJcfFqoRyISyTJ3cAt/eDg/8bIypX/Km5+P+eqVwyyWEcHXXV145rfVqBFYOBFcuGL+n9Td+nCUlGDNcMwsCQljFNdfBbZ9kvr9aCxi2Gf6z1XV7zdaukxLbPAr/2QI3vevY1mUkjDrmeQio8oVntsMNrxnPG5iZVx9b7DjGz3P68fyyUI3Aloa6lAQCrY1p/2UrQ9xxuHTcmOZ/4QBUjYJds6DZHXD5rDGtv1x1+GmAMfNx92z3813JZ+4dIQpKn3dgfg4nTd31Fcx41HVbdH/Y/L37sSMPwPGNxpDnE/8YX7ChVR2pGz5sDnHH4I7PoXxtaHGvUUOe+bix/+4p8MsguPkDY9Y3GF/oy9+HivWh2e3GthvGuF63/RPg6w9HVkOPl133dXsROj8LVy9AWXMtik7PONJ52PSfYZSjUqOcfS65ZJkJZZtXLyR6wV3s6TmFRp3v9ELJvCw1yfVuYM1nMH+UkZ/FlrqgahSc3gbdXoClb3v+IxGiINz1FRxdDeud8kVVi4InVsD/NYFyNeH4Btf0EACtB8HGKa7nemyRkeJj6VgYvNSYgGgbbND9ZaOW2vR2uPUjIwfQ3x8aM7dbDQAfH9eUJQeXQsv7XGeTZ5cOxOafb43+spdOGWk9bJLi4dxe444/KcE9h1AJITOLgU2rF9JqwV3s6/kVDTrf7YWSFYD0dJjc26g+NjTzldhy1oBRHbXdiXx3F+xf6Pk8Nq0egk3feq+8ouS643O4ch4WvGj8vwoub/QVXTpuJHezObcfUhOhWnPj+YWDRsbSWm2NL+UJ7aDZnXD7Z+5rEJw/YCSAS0uGtZ9DvR7G/98vehjH+/hCjVaey7dwjDE7/I6J2b+XtBRjpJrzjdLKj6FCPWPU2+mdRmK6prdlfg4LKLJAoJTqA3wM+AJfaq3HejjmX8AYjGb8LVrrjAvcu8hrINi4ejGtF9zB/hu+pH6ne3L9+kJxNRbeqW3cRb1wzNhm+2MDIyNkUDk4stLIZCisJ7QGxJ9wPO/2onEHHFTOSEDniXNCNjDuujP7AhalVpGkmFBK+QITgBuBGGC9UmqW1nqn0zENgBeAjlrri0qprBdszQd7uCuuNaBLJ+HbO4zH2nkVNacx/rOeNtr8RelSLcqYlwHQ4Snji/7uKUYzx7dmu3O5mjDCaf0DW3OHcwIyW9OHbd/ji6F6tDHrO+6YUTvs8KQEAeHGm53F7YD9WuuDAEqpaUA/wHk1j8eBCVrriwBa6zNeK40ZAPySL2VzYCHbMx/WfQ4Hl4E2Z+omJ8D2GRAQCj841V4kCJQ8PUfDotccz2u2gccXGY+XjjX6ch5ZAPsXQUhlqO2UDbVedyNRXnYzvzN6/rDRzOic16nfeOg2ysjhL0QG3hw+WhM45vQ8xtzmrCHQUCm1Uim1xmxK8oqyF3YAUGmfUyKx1GRvXc4IPFobQzYndDDaWm0un4Nks3nrx3vhwGJHELD55RHXICAK1jPbc3f8fT8aIzZGHoSofxlDBzs85dhfpSlUNyff3fKhsWDLw7ONxUZuetfoyAfXduquz8OrF4yFSZre5hoEbHIbBMBo78+Y3A+M0TG+lhkoKHLBm/8rPP0Pztgu4wc0ALoBEcAKpVRzrXWs80FKqcHAYICAgAwrBuVQbCVjVajzjftTFuDAEqPafes4Y7jZ9AeNMcARbVxXcsrM6Z1GJ1rNa123/zwI6veE380viYoN4Pw+mHITXD4D9XrCAfOO8LkMs3lFwevxstGfUq6m8eX/ZQ9jVFV4LddRJBlHlpw/AGd3G2mxA8OML9bGZvryu8xZ1B2HGWsb+AbAk6tdr9vmEcfj9k9Au8HGql5NnAKBUsbYcSGKmDcDQQxQy+l5BHDCwzFrtNYpwCGl1B6MwLDe+SCt9SRgEhidxXkpTHrGXEO2ttc/hhk/AHvnGb8HzIK6XW0Xh22/GGOEff0dJ7QtaDImzrjr9wuCgDKwY6bxY3N+n/H7stnqZQsC4FgRSeRex2dg5UfG45b3G2sHjHdaArJ2J+j/k3G33WWkY/vgpZ7PF/2gMcLFpmI94ycrodWM4Y1Ns1iAxkYpI8V2QRmyEo6sKrjzCUvzZiBYDzRQStUBjgP3ARlHBP0G3A9MVUpVwmgqOuiNwmjzzitHuYa+uc1YU7XNIGNi1szHjLH6W6fDdU8bd3bO5Au9cAxZaaSybnwLNOpj/E5PgdrXG/sHL4W/XjUWugnKZdK72yfkrUxdR2Z/jDdUa+4Y0ilEPnktEGitU5VSTwMLMIaPTtZa71BKvQ5s0FrPMvf1UkrtBNKAkVrr894ojyMNdVo2R5pmPwNH18DWacbzrdON36vHux4nWTYLRo9XjMVn2jwCGyYbwySf3WWMEffxc7SV93P6/Gu1dT1HjVbw8B+FV2YhSgmv9hxprecCczNse9XpsQZGmD9ela5sSefSsznSiS0IiNwJLu95QXW/YKjazJhxClCrPRxbazxuNxjqdDGGUm6Y7Jim79wcJ4TwCssMIbBnHy2u8whKKlvn6pK3jT6SNo8aU/D3zDdGRAG8fMYYy+7rD8fWw1c3GF/8fd4xFrOJPWLc8ddq53pOIUShsEwgSLcHghw2DYms1WwN9/3geN79Bdf9jfpAo5uNdQ18AxxNO7XawtMbjCRdSsHA2bDvr7yvmSyEyDfrBIK8NA0JV5GdHYu7P74462MB/vU1JF5yHwtfqYHjcfg10FYS4wlRlKyzHoGWQOBRyyxTOzkEhRt37y3vz/m5ff09T2wSQhQrlgkE1cobuZaCffMwU7O0Ca3heNziHiO/urPq0cbQTJtB8+Eps1O336fwiqxdIERpYpmmoaiIcADKBVom9mXu2V2OYa9htaBudyNlb41WRuZTH/MzWvUJNLwJKtV3vNbHBwvdPwhhCZYJBPap/NpD01CvN+HPl923l0Q1W8P906BMRdj5m5GzyJltKb22jxlf/rb2+nrd3c91/VDvllUIUSxY59bO7Cx2S+72zHbjC6+i7a63BDQdPbYo8313fWUseefjC436uu+vZiY/u/kDuO5J75RPCFGiWKdGYEskd2QVdPyPY3t6qvF76Ebjd1oKHFoO393pWCavOOnwlJEYL+NY++XvwZqJjhXMAHtQ8w0wlhDcM9dYTUoIIZxYZqlKUpPhzcrGY+d1TF85n3Vq3oPLjHw2VZoaudxfL5/7a+dWna5waJnjuS2D6VProHIuFq/WGr6/G9oPgQY3Fnw5hRAlRlYrlFmvaQgcq5Q1uS37/Ox1u0L9G6BcDaOj9OHZRhrjjHfktTq4Pi9XEx79CyLauTbl3PKR43GlhkaaBfu+D421XB+Y7khRPXynMR6/xX1OzVc5pBQ8OEOCgBAiS9ZrGgIjlw0YmUVzq05n48emVnsjzbHtyzYtFSb3MvLg12oHj/3l+vo2g4zahfO6B3+96lhs25b+2j/YEWzCasKdn+e+rEIIkQPWaRoCozmo2R2uaaTzk9cm+bLR/p6TxGhjwowAkHEBEzBqKGd2GgnZhBDCC4pk8fpiK+NaAvkR4PEz9ez5w8biNZ4oJUFACFFkrNNHYBNavWiuG1zeaO4RQohixlqBwDaLVgghhJ21AoGPr/uEMiGEsDhrBQLl65hAJoQQArBaIPDxg3SnGsG1A4quLEIIUUx4NRAopfoopfYopfYrpUZlcdzdSimtlGrjzfLgk6FGcMNrXr2cEEKUBF4LBEopX2ACcBPQFLhfKdXUw3GhwDBgrbfKYufj61ojCAr3+iWFEKK482aNoB2wX2t9UGudDEwD+nk47g3gXSDRi2UxXD4He+c5nvtYq2VMCCE88eY3YU3gmNPzGHObnVKqFVBLaz07qxMppQYrpTYopTakpuajszf+ZN5fK4QQpZQ3ZxZ7Suxvz2ehlPIBPgQGZncirfUkYBIYKSYKqHxCCCHwbo0gBqjl9DwCOOH0PBRoDixVSh0GOgCzvN5hLIQQwoU3A8F6oIFSqo5SKgC4D7Cn+9Rax2mtK2mtI7XWkcAa4Dat9QYvlkkIIUQGXgsEWutU4GlgAbAL+ElrvUMp9bpS6jZvXVcIIUTueDX7qNZ6LjA3w7ZXMzm2mzfLIoQQwjMZPymEEBYngUAIISzOuoHguqeLugRCCFEsWDcQJMYWdQmEEKJYsG4gKFu1qEsghBDFgnUDQf0bi7oEQghRLFgrEFRq6HhcI7royiGEEMWItQJBtRaOx7KQvBBCAFYLBK0fLuoSCCFEsWOtQFCnlQX2RAAADmxJREFUC0S0g4Fzsz9WCCEsQmldsrI6h4SE6MuXLxd1MYQQokRRSl3RWod42metGoEQQgg3EgiEEMLiJBAIIYTFSSAQQgiLk0AghBAWJ4FACCEsTgKBEEJYnAQCIYSwuBI3oUwplQxszePLKwHnCrA4JZF8BvIZgHwGYL3PoIXWOsDTjhIXCPJDKbVBa92mqMtRlOQzkM8A5DMA+QycSdOQEEJYnAQCIYSwOKsFgklFXYBiQD4D+QxAPgOQz8DOUn0EQggh3FmtRiCEECIDywQCpVQfpdQepdR+pdSooi5PfimlJiulziiltjttq6CU+ksptc/8Xd7crpRS48z3vlUpda3Tax42j9+nlHrYaXtrpdQ28zXjlFKqcN9h1pRStZRSS5RSu5RSO5RS/zG3W+kzCFJKrVNKbTE/g9fM7XWUUmvN9zNdKRVgbg80n+8390c6nesFc/sepVRvp+0l4u9GKeWrlNqklJptPrfcZ5AvWutS/wP4AgeAukAAsAVoWtTlyud76gJcC2x32vYuMMp8PAp4x3zcF5gHKKADsNbcXgE4aP4ubz4ub+5bB1xnvmYecFNRv+cM7786cK35OBTYCzS12GeggLLmY39grfnefgLuM7dPBP5tPn4SmGg+vg+Ybj5uav5NBAJ1zL8V35L0dwOMAH4AZpvPLfcZ5OfHKjWCdsB+rfVBrXUyMA3oV8Rlyhet9XLgQobN/YCvzcdfA7c7bf9GG9YA4Uqp6kBv4C+t9QWt9UXgL6CPua+c1nq1Nv5KvnE6V7GgtT6ptf7HfBwP7AJqYq3PQGutE8yn/uaPBnoAv5jbM34Gts/mF6CnWcvpB0zTWidprQ8B+zH+ZkrE341SKgK4GfjSfK6w2GeQX1YJBDWBY07PY8xtpU1VrfVJML4ogSrm9szef1bbYzxsL5bM6n0rjDtiS30GZpPIZuAMRhA7AMRqrVPNQ5zLbX+v5v44oCK5/2yKm4+A54B083lFrPcZ5ItVAoGntl0rDZfK7P3ndnuxo5QqC8wAntFaX8rqUA/bSvxnoLVO01pHAxEYd69NPB1m/i51n4FS6hbgjNZ6o/NmD4eW2s+gIFglEMQAtZyeRwAniqgs3nTabNLA/H3G3J7Z+89qe4SH7cWKUsofIwh8r7WeaW621Gdgo7WOBZZi9BGEK6X8zF3O5ba/V3N/GEbzYm4/m+KkI3CbUuowRrNND4wagpU+g/wr6k6KwvgB/DA6Aevg6PBpVtTlKoD3FYlrZ/F7uHaUvms+vhnXjtJ15vYKwCGMTtLy5uMK5r715rG2jtK+Rf1+M7x3hdFu/1GG7Vb6DCoD4ebjYGAFcAvwM64dpU+aj5/CtaP0J/NxM1w7Sg9idJKWqL8boBuOzmJLfgZ5/uyKugCF+J+kL8bIkgPAS0VdngJ4Pz8CJ4EUjLuWRzHaOhcB+8zfti80BUww3/s2oI3TeR7B6BjbDwxy2t4G2G6+Zjzm5MPi8gN0wqiibwU2mz99LfYZtAA2mZ/BduBVc3tdjBFP+80vxEBze5D5fL+5v67TuV4y3+cenEZHlaS/mwyBwJKfQV5/ZGaxEEJYnFX6CIQQQmRCAoEQQlicBAIhhLA4CQRCCGFxEgiEEMLiJBAIy1FKJZi/I5VSDxTwuV/M8HxVQZ5fCG+QQCCsLBLIVSBQSvlmc4hLINBaX5/LMglR6CQQCCsbC3RWSm1WSg03E7i9p5Rab65Z8ASAUqqbufbBDxiT0VBK/aaU2miuAzDY3DYWCDbP9725zVb7UOa5t5trHNzrdO6lSqlflFK7lVLf29Y9UEqNVUrtNMvyfqF/OsIy/LI/RIhSaxTwX631LQDmF3qc1rqtUioQWKmU+tM8th3QXBspigEe0VpfUEoFA+uVUjO01qOUUk9rIwlcRncC0UBLoJL5muXmvlYYKQ5OACuBjkqpncAdQGOttVZKhRf4uxfCJDUCIRx6AQPMtM5rMdJVNDD3rXMKAgDDlFJbgDUYSckakLVOwI/ayBZ6GlgGtHU6d4zWOh0jVUYkcAlIBL5USt0JXMn3uxMiExIIhHBQwFCtdbT5U0drbasRXLYfpFQ34AbgOq11S4x8P0E5OHdmkpwepwF+2siV3w4ju+rtwPxcvRMhckECgbCyeIxlLm0WAP8201ujlGqolArx8Low4KLW+opSqjFGhlKbFNvrM1gO3Gv2Q1TGWGp0XWYFM9dZCNNazwWewWhWEsIrpI9AWNlWINVs4pkKfIzRLPOP2WF7Fs/LU84HhiiltmJkqlzjtG8SsFUp9Y/Wur/T9l8x1j/egpE19Tmt9SkzkHgSCvyulArCqE0Mz9tbFCJ7kn1UCCEsTpqGhBDC4iQQCCGExUkgEEIIi5NAIIQQFieBQAghLE4CgRBCWJwEAiGEsDgJBEIIYXESCIQQwuIkEAghhMVJIBBCCIuTQCCEEBYngUAIISxOAoEQQlicBAIhhLC4ErcwjVJqPsbi33lRCThXgMUpCdeW92yNa1vtukV57ZL6ns9prft42mGphWmUUhu01m2sdG15z9a4ttWuW5TXLo3vWZqGhBDC4iQQCCH+v72zjbGrKOP47+8WaluEviCkstWF0CBIoF1ILWAaBZUXCSaigYZEYhqJhKStMWobowmJX0iMYGNDRECikkLkzaYfCs1ajahppdCFLUsFpYFKYYtamqppSv37Yea612VvWsqdWdLz/JKTM+e5J+d/5+XOc+c558wEDadpjuCOBmpHnpuh3TTdidQ+6vLcqHsEQRAEwVtp2oggCIIgGENjHIGkyyRtl/SCpBWFte6WNCJpqM02U9IGSc/n/YwCunMkbZQ0LGmbpGU1tCW9V9JmSYNZ9+ZsP1XSpqx7v6Rju6nbpt8j6SlJ6yrr7pD0jKStkp7Ithr1PF3SA5Key3V9QSXdM3JeW9teScsraX81t60hSWtym6tVz8uy7jZJy7Ot63l+O/2GEqtyf/a0pP53ot0IRyCpB1gNXA6cBSyWdFZByXuAsc/rrgAGbM8FBvJxt3kT+JrtM4GFwE05n6W19wMX2z4XmAdcJmkhcAtwa9b9B7Cky7otlgHDbce1dAE+YXte2yN9Ner5B8B62x8GziXlvbiu7e05r/OA84B/AQ+X1pZ0CrAUON/22UAPcC0V6lnS2cCXgQWksr5S0lzK5PkeDr/fuByYm7cbgNvfkbLto34DLgAebTteCawsrNkHDLUdbwdm5/RsYHuFfP8S+FRNbWAq8CTwUdKLL5PGq4Mu6vXmH8jFwDpANXTztXcAJ46xFS1r4HjgRfL9vYlqX8Cngd9VyvMpwMvATNJLsOuASyu1ry8Ad7Ydfxv4Rqk8H26/AfwIWDzeeUeyNWJEwGhDarEz22pysu1dAHl/UkkxSX3AfGBTDe0cntkKjAAbgD8De2y/mU8pVea3kX6Y/8nHsyrpAhh4TNIWSTdkW+myPg3YDfwkh8PulDStgu5YrgXW5HRRbdt/Bb4HvATsAt4AtlCnnoeARZJmSZoKXAHMoV55d9Lpap/WFEegcWxH7eNSko4DHgSW295bQ9P2QaeQQS9pGH3meKd1U1PSlcCI7S3t5tK6bVxku580TL9J0qJCOu1MAvqB223PB/5JmfBTR3Is/irgF5X0ZgCfBU4FPgBMI5X5WLpez7aHSSGoDcB6YJAUgp1outrOm+IIdpK8eIte4JXK3+E1SbMB8n6khIikY0hO4F7bD9XUBrC9B/g16R7FdEmt+axKlPlFwFWSdgD3kcJDt1XQBcD2K3k/QoqVL6B8We8EdtrelI8fIDmGanVM6oSftP1aPi6t/UngRdu7bR8AHgIupF4932W73/Yi4O/A89Qr7046Xe3TmuII/gjMzU8ZHEsa1q6t/B3WAtfn9PWk+H1XkSTgLmDY9vdraUt6v6TpOT2F9MMdBjYCny+la3ul7V7bfaQ6/ZXt60rrAkiaJul9rTQpZj5E4bK2/SrwsqQzsukS4NnSumNYzGhYiAraLwELJU3NbbyV5+L1DCDppLz/IPA5Ut5rlXcnnbXAF/PTQwuBN1ohpCOi2zdX3q0bKbb3J1Ls+luFtdaQYpkHSJ57CSl2PUD6NzEAzCyg+zHS8PBpYGveriitDZwDPJV1h4DvZPtpwGbgBVIYYXLBMv84sK6WbtYYzNu2VpuqVM/zgCdyeT8CzKihm7WnAn8DTmiz1cjzzcBzuX39DJhcq30BvyU5nkHgklJ5fjv9Bik0tDr3Z8+Qnqg6Yu14szgIgqDhNCU0FARBEHQgHEEQBEHDCUcQBEHQcMIRBEEQNJxwBEEQBA0nHEEQZCQdHDO7Ztfe2JXU1z6rZBC8m5h06FOCoDH822majCBoFDEiCIJDoLTuwC1Kay5slnR6tn9I0kCeD34gv3mKpJMlPay0PsOgpAvzpXok/TjPa/9YfgsbSUslPZuvc98EZTNoMOEIgmCUKWNCQ9e0fbbX9gLgh6T5jMjpn9o+B7gXWJXtq4DfOK3P0E968xjS3PGrbX8E2ANcne0rgPn5Ol8plbkg6ES8WRwEGUn7bB83jn0HaeGdv+RJ/V61PUvS66Q54A9k+y7bJ0raDfTa3t92jT5gg9MCI0j6JnCM7e9KWg/sI00X8YjtfYWzGgT/R4wIguDwcId0p3PGY39b+iCj9+g+Q5o35jxgS9uMmkFQhXAEQXB4XNO2/0NO/5406ynAdcDjOT0A3Aj/W7Dn+E4XlfQeYI7tjaQFdqYDbxmVBEFJ4p9HEIwyJa+y1mK97dYjpJMlbSL9eVqcbUuBuyV9nbRq2JeyfRlwh6QlpH/+N5JmlRyPHuDnkk4gzSh5q9OaDkFQjbhHEASHIN8jON/26xP9XYKgBBEaCoIgaDgxIgiCIGg4MSIIgiBoOOEIgiAIGk44giAIgoYTjiAIgqDhhCMIgiBoOOEIgiAIGs5/AZ7rKPQcLAIBAAAAAElFTkSuQmCC\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"ax1 = plt.subplot(1, 1, 1)\n",
|
|
"ax1.plot(range(len(gener_costs)), gener_costs, label='Generator loss')\n",
|
|
"ax1.plot(range(len(discr_costs)), discr_costs, label='Discriminator loss')\n",
|
|
"ax1.set_xlabel('Iterations')\n",
|
|
"ax1.set_ylabel('Loss')\n",
|
|
"ax1.legend()\n",
|
|
"\n",
|
|
"###################\n",
|
|
"# Set scond x-axis\n",
|
|
"ax2 = ax1.twiny()\n",
|
|
"newlabel = list(range(NUM_EPOCHS+1))\n",
|
|
"iter_per_epoch = len(train_loader)\n",
|
|
"newpos = [e*iter_per_epoch for e in newlabel]\n",
|
|
"\n",
|
|
"ax2.set_xticklabels(newlabel[::10])\n",
|
|
"ax2.set_xticks(newpos[::10])\n",
|
|
"\n",
|
|
"ax2.xaxis.set_ticks_position('bottom')\n",
|
|
"ax2.xaxis.set_label_position('bottom')\n",
|
|
"ax2.spines['bottom'].set_position(('outward', 45))\n",
|
|
"ax2.set_xlabel('Epochs')\n",
|
|
"ax2.set_xlim(ax1.get_xlim())\n",
|
|
"###################\n",
|
|
"\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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48apMdb5yjoPdevWTdWs0FOrx84999yCZav3rXU99thjqjZ27FhVi/ZcQ6KvkfU8UZniHj9Dw1KTbDPk+iw0KHbt2rWqZv0oiPXYp556StVCwpLTDn9PM3i2MfikCAAAAAAAqErcFAEAAAAAAFWJmyIAAAAAAKAqcVMEAAAAAABUpcyDVi1phv8lCWKxwnUuvPDCguUXX3wx9rruuusuVbMCHq3Xo66urmB58+bNaszhhx+uasOGDVM1KyzWet2s5xASQkXAY2WK2zuh73eS/cLaF5cvX16wvH79+qBtWiFyVpjjlClTguZ22223FSxbobDW/K0wqyeffFLVzj77bFULDawOGRMaNIl8idtPoSFyoccDa30bNmwoWH7vvffUmN///veqNnnyZFULDUy05hsNLo6eR0VE+vXrp2rvvvuuqllBlh07dlS1tAPo0DTEDVqdNWuWqln7oqVDhw6q1rNnz4JlK1D8j3/8o6pt375d1d5//31VCz3XLV68uGB50KBBasxBBx2kag8//HDQ3EKdccYZBcvRIFo0fdFeDD23WrXQv5tC+sQaY21z/Pjxqmad637605+qWtu2bVUtes611mUFj4cKve4P+VGHpOdWPikCAAAAAACqEjdFAAAAAABAVeKmCAAAAAAAqErcFAEAAAAAAFUpl0GrabKCaayaFbZohUvNnDmzYLl3795qjBW21qZNG1W76KKLVM1iBcdEg2+sILiQwBwRO/TKYo2LGxaG/AkJOwp5f7MKFowGta1bt06N2bFjR+z1xw1v27Vrl6qFBnJdeeWVqvb222+rWtz3xUIPV6a0+rehcdb+aZ1PrHDgG2+8sWDZCmTctGlT0DYtzZs3VzUrVDIaBnfzzTerMaeeeqqqWWHJ1nme3kGo0OuuqCeeeELVQoORBw8erGrRoH3rfHXTTTep2lVXXaVqd999t6pZ51wraHLp0qUFy9Y1rfXDBqHXG/vtt5+qXX311ao2fPjwgmWr99G0pXkcT/L3VciYVatWqdoNN9ygatY58rrrrlO12traovMI+YGNhpT6hzeSrotPigAAAAAAgKrETREAAAAAAFCVuCkCAAAAAACqUtGbIs65+51zq5xzb+1W6+Ccm+mcW1L/z/alnSaAKHoTyCd6E8gnehPIJ3oTWQtJEBovIn8SkQd2q40SkVne+1udc6Pql69Ja1Jp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\n",
|
|
"text/plain": [
|
|
"<Figure size 1440x180 with 5 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"##########################\n",
|
|
"### VISUALIZATION\n",
|
|
"##########################\n",
|
|
"\n",
|
|
"\n",
|
|
"model.eval()\n",
|
|
"# Make new images\n",
|
|
"z = torch.zeros((5, LATENT_DIM)).uniform_(-1.0, 1.0).to(device)\n",
|
|
"generated_features = model.generator_forward(z)\n",
|
|
"imgs = generated_features.view(-1, 28, 28)\n",
|
|
"\n",
|
|
"fig, axes = plt.subplots(nrows=1, ncols=5, figsize=(20, 2.5))\n",
|
|
"\n",
|
|
"\n",
|
|
"for i, ax in enumerate(axes):\n",
|
|
" axes[i].imshow(imgs[i].to(torch.device('cpu')).detach(), cmap='binary')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"----------------------------------------------------------------\n",
|
|
" Layer (type) Output Shape Param #\n",
|
|
"================================================================\n",
|
|
" Linear-1 [-1, 3136] 313,600\n",
|
|
" BatchNorm1d-2 [-1, 3136] 6,272\n",
|
|
" LeakyReLU-3 [-1, 3136] 0\n",
|
|
" Reshape1-4 [-1, 64, 7, 7] 0\n",
|
|
" ConvTranspose2d-5 [-1, 32, 13, 13] 18,432\n",
|
|
" BatchNorm2d-6 [-1, 32, 13, 13] 64\n",
|
|
" LeakyReLU-7 [-1, 32, 13, 13] 0\n",
|
|
" ConvTranspose2d-8 [-1, 16, 25, 25] 4,608\n",
|
|
" BatchNorm2d-9 [-1, 16, 25, 25] 32\n",
|
|
" LeakyReLU-10 [-1, 16, 25, 25] 0\n",
|
|
" ConvTranspose2d-11 [-1, 8, 27, 27] 1,152\n",
|
|
" BatchNorm2d-12 [-1, 8, 27, 27] 16\n",
|
|
" LeakyReLU-13 [-1, 8, 27, 27] 0\n",
|
|
" ConvTranspose2d-14 [-1, 1, 28, 28] 32\n",
|
|
" Tanh-15 [-1, 1, 28, 28] 0\n",
|
|
"================================================================\n",
|
|
"Total params: 344,208\n",
|
|
"Trainable params: 344,208\n",
|
|
"Non-trainable params: 0\n",
|
|
"----------------------------------------------------------------\n",
|
|
"Input size (MB): 0.00\n",
|
|
"Forward/backward pass size (MB): 0.59\n",
|
|
"Params size (MB): 1.31\n",
|
|
"Estimated Total Size (MB): 1.91\n",
|
|
"----------------------------------------------------------------\n",
|
|
"----------------------------------------------------------------\n",
|
|
" Layer (type) Output Shape Param #\n",
|
|
"================================================================\n",
|
|
" Conv2d-1 [-1, 8, 14, 14] 72\n",
|
|
" BatchNorm2d-2 [-1, 8, 14, 14] 16\n",
|
|
" LeakyReLU-3 [-1, 8, 14, 14] 0\n",
|
|
" Conv2d-4 [-1, 32, 7, 7] 2,304\n",
|
|
" BatchNorm2d-5 [-1, 32, 7, 7] 64\n",
|
|
" LeakyReLU-6 [-1, 32, 7, 7] 0\n",
|
|
" Flatten-7 [-1, 1568] 0\n",
|
|
" Linear-8 [-1, 1] 1,569\n",
|
|
"================================================================\n",
|
|
"Total params: 4,025\n",
|
|
"Trainable params: 4,025\n",
|
|
"Non-trainable params: 0\n",
|
|
"----------------------------------------------------------------\n",
|
|
"Input size (MB): 0.00\n",
|
|
"Forward/backward pass size (MB): 0.08\n",
|
|
"Params size (MB): 0.02\n",
|
|
"Estimated Total Size (MB): 0.10\n",
|
|
"----------------------------------------------------------------\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"from torchsummary import summary\n",
|
|
"model = model.to('cuda:0')\n",
|
|
"summary(model.generator, input_size=(100,))\n",
|
|
"summary(model.discriminator, input_size=(1, 28, 28))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
}
|
|
],
|
|
"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.7.3"
|
|
},
|
|
"toc": {
|
|
"nav_menu": {},
|
|
"number_sections": true,
|
|
"sideBar": true,
|
|
"skip_h1_title": false,
|
|
"title_cell": "Table of Contents",
|
|
"title_sidebar": "Contents",
|
|
"toc_cell": false,
|
|
"toc_position": {},
|
|
"toc_section_display": true,
|
|
"toc_window_display": false
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|