rasbt--deeplearning-models
1248 行
100 KiB
Plaintext
1248 行
100 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.6.8\n",
|
|
"IPython 7.2.0\n",
|
|
"\n",
|
|
"torch 1.0.1.post2\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": [
|
|
"Label Smoothing: Replace Real images (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."
|
|
]
|
|
},
|
|
{
|
|
"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 = 123\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)\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)\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)\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)\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)\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)\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.7199/0.7011\n",
|
|
"Epoch: 001/100 | Batch 100/469 | Gen/Dis Loss: 0.8279/0.5914\n",
|
|
"Epoch: 001/100 | Batch 200/469 | Gen/Dis Loss: 0.9247/0.5693\n",
|
|
"Epoch: 001/100 | Batch 300/469 | Gen/Dis Loss: 0.9432/0.5711\n",
|
|
"Epoch: 001/100 | Batch 400/469 | Gen/Dis Loss: 0.9611/0.5634\n",
|
|
"Time elapsed: 0.12 min\n",
|
|
"Epoch: 002/100 | Batch 000/469 | Gen/Dis Loss: 0.9903/0.5403\n",
|
|
"Epoch: 002/100 | Batch 100/469 | Gen/Dis Loss: 0.9956/0.5292\n",
|
|
"Epoch: 002/100 | Batch 200/469 | Gen/Dis Loss: 0.9466/0.5793\n",
|
|
"Epoch: 002/100 | Batch 300/469 | Gen/Dis Loss: 0.9046/0.5975\n",
|
|
"Epoch: 002/100 | Batch 400/469 | Gen/Dis Loss: 0.8873/0.5808\n",
|
|
"Time elapsed: 0.23 min\n",
|
|
"Epoch: 003/100 | Batch 000/469 | Gen/Dis Loss: 0.8739/0.6011\n",
|
|
"Epoch: 003/100 | Batch 100/469 | Gen/Dis Loss: 0.8570/0.6170\n",
|
|
"Epoch: 003/100 | Batch 200/469 | Gen/Dis Loss: 0.8971/0.6244\n",
|
|
"Epoch: 003/100 | Batch 300/469 | Gen/Dis Loss: 0.9126/0.6041\n",
|
|
"Epoch: 003/100 | Batch 400/469 | Gen/Dis Loss: 0.8840/0.6154\n",
|
|
"Time elapsed: 0.34 min\n",
|
|
"Epoch: 004/100 | Batch 000/469 | Gen/Dis Loss: 0.8995/0.6134\n",
|
|
"Epoch: 004/100 | Batch 100/469 | Gen/Dis Loss: 0.8972/0.6153\n",
|
|
"Epoch: 004/100 | Batch 200/469 | Gen/Dis Loss: 0.9177/0.5945\n",
|
|
"Epoch: 004/100 | Batch 300/469 | Gen/Dis Loss: 0.8854/0.6109\n",
|
|
"Epoch: 004/100 | Batch 400/469 | Gen/Dis Loss: 0.8943/0.5872\n",
|
|
"Time elapsed: 0.45 min\n",
|
|
"Epoch: 005/100 | Batch 000/469 | Gen/Dis Loss: 0.9017/0.5988\n",
|
|
"Epoch: 005/100 | Batch 100/469 | Gen/Dis Loss: 0.8936/0.6066\n",
|
|
"Epoch: 005/100 | Batch 200/469 | Gen/Dis Loss: 0.9543/0.5749\n",
|
|
"Epoch: 005/100 | Batch 300/469 | Gen/Dis Loss: 0.9124/0.6088\n",
|
|
"Epoch: 005/100 | Batch 400/469 | Gen/Dis Loss: 0.9296/0.5717\n",
|
|
"Time elapsed: 0.57 min\n",
|
|
"Epoch: 006/100 | Batch 000/469 | Gen/Dis Loss: 0.9465/0.5663\n",
|
|
"Epoch: 006/100 | Batch 100/469 | Gen/Dis Loss: 0.9577/0.5539\n",
|
|
"Epoch: 006/100 | Batch 200/469 | Gen/Dis Loss: 0.9717/0.5505\n",
|
|
"Epoch: 006/100 | Batch 300/469 | Gen/Dis Loss: 0.9644/0.5885\n",
|
|
"Epoch: 006/100 | Batch 400/469 | Gen/Dis Loss: 0.9957/0.5362\n",
|
|
"Time elapsed: 0.68 min\n",
|
|
"Epoch: 007/100 | Batch 000/469 | Gen/Dis Loss: 0.9872/0.5589\n",
|
|
"Epoch: 007/100 | Batch 100/469 | Gen/Dis Loss: 0.9676/0.5416\n",
|
|
"Epoch: 007/100 | Batch 200/469 | Gen/Dis Loss: 1.0073/0.5408\n",
|
|
"Epoch: 007/100 | Batch 300/469 | Gen/Dis Loss: 0.9919/0.5506\n",
|
|
"Epoch: 007/100 | Batch 400/469 | Gen/Dis Loss: 1.0746/0.5052\n",
|
|
"Time elapsed: 0.79 min\n",
|
|
"Epoch: 008/100 | Batch 000/469 | Gen/Dis Loss: 0.9764/0.5329\n",
|
|
"Epoch: 008/100 | Batch 100/469 | Gen/Dis Loss: 1.0014/0.5399\n",
|
|
"Epoch: 008/100 | Batch 200/469 | Gen/Dis Loss: 0.9805/0.5498\n",
|
|
"Epoch: 008/100 | Batch 300/469 | Gen/Dis Loss: 0.9289/0.5516\n",
|
|
"Epoch: 008/100 | Batch 400/469 | Gen/Dis Loss: 0.9759/0.5605\n",
|
|
"Time elapsed: 0.90 min\n",
|
|
"Epoch: 009/100 | Batch 000/469 | Gen/Dis Loss: 1.0388/0.5366\n",
|
|
"Epoch: 009/100 | Batch 100/469 | Gen/Dis Loss: 0.9734/0.5642\n",
|
|
"Epoch: 009/100 | Batch 200/469 | Gen/Dis Loss: 0.9647/0.5679\n",
|
|
"Epoch: 009/100 | Batch 300/469 | Gen/Dis Loss: 1.0362/0.5243\n",
|
|
"Epoch: 009/100 | Batch 400/469 | Gen/Dis Loss: 0.9979/0.5692\n",
|
|
"Time elapsed: 1.02 min\n",
|
|
"Epoch: 010/100 | Batch 000/469 | Gen/Dis Loss: 0.9470/0.5844\n",
|
|
"Epoch: 010/100 | Batch 100/469 | Gen/Dis Loss: 0.9332/0.5765\n",
|
|
"Epoch: 010/100 | Batch 200/469 | Gen/Dis Loss: 1.0060/0.5536\n",
|
|
"Epoch: 010/100 | Batch 300/469 | Gen/Dis Loss: 0.9568/0.5769\n",
|
|
"Epoch: 010/100 | Batch 400/469 | Gen/Dis Loss: 0.9779/0.5648\n",
|
|
"Time elapsed: 1.13 min\n",
|
|
"Epoch: 011/100 | Batch 000/469 | Gen/Dis Loss: 0.9031/0.5689\n",
|
|
"Epoch: 011/100 | Batch 100/469 | Gen/Dis Loss: 0.9431/0.6049\n",
|
|
"Epoch: 011/100 | Batch 200/469 | Gen/Dis Loss: 0.9411/0.5894\n",
|
|
"Epoch: 011/100 | Batch 300/469 | Gen/Dis Loss: 0.9091/0.5965\n",
|
|
"Epoch: 011/100 | Batch 400/469 | Gen/Dis Loss: 1.0204/0.5738\n",
|
|
"Time elapsed: 1.24 min\n",
|
|
"Epoch: 012/100 | Batch 000/469 | Gen/Dis Loss: 0.9692/0.6196\n",
|
|
"Epoch: 012/100 | Batch 100/469 | Gen/Dis Loss: 0.9701/0.5777\n",
|
|
"Epoch: 012/100 | Batch 200/469 | Gen/Dis Loss: 0.9076/0.5774\n",
|
|
"Epoch: 012/100 | Batch 300/469 | Gen/Dis Loss: 0.9328/0.5835\n",
|
|
"Epoch: 012/100 | Batch 400/469 | Gen/Dis Loss: 0.9949/0.5762\n",
|
|
"Time elapsed: 1.35 min\n",
|
|
"Epoch: 013/100 | Batch 000/469 | Gen/Dis Loss: 0.9661/0.5814\n",
|
|
"Epoch: 013/100 | Batch 100/469 | Gen/Dis Loss: 0.9293/0.6001\n",
|
|
"Epoch: 013/100 | Batch 200/469 | Gen/Dis Loss: 0.9946/0.5462\n",
|
|
"Epoch: 013/100 | Batch 300/469 | Gen/Dis Loss: 0.9182/0.5921\n",
|
|
"Epoch: 013/100 | Batch 400/469 | Gen/Dis Loss: 0.8765/0.6099\n",
|
|
"Time elapsed: 1.46 min\n",
|
|
"Epoch: 014/100 | Batch 000/469 | Gen/Dis Loss: 0.9496/0.6027\n",
|
|
"Epoch: 014/100 | Batch 100/469 | Gen/Dis Loss: 0.9531/0.5943\n",
|
|
"Epoch: 014/100 | Batch 200/469 | Gen/Dis Loss: 0.9785/0.5706\n",
|
|
"Epoch: 014/100 | Batch 300/469 | Gen/Dis Loss: 0.9208/0.6180\n",
|
|
"Epoch: 014/100 | Batch 400/469 | Gen/Dis Loss: 0.9413/0.6163\n",
|
|
"Time elapsed: 1.57 min\n",
|
|
"Epoch: 015/100 | Batch 000/469 | Gen/Dis Loss: 0.9433/0.5873\n",
|
|
"Epoch: 015/100 | Batch 100/469 | Gen/Dis Loss: 0.9037/0.6233\n",
|
|
"Epoch: 015/100 | Batch 200/469 | Gen/Dis Loss: 0.9664/0.6000\n",
|
|
"Epoch: 015/100 | Batch 300/469 | Gen/Dis Loss: 0.9632/0.5882\n",
|
|
"Epoch: 015/100 | Batch 400/469 | Gen/Dis Loss: 0.9608/0.5906\n",
|
|
"Time elapsed: 1.69 min\n",
|
|
"Epoch: 016/100 | Batch 000/469 | Gen/Dis Loss: 0.9694/0.6053\n",
|
|
"Epoch: 016/100 | Batch 100/469 | Gen/Dis Loss: 0.9470/0.6012\n",
|
|
"Epoch: 016/100 | Batch 200/469 | Gen/Dis Loss: 0.9078/0.6029\n",
|
|
"Epoch: 016/100 | Batch 300/469 | Gen/Dis Loss: 1.0011/0.5807\n",
|
|
"Epoch: 016/100 | Batch 400/469 | Gen/Dis Loss: 0.9154/0.5970\n",
|
|
"Time elapsed: 1.80 min\n",
|
|
"Epoch: 017/100 | Batch 000/469 | Gen/Dis Loss: 0.9974/0.5824\n",
|
|
"Epoch: 017/100 | Batch 100/469 | Gen/Dis Loss: 1.0259/0.6210\n",
|
|
"Epoch: 017/100 | Batch 200/469 | Gen/Dis Loss: 0.9149/0.6286\n",
|
|
"Epoch: 017/100 | Batch 300/469 | Gen/Dis Loss: 1.0055/0.5824\n",
|
|
"Epoch: 017/100 | Batch 400/469 | Gen/Dis Loss: 0.9480/0.6367\n",
|
|
"Time elapsed: 1.91 min\n",
|
|
"Epoch: 018/100 | Batch 000/469 | Gen/Dis Loss: 1.0554/0.6066\n",
|
|
"Epoch: 018/100 | Batch 100/469 | Gen/Dis Loss: 0.9175/0.6078\n",
|
|
"Epoch: 018/100 | Batch 200/469 | Gen/Dis Loss: 0.8957/0.6258\n",
|
|
"Epoch: 018/100 | Batch 300/469 | Gen/Dis Loss: 0.9580/0.6132\n",
|
|
"Epoch: 018/100 | Batch 400/469 | Gen/Dis Loss: 0.9345/0.6109\n",
|
|
"Time elapsed: 2.02 min\n",
|
|
"Epoch: 019/100 | Batch 000/469 | Gen/Dis Loss: 0.9828/0.6092\n",
|
|
"Epoch: 019/100 | Batch 100/469 | Gen/Dis Loss: 0.9119/0.6228\n",
|
|
"Epoch: 019/100 | Batch 200/469 | Gen/Dis Loss: 0.9198/0.6067\n",
|
|
"Epoch: 019/100 | Batch 300/469 | Gen/Dis Loss: 0.8892/0.6311\n",
|
|
"Epoch: 019/100 | Batch 400/469 | Gen/Dis Loss: 0.9002/0.6336\n",
|
|
"Time elapsed: 2.13 min\n",
|
|
"Epoch: 020/100 | Batch 000/469 | Gen/Dis Loss: 0.8469/0.6336\n",
|
|
"Epoch: 020/100 | Batch 100/469 | Gen/Dis Loss: 0.9294/0.6057\n",
|
|
"Epoch: 020/100 | Batch 200/469 | Gen/Dis Loss: 0.8978/0.6338\n",
|
|
"Epoch: 020/100 | Batch 300/469 | Gen/Dis Loss: 0.8667/0.6431\n",
|
|
"Epoch: 020/100 | Batch 400/469 | Gen/Dis Loss: 0.9466/0.6222\n",
|
|
"Time elapsed: 2.24 min\n",
|
|
"Epoch: 021/100 | Batch 000/469 | Gen/Dis Loss: 0.8880/0.6108\n",
|
|
"Epoch: 021/100 | Batch 100/469 | Gen/Dis Loss: 0.9087/0.6223\n",
|
|
"Epoch: 021/100 | Batch 200/469 | Gen/Dis Loss: 0.8987/0.6225\n",
|
|
"Epoch: 021/100 | Batch 300/469 | Gen/Dis Loss: 0.9042/0.6298\n",
|
|
"Epoch: 021/100 | Batch 400/469 | Gen/Dis Loss: 0.8999/0.6155\n",
|
|
"Time elapsed: 2.36 min\n",
|
|
"Epoch: 022/100 | Batch 000/469 | Gen/Dis Loss: 0.9178/0.6201\n",
|
|
"Epoch: 022/100 | Batch 100/469 | Gen/Dis Loss: 0.9107/0.6331\n",
|
|
"Epoch: 022/100 | Batch 200/469 | Gen/Dis Loss: 0.9610/0.6201\n",
|
|
"Epoch: 022/100 | Batch 300/469 | Gen/Dis Loss: 0.8632/0.6458\n",
|
|
"Epoch: 022/100 | Batch 400/469 | Gen/Dis Loss: 0.8947/0.6223\n",
|
|
"Time elapsed: 2.47 min\n",
|
|
"Epoch: 023/100 | Batch 000/469 | Gen/Dis Loss: 0.8869/0.6305\n",
|
|
"Epoch: 023/100 | Batch 100/469 | Gen/Dis Loss: 0.8689/0.6270\n",
|
|
"Epoch: 023/100 | Batch 200/469 | Gen/Dis Loss: 0.9208/0.5853\n",
|
|
"Epoch: 023/100 | Batch 300/469 | Gen/Dis Loss: 0.9038/0.6345\n",
|
|
"Epoch: 023/100 | Batch 400/469 | Gen/Dis Loss: 0.9289/0.6401\n",
|
|
"Time elapsed: 2.58 min\n",
|
|
"Epoch: 024/100 | Batch 000/469 | Gen/Dis Loss: 0.8647/0.6353\n",
|
|
"Epoch: 024/100 | Batch 100/469 | Gen/Dis Loss: 0.8548/0.6260\n",
|
|
"Epoch: 024/100 | Batch 200/469 | Gen/Dis Loss: 0.9138/0.6218\n",
|
|
"Epoch: 024/100 | Batch 300/469 | Gen/Dis Loss: 0.9182/0.6371\n",
|
|
"Epoch: 024/100 | Batch 400/469 | Gen/Dis Loss: 0.8995/0.6475\n",
|
|
"Time elapsed: 2.69 min\n",
|
|
"Epoch: 025/100 | Batch 000/469 | Gen/Dis Loss: 0.8810/0.6327\n",
|
|
"Epoch: 025/100 | Batch 100/469 | Gen/Dis Loss: 0.8602/0.6528\n",
|
|
"Epoch: 025/100 | Batch 200/469 | Gen/Dis Loss: 0.9301/0.6224\n",
|
|
"Epoch: 025/100 | Batch 300/469 | Gen/Dis Loss: 0.8608/0.6412\n",
|
|
"Epoch: 025/100 | Batch 400/469 | Gen/Dis Loss: 0.8841/0.6334\n",
|
|
"Time elapsed: 2.81 min\n",
|
|
"Epoch: 026/100 | Batch 000/469 | Gen/Dis Loss: 0.8725/0.6535\n",
|
|
"Epoch: 026/100 | Batch 100/469 | Gen/Dis Loss: 0.8364/0.6445\n",
|
|
"Epoch: 026/100 | Batch 200/469 | Gen/Dis Loss: 0.8932/0.6317\n",
|
|
"Epoch: 026/100 | Batch 300/469 | Gen/Dis Loss: 0.8917/0.6443\n",
|
|
"Epoch: 026/100 | Batch 400/469 | Gen/Dis Loss: 0.9525/0.6246\n",
|
|
"Time elapsed: 2.92 min\n",
|
|
"Epoch: 027/100 | Batch 000/469 | Gen/Dis Loss: 0.9090/0.6156\n",
|
|
"Epoch: 027/100 | Batch 100/469 | Gen/Dis Loss: 0.8831/0.6419\n",
|
|
"Epoch: 027/100 | Batch 200/469 | Gen/Dis Loss: 0.8410/0.6749\n",
|
|
"Epoch: 027/100 | Batch 300/469 | Gen/Dis Loss: 0.8807/0.6328\n",
|
|
"Epoch: 027/100 | Batch 400/469 | Gen/Dis Loss: 0.9155/0.6622\n",
|
|
"Time elapsed: 3.03 min\n",
|
|
"Epoch: 028/100 | Batch 000/469 | Gen/Dis Loss: 0.8852/0.6346\n",
|
|
"Epoch: 028/100 | Batch 100/469 | Gen/Dis Loss: 0.8874/0.6336\n",
|
|
"Epoch: 028/100 | Batch 200/469 | Gen/Dis Loss: 0.9072/0.6393\n",
|
|
"Epoch: 028/100 | Batch 300/469 | Gen/Dis Loss: 0.7987/0.6813\n",
|
|
"Epoch: 028/100 | Batch 400/469 | Gen/Dis Loss: 0.8685/0.6251\n",
|
|
"Time elapsed: 3.14 min\n",
|
|
"Epoch: 029/100 | Batch 000/469 | Gen/Dis Loss: 0.9025/0.6621\n",
|
|
"Epoch: 029/100 | Batch 100/469 | Gen/Dis Loss: 0.9036/0.6609\n",
|
|
"Epoch: 029/100 | Batch 200/469 | Gen/Dis Loss: 0.8844/0.6401\n",
|
|
"Epoch: 029/100 | Batch 300/469 | Gen/Dis Loss: 0.9103/0.6305\n",
|
|
"Epoch: 029/100 | Batch 400/469 | Gen/Dis Loss: 0.8738/0.6678\n",
|
|
"Time elapsed: 3.25 min\n",
|
|
"Epoch: 030/100 | Batch 000/469 | Gen/Dis Loss: 0.8770/0.6558\n",
|
|
"Epoch: 030/100 | Batch 100/469 | Gen/Dis Loss: 0.8777/0.6417\n",
|
|
"Epoch: 030/100 | Batch 200/469 | Gen/Dis Loss: 0.8661/0.6318\n",
|
|
"Epoch: 030/100 | Batch 300/469 | Gen/Dis Loss: 0.8992/0.6237\n",
|
|
"Epoch: 030/100 | Batch 400/469 | Gen/Dis Loss: 0.8660/0.6611\n",
|
|
"Time elapsed: 3.37 min\n",
|
|
"Epoch: 031/100 | Batch 000/469 | Gen/Dis Loss: 0.8464/0.6461\n",
|
|
"Epoch: 031/100 | Batch 100/469 | Gen/Dis Loss: 0.8828/0.6642\n",
|
|
"Epoch: 031/100 | Batch 200/469 | Gen/Dis Loss: 0.8679/0.6387\n",
|
|
"Epoch: 031/100 | Batch 300/469 | Gen/Dis Loss: 0.8572/0.6772\n",
|
|
"Epoch: 031/100 | Batch 400/469 | Gen/Dis Loss: 0.9429/0.6233\n",
|
|
"Time elapsed: 3.48 min\n",
|
|
"Epoch: 032/100 | Batch 000/469 | Gen/Dis Loss: 0.8767/0.6489\n",
|
|
"Epoch: 032/100 | Batch 100/469 | Gen/Dis Loss: 0.8048/0.6767\n",
|
|
"Epoch: 032/100 | Batch 200/469 | Gen/Dis Loss: 0.8681/0.6351\n",
|
|
"Epoch: 032/100 | Batch 300/469 | Gen/Dis Loss: 0.8601/0.6436\n",
|
|
"Epoch: 032/100 | Batch 400/469 | Gen/Dis Loss: 0.8666/0.6630\n",
|
|
"Time elapsed: 3.59 min\n",
|
|
"Epoch: 033/100 | Batch 000/469 | Gen/Dis Loss: 0.8771/0.6336\n",
|
|
"Epoch: 033/100 | Batch 100/469 | Gen/Dis Loss: 0.9111/0.6487\n",
|
|
"Epoch: 033/100 | Batch 200/469 | Gen/Dis Loss: 0.8550/0.6380\n",
|
|
"Epoch: 033/100 | Batch 300/469 | Gen/Dis Loss: 0.8190/0.6745\n",
|
|
"Epoch: 033/100 | Batch 400/469 | Gen/Dis Loss: 0.8462/0.6554\n",
|
|
"Time elapsed: 3.70 min\n",
|
|
"Epoch: 034/100 | Batch 000/469 | Gen/Dis Loss: 0.9088/0.6501\n",
|
|
"Epoch: 034/100 | Batch 100/469 | Gen/Dis Loss: 0.8250/0.6630\n",
|
|
"Epoch: 034/100 | Batch 200/469 | Gen/Dis Loss: 0.8822/0.6423\n",
|
|
"Epoch: 034/100 | Batch 300/469 | Gen/Dis Loss: 0.8658/0.6655\n",
|
|
"Epoch: 034/100 | Batch 400/469 | Gen/Dis Loss: 0.8741/0.6508\n",
|
|
"Time elapsed: 3.81 min\n",
|
|
"Epoch: 035/100 | Batch 000/469 | Gen/Dis Loss: 0.8069/0.6803\n",
|
|
"Epoch: 035/100 | Batch 100/469 | Gen/Dis Loss: 0.8712/0.6515\n",
|
|
"Epoch: 035/100 | Batch 200/469 | Gen/Dis Loss: 0.8320/0.6476\n",
|
|
"Epoch: 035/100 | Batch 300/469 | Gen/Dis Loss: 0.8694/0.6488\n",
|
|
"Epoch: 035/100 | Batch 400/469 | Gen/Dis Loss: 0.8796/0.6346\n",
|
|
"Time elapsed: 3.93 min\n",
|
|
"Epoch: 036/100 | Batch 000/469 | Gen/Dis Loss: 0.8380/0.6704\n",
|
|
"Epoch: 036/100 | Batch 100/469 | Gen/Dis Loss: 0.8539/0.7126\n",
|
|
"Epoch: 036/100 | Batch 200/469 | Gen/Dis Loss: 0.8768/0.6607\n",
|
|
"Epoch: 036/100 | Batch 300/469 | Gen/Dis Loss: 0.8559/0.6335\n",
|
|
"Epoch: 036/100 | Batch 400/469 | Gen/Dis Loss: 0.8209/0.6547\n",
|
|
"Time elapsed: 4.04 min\n",
|
|
"Epoch: 037/100 | Batch 000/469 | Gen/Dis Loss: 0.8169/0.6817\n",
|
|
"Epoch: 037/100 | Batch 100/469 | Gen/Dis Loss: 0.7988/0.6848\n",
|
|
"Epoch: 037/100 | Batch 200/469 | Gen/Dis Loss: 0.9129/0.6380\n",
|
|
"Epoch: 037/100 | Batch 300/469 | Gen/Dis Loss: 0.8525/0.6541\n",
|
|
"Epoch: 037/100 | Batch 400/469 | Gen/Dis Loss: 0.8710/0.6376\n",
|
|
"Time elapsed: 4.15 min\n",
|
|
"Epoch: 038/100 | Batch 000/469 | Gen/Dis Loss: 0.8181/0.6473\n",
|
|
"Epoch: 038/100 | Batch 100/469 | Gen/Dis Loss: 0.8506/0.6422\n",
|
|
"Epoch: 038/100 | Batch 200/469 | Gen/Dis Loss: 0.8217/0.6751\n",
|
|
"Epoch: 038/100 | Batch 300/469 | Gen/Dis Loss: 0.8572/0.6677\n",
|
|
"Epoch: 038/100 | Batch 400/469 | Gen/Dis Loss: 0.8449/0.6601\n",
|
|
"Time elapsed: 4.26 min\n",
|
|
"Epoch: 039/100 | Batch 000/469 | Gen/Dis Loss: 0.8411/0.6787\n",
|
|
"Epoch: 039/100 | Batch 100/469 | Gen/Dis Loss: 0.8835/0.6549\n",
|
|
"Epoch: 039/100 | Batch 200/469 | Gen/Dis Loss: 0.8337/0.6673\n",
|
|
"Epoch: 039/100 | Batch 300/469 | Gen/Dis Loss: 0.8514/0.6984\n",
|
|
"Epoch: 039/100 | Batch 400/469 | Gen/Dis Loss: 0.8631/0.6412\n",
|
|
"Time elapsed: 4.37 min\n",
|
|
"Epoch: 040/100 | Batch 000/469 | Gen/Dis Loss: 0.8176/0.6792\n",
|
|
"Epoch: 040/100 | Batch 100/469 | Gen/Dis Loss: 0.8179/0.6850\n",
|
|
"Epoch: 040/100 | Batch 200/469 | Gen/Dis Loss: 0.8335/0.6718\n",
|
|
"Epoch: 040/100 | Batch 300/469 | Gen/Dis Loss: 0.8859/0.6825\n",
|
|
"Epoch: 040/100 | Batch 400/469 | Gen/Dis Loss: 0.8693/0.6730\n",
|
|
"Time elapsed: 4.49 min\n",
|
|
"Epoch: 041/100 | Batch 000/469 | Gen/Dis Loss: 0.8637/0.6343\n",
|
|
"Epoch: 041/100 | Batch 100/469 | Gen/Dis Loss: 0.8636/0.6539\n",
|
|
"Epoch: 041/100 | Batch 200/469 | Gen/Dis Loss: 0.8955/0.6711\n",
|
|
"Epoch: 041/100 | Batch 300/469 | Gen/Dis Loss: 0.8251/0.6857\n",
|
|
"Epoch: 041/100 | Batch 400/469 | Gen/Dis Loss: 0.8457/0.6643\n",
|
|
"Time elapsed: 4.60 min\n",
|
|
"Epoch: 042/100 | Batch 000/469 | Gen/Dis Loss: 0.8629/0.6490\n",
|
|
"Epoch: 042/100 | Batch 100/469 | Gen/Dis Loss: 0.8323/0.6871\n",
|
|
"Epoch: 042/100 | Batch 200/469 | Gen/Dis Loss: 0.8808/0.6699\n",
|
|
"Epoch: 042/100 | Batch 300/469 | Gen/Dis Loss: 0.8435/0.6640\n",
|
|
"Epoch: 042/100 | Batch 400/469 | Gen/Dis Loss: 0.8558/0.6665\n",
|
|
"Time elapsed: 4.71 min\n",
|
|
"Epoch: 043/100 | Batch 000/469 | Gen/Dis Loss: 0.8284/0.6654\n",
|
|
"Epoch: 043/100 | Batch 100/469 | Gen/Dis Loss: 0.8199/0.6679\n",
|
|
"Epoch: 043/100 | Batch 200/469 | Gen/Dis Loss: 0.8216/0.6837\n",
|
|
"Epoch: 043/100 | Batch 300/469 | Gen/Dis Loss: 0.8753/0.6456\n",
|
|
"Epoch: 043/100 | Batch 400/469 | Gen/Dis Loss: 0.8230/0.6883\n",
|
|
"Time elapsed: 4.82 min\n",
|
|
"Epoch: 044/100 | Batch 000/469 | Gen/Dis Loss: 0.8064/0.6730\n",
|
|
"Epoch: 044/100 | Batch 100/469 | Gen/Dis Loss: 0.8188/0.6722\n",
|
|
"Epoch: 044/100 | Batch 200/469 | Gen/Dis Loss: 0.8221/0.6905\n",
|
|
"Epoch: 044/100 | Batch 300/469 | Gen/Dis Loss: 0.8629/0.6760\n",
|
|
"Epoch: 044/100 | Batch 400/469 | Gen/Dis Loss: 0.8290/0.6629\n",
|
|
"Time elapsed: 4.93 min\n",
|
|
"Epoch: 045/100 | Batch 000/469 | Gen/Dis Loss: 0.8116/0.7203\n",
|
|
"Epoch: 045/100 | Batch 100/469 | Gen/Dis Loss: 0.7893/0.6742\n",
|
|
"Epoch: 045/100 | Batch 200/469 | Gen/Dis Loss: 0.8578/0.6751\n",
|
|
"Epoch: 045/100 | Batch 300/469 | Gen/Dis Loss: 0.8131/0.6710\n",
|
|
"Epoch: 045/100 | Batch 400/469 | Gen/Dis Loss: 0.7831/0.6693\n",
|
|
"Time elapsed: 5.04 min\n",
|
|
"Epoch: 046/100 | Batch 000/469 | Gen/Dis Loss: 0.8430/0.6424\n",
|
|
"Epoch: 046/100 | Batch 100/469 | Gen/Dis Loss: 0.7889/0.7069\n",
|
|
"Epoch: 046/100 | Batch 200/469 | Gen/Dis Loss: 0.8079/0.6661\n",
|
|
"Epoch: 046/100 | Batch 300/469 | Gen/Dis Loss: 0.7796/0.6824\n",
|
|
"Epoch: 046/100 | Batch 400/469 | Gen/Dis Loss: 0.7898/0.6977\n",
|
|
"Time elapsed: 5.16 min\n",
|
|
"Epoch: 047/100 | Batch 000/469 | Gen/Dis Loss: 0.8528/0.6542\n",
|
|
"Epoch: 047/100 | Batch 100/469 | Gen/Dis Loss: 0.8487/0.6886\n",
|
|
"Epoch: 047/100 | Batch 200/469 | Gen/Dis Loss: 0.8615/0.6819\n",
|
|
"Epoch: 047/100 | Batch 300/469 | Gen/Dis Loss: 0.8190/0.6941\n",
|
|
"Epoch: 047/100 | Batch 400/469 | Gen/Dis Loss: 0.8235/0.6894\n",
|
|
"Time elapsed: 5.27 min\n",
|
|
"Epoch: 048/100 | Batch 000/469 | Gen/Dis Loss: 0.8294/0.6434\n",
|
|
"Epoch: 048/100 | Batch 100/469 | Gen/Dis Loss: 0.8551/0.6369\n",
|
|
"Epoch: 048/100 | Batch 200/469 | Gen/Dis Loss: 0.8261/0.6878\n",
|
|
"Epoch: 048/100 | Batch 300/469 | Gen/Dis Loss: 0.8543/0.6716\n",
|
|
"Epoch: 048/100 | Batch 400/469 | Gen/Dis Loss: 0.8294/0.6522\n",
|
|
"Time elapsed: 5.38 min\n",
|
|
"Epoch: 049/100 | Batch 000/469 | Gen/Dis Loss: 0.8247/0.6794\n",
|
|
"Epoch: 049/100 | Batch 100/469 | Gen/Dis Loss: 0.8154/0.6647\n",
|
|
"Epoch: 049/100 | Batch 200/469 | Gen/Dis Loss: 0.8296/0.6700\n",
|
|
"Epoch: 049/100 | Batch 300/469 | Gen/Dis Loss: 0.8172/0.6740\n",
|
|
"Epoch: 049/100 | Batch 400/469 | Gen/Dis Loss: 0.7691/0.6888\n",
|
|
"Time elapsed: 5.50 min\n",
|
|
"Epoch: 050/100 | Batch 000/469 | Gen/Dis Loss: 0.8136/0.6549\n",
|
|
"Epoch: 050/100 | Batch 100/469 | Gen/Dis Loss: 0.8024/0.6925\n",
|
|
"Epoch: 050/100 | Batch 200/469 | Gen/Dis Loss: 0.8419/0.6766\n",
|
|
"Epoch: 050/100 | Batch 300/469 | Gen/Dis Loss: 0.8240/0.6709\n",
|
|
"Epoch: 050/100 | Batch 400/469 | Gen/Dis Loss: 0.8292/0.7057\n",
|
|
"Time elapsed: 5.61 min\n",
|
|
"Epoch: 051/100 | Batch 000/469 | Gen/Dis Loss: 0.8241/0.6891\n",
|
|
"Epoch: 051/100 | Batch 100/469 | Gen/Dis Loss: 0.8210/0.6406\n",
|
|
"Epoch: 051/100 | Batch 200/469 | Gen/Dis Loss: 0.8175/0.6689\n",
|
|
"Epoch: 051/100 | Batch 300/469 | Gen/Dis Loss: 0.8334/0.6648\n",
|
|
"Epoch: 051/100 | Batch 400/469 | Gen/Dis Loss: 0.8267/0.6711\n",
|
|
"Time elapsed: 5.72 min\n",
|
|
"Epoch: 052/100 | Batch 000/469 | Gen/Dis Loss: 0.8039/0.6805\n",
|
|
"Epoch: 052/100 | Batch 100/469 | Gen/Dis Loss: 0.8033/0.6857\n",
|
|
"Epoch: 052/100 | Batch 200/469 | Gen/Dis Loss: 0.8536/0.6880\n",
|
|
"Epoch: 052/100 | Batch 300/469 | Gen/Dis Loss: 0.8393/0.6800\n",
|
|
"Epoch: 052/100 | Batch 400/469 | Gen/Dis Loss: 0.8459/0.6822\n",
|
|
"Time elapsed: 5.83 min\n",
|
|
"Epoch: 053/100 | Batch 000/469 | Gen/Dis Loss: 0.8290/0.6822\n",
|
|
"Epoch: 053/100 | Batch 100/469 | Gen/Dis Loss: 0.8169/0.6643\n",
|
|
"Epoch: 053/100 | Batch 200/469 | Gen/Dis Loss: 0.8152/0.7038\n",
|
|
"Epoch: 053/100 | Batch 300/469 | Gen/Dis Loss: 0.7998/0.6949\n",
|
|
"Epoch: 053/100 | Batch 400/469 | Gen/Dis Loss: 0.8221/0.6876\n",
|
|
"Time elapsed: 5.95 min\n",
|
|
"Epoch: 054/100 | Batch 000/469 | Gen/Dis Loss: 0.8186/0.6600\n",
|
|
"Epoch: 054/100 | Batch 100/469 | Gen/Dis Loss: 0.8263/0.6638\n",
|
|
"Epoch: 054/100 | Batch 200/469 | Gen/Dis Loss: 0.7962/0.6765\n",
|
|
"Epoch: 054/100 | Batch 300/469 | Gen/Dis Loss: 0.8101/0.6706\n",
|
|
"Epoch: 054/100 | Batch 400/469 | Gen/Dis Loss: 0.8175/0.6851\n",
|
|
"Time elapsed: 6.06 min\n",
|
|
"Epoch: 055/100 | Batch 000/469 | Gen/Dis Loss: 0.8339/0.6888\n",
|
|
"Epoch: 055/100 | Batch 100/469 | Gen/Dis Loss: 0.7916/0.6795\n",
|
|
"Epoch: 055/100 | Batch 200/469 | Gen/Dis Loss: 0.8209/0.6790\n",
|
|
"Epoch: 055/100 | Batch 300/469 | Gen/Dis Loss: 0.7967/0.6828\n",
|
|
"Epoch: 055/100 | Batch 400/469 | Gen/Dis Loss: 0.7860/0.6943\n",
|
|
"Time elapsed: 6.17 min\n",
|
|
"Epoch: 056/100 | Batch 000/469 | Gen/Dis Loss: 0.8065/0.6708\n",
|
|
"Epoch: 056/100 | Batch 100/469 | Gen/Dis Loss: 0.8027/0.6784\n",
|
|
"Epoch: 056/100 | Batch 200/469 | Gen/Dis Loss: 0.8216/0.6949\n",
|
|
"Epoch: 056/100 | Batch 300/469 | Gen/Dis Loss: 0.8061/0.6921\n",
|
|
"Epoch: 056/100 | Batch 400/469 | Gen/Dis Loss: 0.7812/0.6780\n",
|
|
"Time elapsed: 6.29 min\n",
|
|
"Epoch: 057/100 | Batch 000/469 | Gen/Dis Loss: 0.8028/0.6936\n",
|
|
"Epoch: 057/100 | Batch 100/469 | Gen/Dis Loss: 0.7970/0.6710\n",
|
|
"Epoch: 057/100 | Batch 200/469 | Gen/Dis Loss: 0.8144/0.6570\n",
|
|
"Epoch: 057/100 | Batch 300/469 | Gen/Dis Loss: 0.8362/0.6975\n",
|
|
"Epoch: 057/100 | Batch 400/469 | Gen/Dis Loss: 0.8126/0.6814\n",
|
|
"Time elapsed: 6.40 min\n",
|
|
"Epoch: 058/100 | Batch 000/469 | Gen/Dis Loss: 0.8091/0.6785\n",
|
|
"Epoch: 058/100 | Batch 100/469 | Gen/Dis Loss: 0.8226/0.6765\n",
|
|
"Epoch: 058/100 | Batch 200/469 | Gen/Dis Loss: 0.8024/0.6644\n",
|
|
"Epoch: 058/100 | Batch 300/469 | Gen/Dis Loss: 0.8224/0.6783\n",
|
|
"Epoch: 058/100 | Batch 400/469 | Gen/Dis Loss: 0.8211/0.6676\n",
|
|
"Time elapsed: 6.51 min\n",
|
|
"Epoch: 059/100 | Batch 000/469 | Gen/Dis Loss: 0.8184/0.6810\n",
|
|
"Epoch: 059/100 | Batch 100/469 | Gen/Dis Loss: 0.8051/0.6849\n",
|
|
"Epoch: 059/100 | Batch 200/469 | Gen/Dis Loss: 0.7756/0.6998\n",
|
|
"Epoch: 059/100 | Batch 300/469 | Gen/Dis Loss: 0.8144/0.6788\n",
|
|
"Epoch: 059/100 | Batch 400/469 | Gen/Dis Loss: 0.7813/0.6970\n",
|
|
"Time elapsed: 6.62 min\n",
|
|
"Epoch: 060/100 | Batch 000/469 | Gen/Dis Loss: 0.7938/0.6800\n",
|
|
"Epoch: 060/100 | Batch 100/469 | Gen/Dis Loss: 0.8060/0.6659\n",
|
|
"Epoch: 060/100 | Batch 200/469 | Gen/Dis Loss: 0.7827/0.6901\n",
|
|
"Epoch: 060/100 | Batch 300/469 | Gen/Dis Loss: 0.7546/0.6998\n",
|
|
"Epoch: 060/100 | Batch 400/469 | Gen/Dis Loss: 0.8366/0.6722\n",
|
|
"Time elapsed: 6.74 min\n",
|
|
"Epoch: 061/100 | Batch 000/469 | Gen/Dis Loss: 0.7903/0.6879\n",
|
|
"Epoch: 061/100 | Batch 100/469 | Gen/Dis Loss: 0.8260/0.6663\n",
|
|
"Epoch: 061/100 | Batch 200/469 | Gen/Dis Loss: 0.7947/0.6939\n",
|
|
"Epoch: 061/100 | Batch 300/469 | Gen/Dis Loss: 0.8143/0.6850\n",
|
|
"Epoch: 061/100 | Batch 400/469 | Gen/Dis Loss: 0.8254/0.7004\n",
|
|
"Time elapsed: 6.85 min\n",
|
|
"Epoch: 062/100 | Batch 000/469 | Gen/Dis Loss: 0.8099/0.6758\n",
|
|
"Epoch: 062/100 | Batch 100/469 | Gen/Dis Loss: 0.8110/0.6889\n",
|
|
"Epoch: 062/100 | Batch 200/469 | Gen/Dis Loss: 0.8379/0.6662\n",
|
|
"Epoch: 062/100 | Batch 300/469 | Gen/Dis Loss: 0.7999/0.7036\n",
|
|
"Epoch: 062/100 | Batch 400/469 | Gen/Dis Loss: 0.7776/0.6999\n",
|
|
"Time elapsed: 6.96 min\n",
|
|
"Epoch: 063/100 | Batch 000/469 | Gen/Dis Loss: 0.8082/0.6919\n",
|
|
"Epoch: 063/100 | Batch 100/469 | Gen/Dis Loss: 0.8226/0.6808\n",
|
|
"Epoch: 063/100 | Batch 200/469 | Gen/Dis Loss: 0.8243/0.6834\n",
|
|
"Epoch: 063/100 | Batch 300/469 | Gen/Dis Loss: 0.8286/0.6845\n",
|
|
"Epoch: 063/100 | Batch 400/469 | Gen/Dis Loss: 0.8146/0.6853\n",
|
|
"Time elapsed: 7.08 min\n",
|
|
"Epoch: 064/100 | Batch 000/469 | Gen/Dis Loss: 0.8272/0.6534\n",
|
|
"Epoch: 064/100 | Batch 100/469 | Gen/Dis Loss: 0.7547/0.6936\n",
|
|
"Epoch: 064/100 | Batch 200/469 | Gen/Dis Loss: 0.8200/0.6931\n",
|
|
"Epoch: 064/100 | Batch 300/469 | Gen/Dis Loss: 0.7810/0.7169\n",
|
|
"Epoch: 064/100 | Batch 400/469 | Gen/Dis Loss: 0.7973/0.6703\n",
|
|
"Time elapsed: 7.19 min\n",
|
|
"Epoch: 065/100 | Batch 000/469 | Gen/Dis Loss: 0.8039/0.6848\n",
|
|
"Epoch: 065/100 | Batch 100/469 | Gen/Dis Loss: 0.8189/0.6752\n",
|
|
"Epoch: 065/100 | Batch 200/469 | Gen/Dis Loss: 0.8231/0.6467\n",
|
|
"Epoch: 065/100 | Batch 300/469 | Gen/Dis Loss: 0.8024/0.6888\n",
|
|
"Epoch: 065/100 | Batch 400/469 | Gen/Dis Loss: 0.8004/0.6713\n",
|
|
"Time elapsed: 7.30 min\n",
|
|
"Epoch: 066/100 | Batch 000/469 | Gen/Dis Loss: 0.8205/0.6749\n",
|
|
"Epoch: 066/100 | Batch 100/469 | Gen/Dis Loss: 0.8348/0.6903\n",
|
|
"Epoch: 066/100 | Batch 200/469 | Gen/Dis Loss: 0.7824/0.6773\n",
|
|
"Epoch: 066/100 | Batch 300/469 | Gen/Dis Loss: 0.8135/0.6842\n",
|
|
"Epoch: 066/100 | Batch 400/469 | Gen/Dis Loss: 0.8020/0.6871\n",
|
|
"Time elapsed: 7.41 min\n",
|
|
"Epoch: 067/100 | Batch 000/469 | Gen/Dis Loss: 0.8375/0.6899\n",
|
|
"Epoch: 067/100 | Batch 100/469 | Gen/Dis Loss: 0.8415/0.6502\n",
|
|
"Epoch: 067/100 | Batch 200/469 | Gen/Dis Loss: 0.8038/0.6907\n",
|
|
"Epoch: 067/100 | Batch 300/469 | Gen/Dis Loss: 0.8012/0.6827\n",
|
|
"Epoch: 067/100 | Batch 400/469 | Gen/Dis Loss: 0.8280/0.6516\n",
|
|
"Time elapsed: 7.52 min\n",
|
|
"Epoch: 068/100 | Batch 000/469 | Gen/Dis Loss: 0.8243/0.6744\n",
|
|
"Epoch: 068/100 | Batch 100/469 | Gen/Dis Loss: 0.7850/0.6963\n",
|
|
"Epoch: 068/100 | Batch 200/469 | Gen/Dis Loss: 0.8075/0.6751\n",
|
|
"Epoch: 068/100 | Batch 300/469 | Gen/Dis Loss: 0.7744/0.6990\n",
|
|
"Epoch: 068/100 | Batch 400/469 | Gen/Dis Loss: 0.7846/0.7015\n",
|
|
"Time elapsed: 7.64 min\n",
|
|
"Epoch: 069/100 | Batch 000/469 | Gen/Dis Loss: 0.8104/0.6562\n",
|
|
"Epoch: 069/100 | Batch 100/469 | Gen/Dis Loss: 0.8232/0.6599\n",
|
|
"Epoch: 069/100 | Batch 200/469 | Gen/Dis Loss: 0.7739/0.7005\n",
|
|
"Epoch: 069/100 | Batch 300/469 | Gen/Dis Loss: 0.8124/0.6825\n",
|
|
"Epoch: 069/100 | Batch 400/469 | Gen/Dis Loss: 0.7923/0.6777\n",
|
|
"Time elapsed: 7.75 min\n",
|
|
"Epoch: 070/100 | Batch 000/469 | Gen/Dis Loss: 0.8202/0.6757\n",
|
|
"Epoch: 070/100 | Batch 100/469 | Gen/Dis Loss: 0.8105/0.6709\n",
|
|
"Epoch: 070/100 | Batch 200/469 | Gen/Dis Loss: 0.8243/0.6694\n",
|
|
"Epoch: 070/100 | Batch 300/469 | Gen/Dis Loss: 0.7710/0.7105\n",
|
|
"Epoch: 070/100 | Batch 400/469 | Gen/Dis Loss: 0.7999/0.6887\n",
|
|
"Time elapsed: 7.86 min\n",
|
|
"Epoch: 071/100 | Batch 000/469 | Gen/Dis Loss: 0.8027/0.6959\n",
|
|
"Epoch: 071/100 | Batch 100/469 | Gen/Dis Loss: 0.8212/0.6674\n",
|
|
"Epoch: 071/100 | Batch 200/469 | Gen/Dis Loss: 0.7930/0.7007\n",
|
|
"Epoch: 071/100 | Batch 300/469 | Gen/Dis Loss: 0.7962/0.6659\n",
|
|
"Epoch: 071/100 | Batch 400/469 | Gen/Dis Loss: 0.8309/0.6706\n",
|
|
"Time elapsed: 7.98 min\n",
|
|
"Epoch: 072/100 | Batch 000/469 | Gen/Dis Loss: 0.8067/0.6787\n",
|
|
"Epoch: 072/100 | Batch 100/469 | Gen/Dis Loss: 0.7947/0.6916\n",
|
|
"Epoch: 072/100 | Batch 200/469 | Gen/Dis Loss: 0.8097/0.6599\n",
|
|
"Epoch: 072/100 | Batch 300/469 | Gen/Dis Loss: 0.8121/0.6787\n",
|
|
"Epoch: 072/100 | Batch 400/469 | Gen/Dis Loss: 0.8151/0.6584\n",
|
|
"Time elapsed: 8.09 min\n",
|
|
"Epoch: 073/100 | Batch 000/469 | Gen/Dis Loss: 0.8355/0.6564\n",
|
|
"Epoch: 073/100 | Batch 100/469 | Gen/Dis Loss: 0.7916/0.6759\n",
|
|
"Epoch: 073/100 | Batch 200/469 | Gen/Dis Loss: 0.8294/0.6777\n",
|
|
"Epoch: 073/100 | Batch 300/469 | Gen/Dis Loss: 0.7953/0.7039\n",
|
|
"Epoch: 073/100 | Batch 400/469 | Gen/Dis Loss: 0.8148/0.6732\n",
|
|
"Time elapsed: 8.20 min\n",
|
|
"Epoch: 074/100 | Batch 000/469 | Gen/Dis Loss: 0.8205/0.7029\n",
|
|
"Epoch: 074/100 | Batch 100/469 | Gen/Dis Loss: 0.7841/0.6938\n",
|
|
"Epoch: 074/100 | Batch 200/469 | Gen/Dis Loss: 0.8151/0.6749\n",
|
|
"Epoch: 074/100 | Batch 300/469 | Gen/Dis Loss: 0.7798/0.7146\n",
|
|
"Epoch: 074/100 | Batch 400/469 | Gen/Dis Loss: 0.8040/0.6845\n",
|
|
"Time elapsed: 8.31 min\n",
|
|
"Epoch: 075/100 | Batch 000/469 | Gen/Dis Loss: 0.7752/0.6972\n",
|
|
"Epoch: 075/100 | Batch 100/469 | Gen/Dis Loss: 0.8305/0.6842\n",
|
|
"Epoch: 075/100 | Batch 200/469 | Gen/Dis Loss: 0.7700/0.6857\n",
|
|
"Epoch: 075/100 | Batch 300/469 | Gen/Dis Loss: 0.7791/0.6964\n",
|
|
"Epoch: 075/100 | Batch 400/469 | Gen/Dis Loss: 0.7983/0.6863\n",
|
|
"Time elapsed: 8.42 min\n",
|
|
"Epoch: 076/100 | Batch 000/469 | Gen/Dis Loss: 0.7717/0.6964\n",
|
|
"Epoch: 076/100 | Batch 100/469 | Gen/Dis Loss: 0.7918/0.6895\n",
|
|
"Epoch: 076/100 | Batch 200/469 | Gen/Dis Loss: 0.8036/0.7043\n",
|
|
"Epoch: 076/100 | Batch 300/469 | Gen/Dis Loss: 0.8040/0.6734\n",
|
|
"Epoch: 076/100 | Batch 400/469 | Gen/Dis Loss: 0.8152/0.6892\n",
|
|
"Time elapsed: 8.54 min\n",
|
|
"Epoch: 077/100 | Batch 000/469 | Gen/Dis Loss: 0.7971/0.6683\n",
|
|
"Epoch: 077/100 | Batch 100/469 | Gen/Dis Loss: 0.7789/0.6932\n",
|
|
"Epoch: 077/100 | Batch 200/469 | Gen/Dis Loss: 0.8015/0.6643\n",
|
|
"Epoch: 077/100 | Batch 300/469 | Gen/Dis Loss: 0.7693/0.7141\n",
|
|
"Epoch: 077/100 | Batch 400/469 | Gen/Dis Loss: 0.7819/0.6919\n",
|
|
"Time elapsed: 8.65 min\n",
|
|
"Epoch: 078/100 | Batch 000/469 | Gen/Dis Loss: 0.8316/0.6821\n",
|
|
"Epoch: 078/100 | Batch 100/469 | Gen/Dis Loss: 0.7907/0.6816\n",
|
|
"Epoch: 078/100 | Batch 200/469 | Gen/Dis Loss: 0.8368/0.6695\n",
|
|
"Epoch: 078/100 | Batch 300/469 | Gen/Dis Loss: 0.8224/0.6707\n",
|
|
"Epoch: 078/100 | Batch 400/469 | Gen/Dis Loss: 0.7810/0.7095\n",
|
|
"Time elapsed: 8.76 min\n",
|
|
"Epoch: 079/100 | Batch 000/469 | Gen/Dis Loss: 0.7660/0.7034\n",
|
|
"Epoch: 079/100 | Batch 100/469 | Gen/Dis Loss: 0.7869/0.6864\n",
|
|
"Epoch: 079/100 | Batch 200/469 | Gen/Dis Loss: 0.7815/0.6885\n",
|
|
"Epoch: 079/100 | Batch 300/469 | Gen/Dis Loss: 0.8049/0.6789\n",
|
|
"Epoch: 079/100 | Batch 400/469 | Gen/Dis Loss: 0.8154/0.6923\n",
|
|
"Time elapsed: 8.87 min\n",
|
|
"Epoch: 080/100 | Batch 000/469 | Gen/Dis Loss: 0.7851/0.6754\n",
|
|
"Epoch: 080/100 | Batch 100/469 | Gen/Dis Loss: 0.8187/0.6666\n",
|
|
"Epoch: 080/100 | Batch 200/469 | Gen/Dis Loss: 0.7978/0.6959\n",
|
|
"Epoch: 080/100 | Batch 300/469 | Gen/Dis Loss: 0.8052/0.6752\n",
|
|
"Epoch: 080/100 | Batch 400/469 | Gen/Dis Loss: 0.7857/0.6899\n",
|
|
"Time elapsed: 8.98 min\n",
|
|
"Epoch: 081/100 | Batch 000/469 | Gen/Dis Loss: 0.8003/0.6945\n",
|
|
"Epoch: 081/100 | Batch 100/469 | Gen/Dis Loss: 0.8212/0.6729\n",
|
|
"Epoch: 081/100 | Batch 200/469 | Gen/Dis Loss: 0.7986/0.6949\n",
|
|
"Epoch: 081/100 | Batch 300/469 | Gen/Dis Loss: 0.8181/0.6839\n",
|
|
"Epoch: 081/100 | Batch 400/469 | Gen/Dis Loss: 0.8209/0.6766\n",
|
|
"Time elapsed: 9.09 min\n",
|
|
"Epoch: 082/100 | Batch 000/469 | Gen/Dis Loss: 0.8000/0.6711\n",
|
|
"Epoch: 082/100 | Batch 100/469 | Gen/Dis Loss: 0.8127/0.6659\n",
|
|
"Epoch: 082/100 | Batch 200/469 | Gen/Dis Loss: 0.8151/0.6814\n",
|
|
"Epoch: 082/100 | Batch 300/469 | Gen/Dis Loss: 0.7647/0.6948\n",
|
|
"Epoch: 082/100 | Batch 400/469 | Gen/Dis Loss: 0.8135/0.6856\n",
|
|
"Time elapsed: 9.20 min\n",
|
|
"Epoch: 083/100 | Batch 000/469 | Gen/Dis Loss: 0.7892/0.6845\n",
|
|
"Epoch: 083/100 | Batch 100/469 | Gen/Dis Loss: 0.7993/0.6722\n",
|
|
"Epoch: 083/100 | Batch 200/469 | Gen/Dis Loss: 0.7962/0.7040\n",
|
|
"Epoch: 083/100 | Batch 300/469 | Gen/Dis Loss: 0.7942/0.6876\n",
|
|
"Epoch: 083/100 | Batch 400/469 | Gen/Dis Loss: 0.8134/0.6798\n",
|
|
"Time elapsed: 9.31 min\n",
|
|
"Epoch: 084/100 | Batch 000/469 | Gen/Dis Loss: 0.8093/0.6734\n",
|
|
"Epoch: 084/100 | Batch 100/469 | Gen/Dis Loss: 0.8187/0.6674\n",
|
|
"Epoch: 084/100 | Batch 200/469 | Gen/Dis Loss: 0.7782/0.6812\n",
|
|
"Epoch: 084/100 | Batch 300/469 | Gen/Dis Loss: 0.8002/0.6884\n",
|
|
"Epoch: 084/100 | Batch 400/469 | Gen/Dis Loss: 0.7900/0.6939\n",
|
|
"Time elapsed: 9.43 min\n",
|
|
"Epoch: 085/100 | Batch 000/469 | Gen/Dis Loss: 0.8315/0.6780\n",
|
|
"Epoch: 085/100 | Batch 100/469 | Gen/Dis Loss: 0.7928/0.6933\n",
|
|
"Epoch: 085/100 | Batch 200/469 | Gen/Dis Loss: 0.8184/0.6927\n",
|
|
"Epoch: 085/100 | Batch 300/469 | Gen/Dis Loss: 0.7931/0.6728\n",
|
|
"Epoch: 085/100 | Batch 400/469 | Gen/Dis Loss: 0.7994/0.6922\n",
|
|
"Time elapsed: 9.54 min\n",
|
|
"Epoch: 086/100 | Batch 000/469 | Gen/Dis Loss: 0.8361/0.6710\n",
|
|
"Epoch: 086/100 | Batch 100/469 | Gen/Dis Loss: 0.7851/0.6882\n",
|
|
"Epoch: 086/100 | Batch 200/469 | Gen/Dis Loss: 0.7830/0.7084\n",
|
|
"Epoch: 086/100 | Batch 300/469 | Gen/Dis Loss: 0.8143/0.6771\n",
|
|
"Epoch: 086/100 | Batch 400/469 | Gen/Dis Loss: 0.7861/0.7100\n",
|
|
"Time elapsed: 9.65 min\n",
|
|
"Epoch: 087/100 | Batch 000/469 | Gen/Dis Loss: 0.8074/0.6770\n",
|
|
"Epoch: 087/100 | Batch 100/469 | Gen/Dis Loss: 0.7986/0.6877\n",
|
|
"Epoch: 087/100 | Batch 200/469 | Gen/Dis Loss: 0.7811/0.7078\n",
|
|
"Epoch: 087/100 | Batch 300/469 | Gen/Dis Loss: 0.8063/0.6912\n",
|
|
"Epoch: 087/100 | Batch 400/469 | Gen/Dis Loss: 0.7759/0.6970\n",
|
|
"Time elapsed: 9.77 min\n",
|
|
"Epoch: 088/100 | Batch 000/469 | Gen/Dis Loss: 0.8119/0.6786\n",
|
|
"Epoch: 088/100 | Batch 100/469 | Gen/Dis Loss: 0.7883/0.6946\n",
|
|
"Epoch: 088/100 | Batch 200/469 | Gen/Dis Loss: 0.8029/0.7081\n",
|
|
"Epoch: 088/100 | Batch 300/469 | Gen/Dis Loss: 0.7960/0.6943\n",
|
|
"Epoch: 088/100 | Batch 400/469 | Gen/Dis Loss: 0.8103/0.6691\n",
|
|
"Time elapsed: 9.88 min\n",
|
|
"Epoch: 089/100 | Batch 000/469 | Gen/Dis Loss: 0.8218/0.6862\n",
|
|
"Epoch: 089/100 | Batch 100/469 | Gen/Dis Loss: 0.8221/0.6735\n",
|
|
"Epoch: 089/100 | Batch 200/469 | Gen/Dis Loss: 0.8132/0.6719\n",
|
|
"Epoch: 089/100 | Batch 300/469 | Gen/Dis Loss: 0.8029/0.6775\n",
|
|
"Epoch: 089/100 | Batch 400/469 | Gen/Dis Loss: 0.8124/0.6704\n",
|
|
"Time elapsed: 9.99 min\n",
|
|
"Epoch: 090/100 | Batch 000/469 | Gen/Dis Loss: 0.8017/0.6894\n",
|
|
"Epoch: 090/100 | Batch 100/469 | Gen/Dis Loss: 0.7886/0.6985\n",
|
|
"Epoch: 090/100 | Batch 200/469 | Gen/Dis Loss: 0.8060/0.6812\n",
|
|
"Epoch: 090/100 | Batch 300/469 | Gen/Dis Loss: 0.8271/0.6845\n",
|
|
"Epoch: 090/100 | Batch 400/469 | Gen/Dis Loss: 0.8085/0.6709\n",
|
|
"Time elapsed: 10.10 min\n",
|
|
"Epoch: 091/100 | Batch 000/469 | Gen/Dis Loss: 0.7877/0.6932\n",
|
|
"Epoch: 091/100 | Batch 100/469 | Gen/Dis Loss: 0.7939/0.6875\n",
|
|
"Epoch: 091/100 | Batch 200/469 | Gen/Dis Loss: 0.7696/0.6980\n",
|
|
"Epoch: 091/100 | Batch 300/469 | Gen/Dis Loss: 0.7955/0.6857\n",
|
|
"Epoch: 091/100 | Batch 400/469 | Gen/Dis Loss: 0.8188/0.6782\n",
|
|
"Time elapsed: 10.21 min\n",
|
|
"Epoch: 092/100 | Batch 000/469 | Gen/Dis Loss: 0.8089/0.6607\n",
|
|
"Epoch: 092/100 | Batch 100/469 | Gen/Dis Loss: 0.7861/0.6937\n",
|
|
"Epoch: 092/100 | Batch 200/469 | Gen/Dis Loss: 0.8181/0.6804\n",
|
|
"Epoch: 092/100 | Batch 300/469 | Gen/Dis Loss: 0.8078/0.6750\n",
|
|
"Epoch: 092/100 | Batch 400/469 | Gen/Dis Loss: 0.7809/0.7012\n",
|
|
"Time elapsed: 10.32 min\n",
|
|
"Epoch: 093/100 | Batch 000/469 | Gen/Dis Loss: 0.8409/0.6953\n",
|
|
"Epoch: 093/100 | Batch 100/469 | Gen/Dis Loss: 0.8021/0.6843\n",
|
|
"Epoch: 093/100 | Batch 200/469 | Gen/Dis Loss: 0.7930/0.6903\n",
|
|
"Epoch: 093/100 | Batch 300/469 | Gen/Dis Loss: 0.7649/0.6953\n",
|
|
"Epoch: 093/100 | Batch 400/469 | Gen/Dis Loss: 0.8004/0.6960\n",
|
|
"Time elapsed: 10.43 min\n",
|
|
"Epoch: 094/100 | Batch 000/469 | Gen/Dis Loss: 0.7997/0.6764\n",
|
|
"Epoch: 094/100 | Batch 100/469 | Gen/Dis Loss: 0.7819/0.6906\n",
|
|
"Epoch: 094/100 | Batch 200/469 | Gen/Dis Loss: 0.7735/0.7158\n",
|
|
"Epoch: 094/100 | Batch 300/469 | Gen/Dis Loss: 0.8126/0.6695\n",
|
|
"Epoch: 094/100 | Batch 400/469 | Gen/Dis Loss: 0.8050/0.6769\n",
|
|
"Time elapsed: 10.54 min\n",
|
|
"Epoch: 095/100 | Batch 000/469 | Gen/Dis Loss: 0.7984/0.6651\n",
|
|
"Epoch: 095/100 | Batch 100/469 | Gen/Dis Loss: 0.8285/0.6742\n",
|
|
"Epoch: 095/100 | Batch 200/469 | Gen/Dis Loss: 0.8085/0.6624\n",
|
|
"Epoch: 095/100 | Batch 300/469 | Gen/Dis Loss: 0.8018/0.6835\n",
|
|
"Epoch: 095/100 | Batch 400/469 | Gen/Dis Loss: 0.7778/0.6889\n",
|
|
"Time elapsed: 10.66 min\n",
|
|
"Epoch: 096/100 | Batch 000/469 | Gen/Dis Loss: 0.8166/0.6723\n",
|
|
"Epoch: 096/100 | Batch 100/469 | Gen/Dis Loss: 0.8009/0.6798\n",
|
|
"Epoch: 096/100 | Batch 200/469 | Gen/Dis Loss: 0.8044/0.6817\n",
|
|
"Epoch: 096/100 | Batch 300/469 | Gen/Dis Loss: 0.8166/0.6784\n",
|
|
"Epoch: 096/100 | Batch 400/469 | Gen/Dis Loss: 0.7619/0.6903\n",
|
|
"Time elapsed: 10.77 min\n",
|
|
"Epoch: 097/100 | Batch 000/469 | Gen/Dis Loss: 0.7645/0.7070\n",
|
|
"Epoch: 097/100 | Batch 100/469 | Gen/Dis Loss: 0.7751/0.6975\n",
|
|
"Epoch: 097/100 | Batch 200/469 | Gen/Dis Loss: 0.8049/0.6868\n",
|
|
"Epoch: 097/100 | Batch 300/469 | Gen/Dis Loss: 0.7810/0.6798\n",
|
|
"Epoch: 097/100 | Batch 400/469 | Gen/Dis Loss: 0.8145/0.6873\n",
|
|
"Time elapsed: 10.88 min\n",
|
|
"Epoch: 098/100 | Batch 000/469 | Gen/Dis Loss: 0.7926/0.6958\n",
|
|
"Epoch: 098/100 | Batch 100/469 | Gen/Dis Loss: 0.7901/0.6941\n",
|
|
"Epoch: 098/100 | Batch 200/469 | Gen/Dis Loss: 0.8026/0.6743\n",
|
|
"Epoch: 098/100 | Batch 300/469 | Gen/Dis Loss: 0.7940/0.6922\n",
|
|
"Epoch: 098/100 | Batch 400/469 | Gen/Dis Loss: 0.7677/0.6990\n",
|
|
"Time elapsed: 10.99 min\n",
|
|
"Epoch: 099/100 | Batch 000/469 | Gen/Dis Loss: 0.7952/0.6971\n",
|
|
"Epoch: 099/100 | Batch 100/469 | Gen/Dis Loss: 0.8201/0.6741\n",
|
|
"Epoch: 099/100 | Batch 200/469 | Gen/Dis Loss: 0.7985/0.6874\n",
|
|
"Epoch: 099/100 | Batch 300/469 | Gen/Dis Loss: 0.8090/0.6707\n",
|
|
"Epoch: 099/100 | Batch 400/469 | Gen/Dis Loss: 0.7830/0.6894\n",
|
|
"Time elapsed: 11.10 min\n",
|
|
"Epoch: 100/100 | Batch 000/469 | Gen/Dis Loss: 0.7863/0.6857\n",
|
|
"Epoch: 100/100 | Batch 100/469 | Gen/Dis Loss: 0.8107/0.6853\n",
|
|
"Epoch: 100/100 | Batch 200/469 | Gen/Dis Loss: 0.7711/0.7107\n",
|
|
"Epoch: 100/100 | Batch 300/469 | Gen/Dis Loss: 0.7950/0.6758\n",
|
|
"Epoch: 100/100 | Batch 400/469 | Gen/Dis Loss: 0.7759/0.7018\n",
|
|
"Time elapsed: 11.20 min\n",
|
|
"Total Training Time: 11.20 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": "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\n",
|
|
"text/plain": [
|
|
"<Figure size 432x288 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {
|
|
"needs_background": "light"
|
|
},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"plt.plot(range(len(gener_costs)), gener_costs, label='generator loss')\n",
|
|
"plt.plot(range(len(discr_costs)), discr_costs, label='discriminator loss')\n",
|
|
"plt.legend()\n",
|
|
"plt.show()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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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": 14,
|
|
"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.1"
|
|
},
|
|
"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": 2
|
|
}
|