{ "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": [ "# Model Zoo -- Generative Adversarial Networks (GAN)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Implementation of a standard GAN." ] }, { "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:2\" if torch.cuda.is_available() else \"cpu\")\n", "\n", "# Hyperparameters\n", "random_seed = 123\n", "generator_learning_rate = 0.001\n", "discriminator_learning_rate = 0.001\n", "NUM_EPOCHS = 100\n", "BATCH_SIZE = 128\n", "LATENT_DIM = 75\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", " shuffle=True)\n", "\n", "test_loader = DataLoader(dataset=test_dataset, \n", " batch_size=BATCH_SIZE, \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", "\n", "class GAN(torch.nn.Module):\n", "\n", " def __init__(self):\n", " super(GAN, self).__init__()\n", " \n", " \n", " self.generator = nn.Sequential(\n", " nn.Linear(LATENT_DIM, 128),\n", " nn.LeakyReLU(inplace=True),\n", " nn.Dropout(p=0.5),\n", " nn.Linear(128, IMG_SIZE),\n", " nn.Tanh()\n", " )\n", " \n", " self.discriminator = nn.Sequential(\n", " nn.Linear(IMG_SIZE, 128),\n", " nn.LeakyReLU(inplace=True),\n", " nn.Dropout(p=0.5),\n", " nn.Linear(128, 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)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "torch.manual_seed(random_seed)\n", "\n", "model = GAN()\n", "model = model.to(device)\n", "\n", "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": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 001/100 | Batch 000/469 | Gen/Dis Loss: 0.6576/0.7134\n", "Epoch: 001/100 | Batch 100/469 | Gen/Dis Loss: 5.1797/0.0280\n", "Epoch: 001/100 | Batch 200/469 | Gen/Dis Loss: 1.8944/0.0933\n", "Epoch: 001/100 | Batch 300/469 | Gen/Dis Loss: 1.5018/0.1451\n", "Epoch: 001/100 | Batch 400/469 | Gen/Dis Loss: 2.0884/0.1026\n", "Time elapsed: 0.27 min\n", "Epoch: 002/100 | Batch 000/469 | Gen/Dis Loss: 2.8803/0.0496\n", "Epoch: 002/100 | Batch 100/469 | Gen/Dis Loss: 3.4923/0.0483\n", "Epoch: 002/100 | Batch 200/469 | Gen/Dis Loss: 2.9812/0.1615\n", "Epoch: 002/100 | Batch 300/469 | Gen/Dis Loss: 2.2371/0.1658\n", "Epoch: 002/100 | Batch 400/469 | Gen/Dis Loss: 1.7027/0.2905\n", "Time elapsed: 0.51 min\n", "Epoch: 003/100 | Batch 000/469 | Gen/Dis Loss: 1.2188/0.3533\n", "Epoch: 003/100 | Batch 100/469 | Gen/Dis Loss: 1.8254/0.2083\n", "Epoch: 003/100 | Batch 200/469 | Gen/Dis Loss: 1.9774/0.2238\n", "Epoch: 003/100 | Batch 300/469 | Gen/Dis Loss: 1.9323/0.2806\n", "Epoch: 003/100 | Batch 400/469 | Gen/Dis Loss: 1.9518/0.2712\n", "Time elapsed: 0.77 min\n", "Epoch: 004/100 | Batch 000/469 | Gen/Dis Loss: 1.2785/0.3455\n", "Epoch: 004/100 | Batch 100/469 | Gen/Dis Loss: 1.3979/0.3208\n", "Epoch: 004/100 | Batch 200/469 | Gen/Dis Loss: 1.4295/0.3638\n", "Epoch: 004/100 | Batch 300/469 | Gen/Dis Loss: 1.2798/0.3620\n", "Epoch: 004/100 | Batch 400/469 | Gen/Dis Loss: 1.1321/0.4751\n", "Time elapsed: 1.04 min\n", "Epoch: 005/100 | Batch 000/469 | Gen/Dis Loss: 1.1786/0.3932\n", "Epoch: 005/100 | Batch 100/469 | Gen/Dis Loss: 1.1437/0.4343\n", "Epoch: 005/100 | Batch 200/469 | Gen/Dis Loss: 1.0105/0.4453\n", "Epoch: 005/100 | Batch 300/469 | Gen/Dis Loss: 1.3987/0.4194\n", "Epoch: 005/100 | Batch 400/469 | Gen/Dis Loss: 1.3960/0.4005\n", "Time elapsed: 1.28 min\n", "Epoch: 006/100 | Batch 000/469 | Gen/Dis Loss: 1.3119/0.4792\n", "Epoch: 006/100 | Batch 100/469 | Gen/Dis Loss: 1.6029/0.4045\n", "Epoch: 006/100 | Batch 200/469 | Gen/Dis Loss: 1.6302/0.3768\n", "Epoch: 006/100 | Batch 300/469 | Gen/Dis Loss: 0.9141/0.4838\n", "Epoch: 006/100 | Batch 400/469 | Gen/Dis Loss: 0.9891/0.4810\n", "Time elapsed: 1.56 min\n", "Epoch: 007/100 | Batch 000/469 | Gen/Dis Loss: 1.3198/0.4820\n", "Epoch: 007/100 | Batch 100/469 | Gen/Dis Loss: 1.1527/0.4620\n", "Epoch: 007/100 | Batch 200/469 | Gen/Dis Loss: 1.3668/0.3967\n", "Epoch: 007/100 | Batch 300/469 | Gen/Dis Loss: 1.6183/0.4676\n", "Epoch: 007/100 | Batch 400/469 | Gen/Dis Loss: 1.0077/0.4841\n", "Time elapsed: 1.85 min\n", "Epoch: 008/100 | Batch 000/469 | Gen/Dis Loss: 1.2245/0.5437\n", "Epoch: 008/100 | Batch 100/469 | Gen/Dis Loss: 1.0142/0.4928\n", "Epoch: 008/100 | Batch 200/469 | Gen/Dis Loss: 0.8817/0.4939\n", "Epoch: 008/100 | Batch 300/469 | Gen/Dis Loss: 1.0748/0.4967\n", "Epoch: 008/100 | Batch 400/469 | Gen/Dis Loss: 2.1265/0.4329\n", "Time elapsed: 2.11 min\n", "Epoch: 009/100 | Batch 000/469 | Gen/Dis Loss: 0.9277/0.4871\n", "Epoch: 009/100 | Batch 100/469 | Gen/Dis Loss: 1.1624/0.4473\n", "Epoch: 009/100 | Batch 200/469 | Gen/Dis Loss: 1.1869/0.4800\n", "Epoch: 009/100 | Batch 300/469 | Gen/Dis Loss: 1.9998/0.4295\n", "Epoch: 009/100 | Batch 400/469 | Gen/Dis Loss: 1.6921/0.5037\n", "Time elapsed: 2.34 min\n", "Epoch: 010/100 | Batch 000/469 | Gen/Dis Loss: 1.3091/0.4358\n", "Epoch: 010/100 | Batch 100/469 | Gen/Dis Loss: 1.2604/0.5375\n", "Epoch: 010/100 | Batch 200/469 | Gen/Dis Loss: 1.1491/0.4537\n", "Epoch: 010/100 | Batch 300/469 | Gen/Dis Loss: 1.3843/0.5068\n", "Epoch: 010/100 | Batch 400/469 | Gen/Dis Loss: 1.3413/0.5051\n", "Time elapsed: 2.60 min\n", "Epoch: 011/100 | Batch 000/469 | Gen/Dis Loss: 1.2368/0.5161\n", "Epoch: 011/100 | Batch 100/469 | Gen/Dis Loss: 1.3715/0.4692\n", "Epoch: 011/100 | Batch 200/469 | Gen/Dis Loss: 1.1182/0.5274\n", "Epoch: 011/100 | Batch 300/469 | Gen/Dis Loss: 1.2770/0.4649\n", "Epoch: 011/100 | Batch 400/469 | Gen/Dis Loss: 1.1847/0.5504\n", "Time elapsed: 2.84 min\n", "Epoch: 012/100 | Batch 000/469 | Gen/Dis Loss: 0.9930/0.5509\n", "Epoch: 012/100 | Batch 100/469 | Gen/Dis Loss: 1.1921/0.5310\n", "Epoch: 012/100 | Batch 200/469 | Gen/Dis Loss: 0.9925/0.6062\n", "Epoch: 012/100 | Batch 300/469 | Gen/Dis Loss: 1.1246/0.5170\n", "Epoch: 012/100 | Batch 400/469 | Gen/Dis Loss: 1.0432/0.4437\n", "Time elapsed: 3.07 min\n", "Epoch: 013/100 | Batch 000/469 | Gen/Dis Loss: 1.1419/0.5287\n", "Epoch: 013/100 | Batch 100/469 | Gen/Dis Loss: 1.0053/0.5152\n", "Epoch: 013/100 | Batch 200/469 | Gen/Dis Loss: 1.1308/0.5384\n", "Epoch: 013/100 | Batch 300/469 | Gen/Dis Loss: 1.1822/0.5124\n", "Epoch: 013/100 | Batch 400/469 | Gen/Dis Loss: 1.4501/0.5495\n", "Time elapsed: 3.32 min\n", "Epoch: 014/100 | Batch 000/469 | Gen/Dis Loss: 1.1417/0.5364\n", "Epoch: 014/100 | Batch 100/469 | Gen/Dis Loss: 0.9595/0.5884\n", "Epoch: 014/100 | Batch 200/469 | Gen/Dis Loss: 0.9887/0.5216\n", "Epoch: 014/100 | Batch 300/469 | Gen/Dis Loss: 1.0332/0.5686\n", "Epoch: 014/100 | Batch 400/469 | Gen/Dis Loss: 1.5268/0.4554\n", "Time elapsed: 3.60 min\n", "Epoch: 015/100 | Batch 000/469 | Gen/Dis Loss: 1.1181/0.4960\n", "Epoch: 015/100 | Batch 100/469 | Gen/Dis Loss: 1.2722/0.4632\n", "Epoch: 015/100 | Batch 200/469 | Gen/Dis Loss: 0.9523/0.6012\n", "Epoch: 015/100 | Batch 300/469 | Gen/Dis Loss: 0.9905/0.5274\n", "Epoch: 015/100 | Batch 400/469 | Gen/Dis Loss: 1.0448/0.5855\n", "Time elapsed: 3.82 min\n", "Epoch: 016/100 | Batch 000/469 | Gen/Dis Loss: 1.0641/0.5432\n", "Epoch: 016/100 | Batch 100/469 | Gen/Dis Loss: 0.9587/0.5636\n", "Epoch: 016/100 | Batch 200/469 | Gen/Dis Loss: 1.3602/0.5691\n", "Epoch: 016/100 | Batch 300/469 | Gen/Dis Loss: 1.1294/0.5564\n", "Epoch: 016/100 | Batch 400/469 | Gen/Dis Loss: 1.0727/0.5042\n", "Time elapsed: 4.04 min\n", "Epoch: 017/100 | Batch 000/469 | Gen/Dis Loss: 0.9285/0.6045\n", "Epoch: 017/100 | Batch 100/469 | Gen/Dis Loss: 1.0024/0.6384\n", "Epoch: 017/100 | Batch 200/469 | Gen/Dis Loss: 1.5662/0.4652\n", "Epoch: 017/100 | Batch 300/469 | Gen/Dis Loss: 1.3644/0.4632\n", "Epoch: 017/100 | Batch 400/469 | Gen/Dis Loss: 1.2681/0.5238\n", "Time elapsed: 4.22 min\n", "Epoch: 018/100 | Batch 000/469 | Gen/Dis Loss: 1.2578/0.5151\n", "Epoch: 018/100 | Batch 100/469 | Gen/Dis Loss: 1.6475/0.4929\n", "Epoch: 018/100 | Batch 200/469 | Gen/Dis Loss: 1.0610/0.5496\n", "Epoch: 018/100 | Batch 300/469 | Gen/Dis Loss: 1.0613/0.5634\n", "Epoch: 018/100 | Batch 400/469 | Gen/Dis Loss: 1.4675/0.4589\n", "Time elapsed: 4.40 min\n", "Epoch: 019/100 | Batch 000/469 | Gen/Dis Loss: 1.1211/0.5027\n", "Epoch: 019/100 | Batch 100/469 | Gen/Dis Loss: 1.1444/0.5655\n", "Epoch: 019/100 | Batch 200/469 | Gen/Dis Loss: 1.2471/0.5716\n", "Epoch: 019/100 | Batch 300/469 | Gen/Dis Loss: 1.0223/0.5106\n", "Epoch: 019/100 | Batch 400/469 | Gen/Dis Loss: 1.0361/0.5805\n", "Time elapsed: 4.58 min\n", "Epoch: 020/100 | Batch 000/469 | Gen/Dis Loss: 0.9195/0.5428\n", "Epoch: 020/100 | Batch 100/469 | Gen/Dis Loss: 1.3110/0.4955\n", "Epoch: 020/100 | Batch 200/469 | Gen/Dis Loss: 1.2449/0.4973\n", "Epoch: 020/100 | Batch 300/469 | Gen/Dis Loss: 1.3258/0.4992\n", "Epoch: 020/100 | Batch 400/469 | Gen/Dis Loss: 1.2196/0.5279\n", "Time elapsed: 4.77 min\n", "Epoch: 021/100 | Batch 000/469 | Gen/Dis Loss: 1.5621/0.5584\n", "Epoch: 021/100 | Batch 100/469 | Gen/Dis Loss: 1.1148/0.5888\n", "Epoch: 021/100 | Batch 200/469 | Gen/Dis Loss: 1.5108/0.4636\n", "Epoch: 021/100 | Batch 300/469 | Gen/Dis Loss: 1.0957/0.4912\n", "Epoch: 021/100 | Batch 400/469 | Gen/Dis Loss: 1.0342/0.5184\n", "Time elapsed: 4.92 min\n", "Epoch: 022/100 | Batch 000/469 | Gen/Dis Loss: 1.9312/0.4366\n", "Epoch: 022/100 | Batch 100/469 | Gen/Dis Loss: 1.2312/0.5260\n", "Epoch: 022/100 | Batch 200/469 | Gen/Dis Loss: 1.1939/0.5075\n", "Epoch: 022/100 | Batch 300/469 | Gen/Dis Loss: 1.1393/0.5692\n", "Epoch: 022/100 | Batch 400/469 | Gen/Dis Loss: 1.0390/0.5261\n", "Time elapsed: 5.05 min\n", "Epoch: 023/100 | Batch 000/469 | Gen/Dis Loss: 1.3148/0.4902\n", "Epoch: 023/100 | Batch 100/469 | Gen/Dis Loss: 1.2077/0.6129\n", "Epoch: 023/100 | Batch 200/469 | Gen/Dis Loss: 1.0886/0.5545\n", "Epoch: 023/100 | Batch 300/469 | Gen/Dis Loss: 1.0762/0.4948\n", "Epoch: 023/100 | Batch 400/469 | Gen/Dis Loss: 1.5361/0.5476\n", "Time elapsed: 5.17 min\n", "Epoch: 024/100 | Batch 000/469 | Gen/Dis Loss: 1.1752/0.5881\n", "Epoch: 024/100 | Batch 100/469 | Gen/Dis Loss: 1.3408/0.5339\n", "Epoch: 024/100 | Batch 200/469 | Gen/Dis Loss: 1.2613/0.4555\n", "Epoch: 024/100 | Batch 300/469 | Gen/Dis Loss: 1.0707/0.5099\n", "Epoch: 024/100 | Batch 400/469 | Gen/Dis Loss: 1.1063/0.5695\n", "Time elapsed: 5.32 min\n", "Epoch: 025/100 | Batch 000/469 | Gen/Dis Loss: 1.2911/0.5084\n", "Epoch: 025/100 | Batch 100/469 | Gen/Dis Loss: 1.1280/0.5151\n", "Epoch: 025/100 | Batch 200/469 | Gen/Dis Loss: 1.3799/0.5784\n", "Epoch: 025/100 | Batch 300/469 | Gen/Dis Loss: 1.1675/0.6001\n", "Epoch: 025/100 | Batch 400/469 | Gen/Dis Loss: 0.9834/0.6158\n", "Time elapsed: 5.48 min\n", "Epoch: 026/100 | Batch 000/469 | Gen/Dis Loss: 1.2713/0.5475\n", "Epoch: 026/100 | Batch 100/469 | Gen/Dis Loss: 1.3814/0.5652\n", "Epoch: 026/100 | Batch 200/469 | Gen/Dis Loss: 1.1782/0.4850\n", "Epoch: 026/100 | Batch 300/469 | Gen/Dis Loss: 0.9917/0.5888\n", "Epoch: 026/100 | Batch 400/469 | Gen/Dis Loss: 1.0909/0.5825\n", "Time elapsed: 5.64 min\n", "Epoch: 027/100 | Batch 000/469 | Gen/Dis Loss: 1.0873/0.5579\n", "Epoch: 027/100 | Batch 100/469 | Gen/Dis Loss: 0.9639/0.5860\n", "Epoch: 027/100 | Batch 200/469 | Gen/Dis Loss: 1.0458/0.5526\n", "Epoch: 027/100 | Batch 300/469 | Gen/Dis Loss: 1.3373/0.5140\n", "Epoch: 027/100 | Batch 400/469 | Gen/Dis Loss: 1.2790/0.5223\n", "Time elapsed: 5.79 min\n", "Epoch: 028/100 | Batch 000/469 | Gen/Dis Loss: 0.9300/0.5869\n", "Epoch: 028/100 | Batch 100/469 | Gen/Dis Loss: 1.0022/0.6056\n", "Epoch: 028/100 | Batch 200/469 | Gen/Dis Loss: 1.0688/0.5447\n", "Epoch: 028/100 | Batch 300/469 | Gen/Dis Loss: 1.0161/0.5702\n", "Epoch: 028/100 | Batch 400/469 | Gen/Dis Loss: 0.8731/0.5543\n", "Time elapsed: 5.92 min\n", "Epoch: 029/100 | Batch 000/469 | Gen/Dis Loss: 0.8719/0.5524\n", "Epoch: 029/100 | Batch 100/469 | Gen/Dis Loss: 1.3005/0.5179\n", "Epoch: 029/100 | Batch 200/469 | Gen/Dis Loss: 1.2986/0.5312\n", "Epoch: 029/100 | Batch 300/469 | Gen/Dis Loss: 1.1084/0.5207\n", "Epoch: 029/100 | Batch 400/469 | Gen/Dis Loss: 1.0591/0.5577\n", "Time elapsed: 6.07 min\n", "Epoch: 030/100 | Batch 000/469 | Gen/Dis Loss: 1.0231/0.6170\n", "Epoch: 030/100 | Batch 100/469 | Gen/Dis Loss: 0.9142/0.6046\n", "Epoch: 030/100 | Batch 200/469 | Gen/Dis Loss: 1.2140/0.5290\n", "Epoch: 030/100 | Batch 300/469 | Gen/Dis Loss: 0.8784/0.5804\n", "Epoch: 030/100 | Batch 400/469 | Gen/Dis Loss: 1.1178/0.5165\n", "Time elapsed: 6.20 min\n", "Epoch: 031/100 | Batch 000/469 | Gen/Dis Loss: 0.9555/0.5921\n", "Epoch: 031/100 | Batch 100/469 | Gen/Dis Loss: 0.9644/0.5432\n", "Epoch: 031/100 | Batch 200/469 | Gen/Dis Loss: 0.9531/0.5465\n", "Epoch: 031/100 | Batch 300/469 | Gen/Dis Loss: 1.3496/0.5550\n", "Epoch: 031/100 | Batch 400/469 | Gen/Dis Loss: 1.2137/0.5672\n", "Time elapsed: 6.32 min\n", "Epoch: 032/100 | Batch 000/469 | Gen/Dis Loss: 1.0849/0.5020\n", "Epoch: 032/100 | Batch 100/469 | Gen/Dis Loss: 0.9098/0.5481\n", "Epoch: 032/100 | Batch 200/469 | Gen/Dis Loss: 1.2349/0.5024\n", "Epoch: 032/100 | Batch 300/469 | Gen/Dis Loss: 0.9468/0.5599\n", "Epoch: 032/100 | Batch 400/469 | Gen/Dis Loss: 1.4531/0.4928\n", "Time elapsed: 6.45 min\n", "Epoch: 033/100 | Batch 000/469 | Gen/Dis Loss: 1.3397/0.5521\n", "Epoch: 033/100 | Batch 100/469 | Gen/Dis Loss: 1.0106/0.5472\n", "Epoch: 033/100 | Batch 200/469 | Gen/Dis Loss: 0.9787/0.5606\n", "Epoch: 033/100 | Batch 300/469 | Gen/Dis Loss: 1.1434/0.5388\n", "Epoch: 033/100 | Batch 400/469 | Gen/Dis Loss: 1.0476/0.5259\n", "Time elapsed: 6.57 min\n", "Epoch: 034/100 | Batch 000/469 | Gen/Dis Loss: 1.3847/0.5294\n", "Epoch: 034/100 | Batch 100/469 | Gen/Dis Loss: 0.8550/0.5800\n", "Epoch: 034/100 | Batch 200/469 | Gen/Dis Loss: 1.0220/0.5527\n", "Epoch: 034/100 | Batch 300/469 | Gen/Dis Loss: 0.9255/0.5751\n", "Epoch: 034/100 | Batch 400/469 | Gen/Dis Loss: 1.0400/0.5554\n", "Time elapsed: 6.72 min\n", "Epoch: 035/100 | Batch 000/469 | Gen/Dis Loss: 0.9723/0.5789\n", "Epoch: 035/100 | Batch 100/469 | Gen/Dis Loss: 1.4414/0.4769\n", "Epoch: 035/100 | Batch 200/469 | Gen/Dis Loss: 0.9431/0.5898\n", "Epoch: 035/100 | Batch 300/469 | Gen/Dis Loss: 0.8252/0.6573\n", "Epoch: 035/100 | Batch 400/469 | Gen/Dis Loss: 0.9694/0.5427\n", "Time elapsed: 6.84 min\n", "Epoch: 036/100 | Batch 000/469 | Gen/Dis Loss: 1.3664/0.5839\n", "Epoch: 036/100 | Batch 100/469 | Gen/Dis Loss: 1.0854/0.5739\n", "Epoch: 036/100 | Batch 200/469 | Gen/Dis Loss: 1.0429/0.5457\n", "Epoch: 036/100 | Batch 300/469 | Gen/Dis Loss: 0.8601/0.6151\n", "Epoch: 036/100 | Batch 400/469 | Gen/Dis Loss: 1.2785/0.5850\n", "Time elapsed: 6.97 min\n", "Epoch: 037/100 | Batch 000/469 | Gen/Dis Loss: 1.0251/0.5933\n", "Epoch: 037/100 | Batch 100/469 | Gen/Dis Loss: 1.2177/0.5053\n", "Epoch: 037/100 | Batch 200/469 | Gen/Dis Loss: 0.8804/0.5925\n", "Epoch: 037/100 | Batch 300/469 | Gen/Dis Loss: 1.2797/0.6173\n", "Epoch: 037/100 | Batch 400/469 | Gen/Dis Loss: 0.9189/0.6238\n", "Time elapsed: 7.10 min\n", "Epoch: 038/100 | Batch 000/469 | Gen/Dis Loss: 1.3463/0.5419\n", "Epoch: 038/100 | Batch 100/469 | Gen/Dis Loss: 1.0166/0.6045\n", "Epoch: 038/100 | Batch 200/469 | Gen/Dis Loss: 0.9895/0.6320\n", "Epoch: 038/100 | Batch 300/469 | Gen/Dis Loss: 0.9749/0.5621\n", "Epoch: 038/100 | Batch 400/469 | Gen/Dis Loss: 1.0448/0.5945\n", "Time elapsed: 7.24 min\n", "Epoch: 039/100 | Batch 000/469 | Gen/Dis Loss: 0.9662/0.5669\n", "Epoch: 039/100 | Batch 100/469 | Gen/Dis Loss: 1.1476/0.5462\n", "Epoch: 039/100 | Batch 200/469 | Gen/Dis Loss: 0.9662/0.5554\n", "Epoch: 039/100 | Batch 300/469 | Gen/Dis Loss: 1.0850/0.6031\n", "Epoch: 039/100 | Batch 400/469 | Gen/Dis Loss: 1.1491/0.6014\n", "Time elapsed: 7.41 min\n", "Epoch: 040/100 | Batch 000/469 | Gen/Dis Loss: 0.9942/0.5999\n", "Epoch: 040/100 | Batch 100/469 | Gen/Dis Loss: 0.9034/0.5979\n", "Epoch: 040/100 | Batch 200/469 | Gen/Dis Loss: 1.1880/0.5693\n", "Epoch: 040/100 | Batch 300/469 | Gen/Dis Loss: 1.0893/0.5933\n", "Epoch: 040/100 | Batch 400/469 | Gen/Dis Loss: 1.0711/0.5501\n", "Time elapsed: 7.59 min\n", "Epoch: 041/100 | Batch 000/469 | Gen/Dis Loss: 0.9100/0.5957\n", "Epoch: 041/100 | Batch 100/469 | Gen/Dis Loss: 0.7538/0.5947\n", "Epoch: 041/100 | Batch 200/469 | Gen/Dis Loss: 0.9743/0.5999\n", "Epoch: 041/100 | Batch 300/469 | Gen/Dis Loss: 0.8305/0.6395\n", "Epoch: 041/100 | Batch 400/469 | Gen/Dis Loss: 1.1106/0.6419\n", "Time elapsed: 7.73 min\n", "Epoch: 042/100 | Batch 000/469 | Gen/Dis Loss: 1.1241/0.5890\n", "Epoch: 042/100 | Batch 100/469 | Gen/Dis Loss: 0.8509/0.6164\n", "Epoch: 042/100 | Batch 200/469 | Gen/Dis Loss: 1.2024/0.5684\n", "Epoch: 042/100 | Batch 300/469 | Gen/Dis Loss: 0.9708/0.6378\n", "Epoch: 042/100 | Batch 400/469 | Gen/Dis Loss: 1.1171/0.5501\n", "Time elapsed: 7.85 min\n", "Epoch: 043/100 | Batch 000/469 | Gen/Dis Loss: 1.0931/0.5653\n", "Epoch: 043/100 | Batch 100/469 | Gen/Dis Loss: 1.0468/0.5782\n", "Epoch: 043/100 | Batch 200/469 | Gen/Dis Loss: 1.0359/0.6329\n", "Epoch: 043/100 | Batch 300/469 | Gen/Dis Loss: 1.1976/0.6114\n", "Epoch: 043/100 | Batch 400/469 | Gen/Dis Loss: 0.8817/0.6200\n", "Time elapsed: 7.98 min\n", "Epoch: 044/100 | Batch 000/469 | Gen/Dis Loss: 0.9911/0.6061\n", "Epoch: 044/100 | Batch 100/469 | Gen/Dis Loss: 1.0196/0.6435\n", "Epoch: 044/100 | Batch 200/469 | Gen/Dis Loss: 1.0005/0.6266\n", "Epoch: 044/100 | Batch 300/469 | Gen/Dis Loss: 0.8342/0.6092\n", "Epoch: 044/100 | Batch 400/469 | Gen/Dis Loss: 0.8342/0.5589\n", "Time elapsed: 8.10 min\n", "Epoch: 045/100 | Batch 000/469 | Gen/Dis Loss: 0.7638/0.6289\n", "Epoch: 045/100 | Batch 100/469 | Gen/Dis Loss: 0.9049/0.5920\n", "Epoch: 045/100 | Batch 200/469 | Gen/Dis Loss: 1.0077/0.5975\n", "Epoch: 045/100 | Batch 300/469 | Gen/Dis Loss: 0.9315/0.6066\n", "Epoch: 045/100 | Batch 400/469 | Gen/Dis Loss: 0.7719/0.6624\n", "Time elapsed: 8.23 min\n", "Epoch: 046/100 | Batch 000/469 | Gen/Dis Loss: 1.0064/0.5672\n", "Epoch: 046/100 | Batch 100/469 | Gen/Dis Loss: 0.8730/0.6217\n", "Epoch: 046/100 | Batch 200/469 | Gen/Dis Loss: 1.2217/0.5859\n", "Epoch: 046/100 | Batch 300/469 | Gen/Dis Loss: 1.1649/0.5878\n", "Epoch: 046/100 | Batch 400/469 | Gen/Dis Loss: 0.9912/0.5882\n", "Time elapsed: 8.35 min\n", "Epoch: 047/100 | Batch 000/469 | Gen/Dis Loss: 0.8579/0.6209\n", "Epoch: 047/100 | Batch 100/469 | Gen/Dis Loss: 1.0072/0.5908\n", "Epoch: 047/100 | Batch 200/469 | Gen/Dis Loss: 0.8694/0.6285\n", "Epoch: 047/100 | Batch 300/469 | Gen/Dis Loss: 0.9354/0.6087\n", "Epoch: 047/100 | Batch 400/469 | Gen/Dis Loss: 0.8800/0.6521\n", "Time elapsed: 8.48 min\n", "Epoch: 048/100 | Batch 000/469 | Gen/Dis Loss: 0.8513/0.6051\n", "Epoch: 048/100 | Batch 100/469 | Gen/Dis Loss: 0.8803/0.6090\n", "Epoch: 048/100 | Batch 200/469 | Gen/Dis Loss: 1.0930/0.6115\n", "Epoch: 048/100 | Batch 300/469 | Gen/Dis Loss: 0.7406/0.6692\n", "Epoch: 048/100 | Batch 400/469 | Gen/Dis Loss: 0.8551/0.6188\n", "Time elapsed: 8.62 min\n", "Epoch: 049/100 | Batch 000/469 | Gen/Dis Loss: 0.8792/0.5986\n", "Epoch: 049/100 | Batch 100/469 | Gen/Dis Loss: 0.8424/0.6277\n", "Epoch: 049/100 | Batch 200/469 | Gen/Dis Loss: 0.7973/0.6320\n", "Epoch: 049/100 | Batch 300/469 | Gen/Dis Loss: 0.9188/0.5828\n", "Epoch: 049/100 | Batch 400/469 | Gen/Dis Loss: 0.9253/0.6013\n", "Time elapsed: 8.80 min\n", "Epoch: 050/100 | Batch 000/469 | Gen/Dis Loss: 1.3241/0.5689\n", "Epoch: 050/100 | Batch 100/469 | Gen/Dis Loss: 1.0220/0.5922\n", "Epoch: 050/100 | Batch 200/469 | Gen/Dis Loss: 0.9210/0.6024\n", "Epoch: 050/100 | Batch 300/469 | Gen/Dis Loss: 0.8139/0.6578\n", "Epoch: 050/100 | Batch 400/469 | Gen/Dis Loss: 1.0371/0.5987\n", "Time elapsed: 8.93 min\n", "Epoch: 051/100 | Batch 000/469 | Gen/Dis Loss: 0.9253/0.6002\n", "Epoch: 051/100 | Batch 100/469 | Gen/Dis Loss: 0.8154/0.5774\n", "Epoch: 051/100 | Batch 200/469 | Gen/Dis Loss: 0.9697/0.6240\n", "Epoch: 051/100 | Batch 300/469 | Gen/Dis Loss: 1.1185/0.5541\n", "Epoch: 051/100 | Batch 400/469 | Gen/Dis Loss: 0.8016/0.6642\n", "Time elapsed: 9.06 min\n", "Epoch: 052/100 | Batch 000/469 | Gen/Dis Loss: 0.8716/0.6364\n", "Epoch: 052/100 | Batch 100/469 | Gen/Dis Loss: 0.9636/0.5944\n", "Epoch: 052/100 | Batch 200/469 | Gen/Dis Loss: 0.9511/0.6204\n", "Epoch: 052/100 | Batch 300/469 | Gen/Dis Loss: 0.9293/0.5901\n", "Epoch: 052/100 | Batch 400/469 | Gen/Dis Loss: 1.1139/0.5535\n", "Time elapsed: 9.18 min\n", "Epoch: 053/100 | Batch 000/469 | Gen/Dis Loss: 0.8345/0.6399\n", "Epoch: 053/100 | Batch 100/469 | Gen/Dis Loss: 1.0420/0.5847\n", "Epoch: 053/100 | Batch 200/469 | Gen/Dis Loss: 0.8887/0.6183\n", "Epoch: 053/100 | Batch 300/469 | Gen/Dis Loss: 1.1280/0.5869\n", "Epoch: 053/100 | Batch 400/469 | Gen/Dis Loss: 0.8391/0.6031\n", "Time elapsed: 9.30 min\n", "Epoch: 054/100 | Batch 000/469 | Gen/Dis Loss: 1.0584/0.5659\n", "Epoch: 054/100 | Batch 100/469 | Gen/Dis Loss: 0.8722/0.5991\n", "Epoch: 054/100 | Batch 200/469 | Gen/Dis Loss: 0.8416/0.6067\n", "Epoch: 054/100 | Batch 300/469 | Gen/Dis Loss: 0.9295/0.5910\n", "Epoch: 054/100 | Batch 400/469 | Gen/Dis Loss: 0.7705/0.6145\n", "Time elapsed: 9.43 min\n", "Epoch: 055/100 | Batch 000/469 | Gen/Dis Loss: 0.9697/0.6207\n", "Epoch: 055/100 | Batch 100/469 | Gen/Dis Loss: 1.3702/0.5782\n", "Epoch: 055/100 | Batch 200/469 | Gen/Dis Loss: 0.8874/0.6034\n", "Epoch: 055/100 | Batch 300/469 | Gen/Dis Loss: 0.9273/0.6095\n", "Epoch: 055/100 | Batch 400/469 | Gen/Dis Loss: 1.0736/0.5893\n", "Time elapsed: 9.57 min\n", "Epoch: 056/100 | Batch 000/469 | Gen/Dis Loss: 0.9631/0.5959\n", "Epoch: 056/100 | Batch 100/469 | Gen/Dis Loss: 0.8657/0.6398\n", "Epoch: 056/100 | Batch 200/469 | Gen/Dis Loss: 0.8120/0.6027\n", "Epoch: 056/100 | Batch 300/469 | Gen/Dis Loss: 1.1529/0.6493\n", "Epoch: 056/100 | Batch 400/469 | Gen/Dis Loss: 0.9172/0.5788\n", "Time elapsed: 9.77 min\n", "Epoch: 057/100 | Batch 000/469 | Gen/Dis Loss: 0.9197/0.6090\n", "Epoch: 057/100 | Batch 100/469 | Gen/Dis Loss: 0.9413/0.6255\n", "Epoch: 057/100 | Batch 200/469 | Gen/Dis Loss: 0.9020/0.5870\n", "Epoch: 057/100 | Batch 300/469 | Gen/Dis Loss: 0.9947/0.5586\n", "Epoch: 057/100 | Batch 400/469 | Gen/Dis Loss: 0.9077/0.6454\n", "Time elapsed: 10.03 min\n", "Epoch: 058/100 | Batch 000/469 | Gen/Dis Loss: 0.8899/0.6106\n", "Epoch: 058/100 | Batch 100/469 | Gen/Dis Loss: 0.8154/0.6554\n", "Epoch: 058/100 | Batch 200/469 | Gen/Dis Loss: 0.9307/0.5997\n", "Epoch: 058/100 | Batch 300/469 | Gen/Dis Loss: 0.8293/0.5881\n", "Epoch: 058/100 | Batch 400/469 | Gen/Dis Loss: 0.9434/0.6448\n", "Time elapsed: 10.31 min\n", "Epoch: 059/100 | Batch 000/469 | Gen/Dis Loss: 0.9638/0.6325\n", "Epoch: 059/100 | Batch 100/469 | Gen/Dis Loss: 0.9374/0.6304\n", "Epoch: 059/100 | Batch 200/469 | Gen/Dis Loss: 0.8452/0.6464\n", "Epoch: 059/100 | Batch 300/469 | Gen/Dis Loss: 1.0170/0.6210\n", "Epoch: 059/100 | Batch 400/469 | Gen/Dis Loss: 0.8808/0.5950\n", "Time elapsed: 10.56 min\n", "Epoch: 060/100 | Batch 000/469 | Gen/Dis Loss: 0.9076/0.5969\n", "Epoch: 060/100 | Batch 100/469 | Gen/Dis Loss: 1.1195/0.6040\n", "Epoch: 060/100 | Batch 200/469 | Gen/Dis Loss: 0.9015/0.6149\n", "Epoch: 060/100 | Batch 300/469 | Gen/Dis Loss: 0.8414/0.5804\n", "Epoch: 060/100 | Batch 400/469 | Gen/Dis Loss: 0.8220/0.6557\n", "Time elapsed: 10.83 min\n", "Epoch: 061/100 | Batch 000/469 | Gen/Dis Loss: 0.8411/0.6360\n", "Epoch: 061/100 | Batch 100/469 | Gen/Dis Loss: 0.8431/0.6304\n", "Epoch: 061/100 | Batch 200/469 | Gen/Dis Loss: 0.7740/0.6395\n", "Epoch: 061/100 | Batch 300/469 | Gen/Dis Loss: 0.8840/0.5987\n", "Epoch: 061/100 | Batch 400/469 | Gen/Dis Loss: 0.8510/0.6232\n", "Time elapsed: 11.07 min\n", "Epoch: 062/100 | Batch 000/469 | Gen/Dis Loss: 1.0286/0.6151\n", "Epoch: 062/100 | Batch 100/469 | Gen/Dis Loss: 1.0516/0.5767\n", "Epoch: 062/100 | Batch 200/469 | Gen/Dis Loss: 0.8182/0.5654\n", "Epoch: 062/100 | Batch 300/469 | Gen/Dis Loss: 0.8658/0.6156\n", "Epoch: 062/100 | Batch 400/469 | Gen/Dis Loss: 0.9674/0.6434\n", "Time elapsed: 11.33 min\n", "Epoch: 063/100 | Batch 000/469 | Gen/Dis Loss: 0.6952/0.6601\n", "Epoch: 063/100 | Batch 100/469 | Gen/Dis Loss: 0.8180/0.6041\n", "Epoch: 063/100 | Batch 200/469 | Gen/Dis Loss: 0.8224/0.6683\n", "Epoch: 063/100 | Batch 300/469 | Gen/Dis Loss: 0.9604/0.5938\n", "Epoch: 063/100 | Batch 400/469 | Gen/Dis Loss: 0.7969/0.6561\n", "Time elapsed: 11.54 min\n", "Epoch: 064/100 | Batch 000/469 | Gen/Dis Loss: 0.8544/0.6290\n", "Epoch: 064/100 | Batch 100/469 | Gen/Dis Loss: 0.8685/0.5925\n", "Epoch: 064/100 | Batch 200/469 | Gen/Dis Loss: 1.4746/0.5992\n", "Epoch: 064/100 | Batch 300/469 | Gen/Dis Loss: 0.8570/0.6417\n", "Epoch: 064/100 | Batch 400/469 | Gen/Dis Loss: 0.8588/0.6461\n", "Time elapsed: 11.78 min\n", "Epoch: 065/100 | Batch 000/469 | Gen/Dis Loss: 0.8579/0.6151\n", "Epoch: 065/100 | Batch 100/469 | Gen/Dis Loss: 0.9720/0.5867\n", "Epoch: 065/100 | Batch 200/469 | Gen/Dis Loss: 0.8870/0.6215\n", "Epoch: 065/100 | Batch 300/469 | Gen/Dis Loss: 0.8184/0.6506\n", "Epoch: 065/100 | Batch 400/469 | Gen/Dis Loss: 0.9247/0.6219\n", "Time elapsed: 12.03 min\n", "Epoch: 066/100 | Batch 000/469 | Gen/Dis Loss: 0.9073/0.6157\n", "Epoch: 066/100 | Batch 100/469 | Gen/Dis Loss: 0.8459/0.6364\n", "Epoch: 066/100 | Batch 200/469 | Gen/Dis Loss: 1.0687/0.5647\n", "Epoch: 066/100 | Batch 300/469 | Gen/Dis Loss: 0.9213/0.6136\n", "Epoch: 066/100 | Batch 400/469 | Gen/Dis Loss: 0.7895/0.6409\n", "Time elapsed: 12.30 min\n", "Epoch: 067/100 | Batch 000/469 | Gen/Dis Loss: 0.8258/0.6246\n", "Epoch: 067/100 | Batch 100/469 | Gen/Dis Loss: 0.9616/0.5776\n", "Epoch: 067/100 | Batch 200/469 | Gen/Dis Loss: 0.9039/0.6012\n", "Epoch: 067/100 | Batch 300/469 | Gen/Dis Loss: 0.9857/0.5949\n", "Epoch: 067/100 | Batch 400/469 | Gen/Dis Loss: 1.1779/0.5773\n", "Time elapsed: 12.58 min\n", "Epoch: 068/100 | Batch 000/469 | Gen/Dis Loss: 0.9631/0.6006\n", "Epoch: 068/100 | Batch 100/469 | Gen/Dis Loss: 0.7157/0.6103\n", "Epoch: 068/100 | Batch 200/469 | Gen/Dis Loss: 0.8400/0.6223\n", "Epoch: 068/100 | Batch 300/469 | Gen/Dis Loss: 1.0586/0.5840\n", "Epoch: 068/100 | Batch 400/469 | Gen/Dis Loss: 0.9487/0.6224\n", "Time elapsed: 12.84 min\n", "Epoch: 069/100 | Batch 000/469 | Gen/Dis Loss: 1.0124/0.5248\n", "Epoch: 069/100 | Batch 100/469 | Gen/Dis Loss: 0.8849/0.6481\n", "Epoch: 069/100 | Batch 200/469 | Gen/Dis Loss: 0.9250/0.6130\n", "Epoch: 069/100 | Batch 300/469 | Gen/Dis Loss: 0.9207/0.6420\n", "Epoch: 069/100 | Batch 400/469 | Gen/Dis Loss: 0.8661/0.6100\n", "Time elapsed: 13.11 min\n", "Epoch: 070/100 | Batch 000/469 | Gen/Dis Loss: 1.0647/0.6247\n", "Epoch: 070/100 | Batch 100/469 | Gen/Dis Loss: 0.8877/0.6254\n", "Epoch: 070/100 | Batch 200/469 | Gen/Dis Loss: 0.8151/0.6462\n", "Epoch: 070/100 | Batch 300/469 | Gen/Dis Loss: 0.8807/0.6079\n", "Epoch: 070/100 | Batch 400/469 | Gen/Dis Loss: 0.9690/0.6432\n", "Time elapsed: 13.34 min\n", "Epoch: 071/100 | Batch 000/469 | Gen/Dis Loss: 0.8764/0.6338\n", "Epoch: 071/100 | Batch 100/469 | Gen/Dis Loss: 0.9052/0.5937\n", "Epoch: 071/100 | Batch 200/469 | Gen/Dis Loss: 1.0023/0.5866\n", "Epoch: 071/100 | Batch 300/469 | Gen/Dis Loss: 0.7945/0.6066\n", "Epoch: 071/100 | Batch 400/469 | Gen/Dis Loss: 0.8566/0.6092\n", "Time elapsed: 13.57 min\n", "Epoch: 072/100 | Batch 000/469 | Gen/Dis Loss: 1.0826/0.5474\n", "Epoch: 072/100 | Batch 100/469 | Gen/Dis Loss: 0.9077/0.6232\n", "Epoch: 072/100 | Batch 200/469 | Gen/Dis Loss: 1.0860/0.6291\n", "Epoch: 072/100 | Batch 300/469 | Gen/Dis Loss: 0.9009/0.6444\n", "Epoch: 072/100 | Batch 400/469 | Gen/Dis Loss: 0.9546/0.6265\n", "Time elapsed: 13.82 min\n", "Epoch: 073/100 | Batch 000/469 | Gen/Dis Loss: 0.9126/0.5977\n", "Epoch: 073/100 | Batch 100/469 | Gen/Dis Loss: 1.0169/0.6357\n", "Epoch: 073/100 | Batch 200/469 | Gen/Dis Loss: 0.8760/0.6333\n", "Epoch: 073/100 | Batch 300/469 | Gen/Dis Loss: 0.8972/0.5929\n", "Epoch: 073/100 | Batch 400/469 | Gen/Dis Loss: 0.9535/0.6609\n", "Time elapsed: 14.05 min\n", "Epoch: 074/100 | Batch 000/469 | Gen/Dis Loss: 0.8905/0.6017\n", "Epoch: 074/100 | Batch 100/469 | Gen/Dis Loss: 0.9040/0.6458\n", "Epoch: 074/100 | Batch 200/469 | Gen/Dis Loss: 0.8277/0.6424\n", "Epoch: 074/100 | Batch 300/469 | Gen/Dis Loss: 1.6138/0.5738\n", "Epoch: 074/100 | Batch 400/469 | Gen/Dis Loss: 0.9943/0.6718\n", "Time elapsed: 14.31 min\n", "Epoch: 075/100 | Batch 000/469 | Gen/Dis Loss: 1.0839/0.6357\n", "Epoch: 075/100 | Batch 100/469 | Gen/Dis Loss: 0.8858/0.6300\n", "Epoch: 075/100 | Batch 200/469 | Gen/Dis Loss: 0.9034/0.6045\n", "Epoch: 075/100 | Batch 300/469 | Gen/Dis Loss: 0.8336/0.5991\n", "Epoch: 075/100 | Batch 400/469 | Gen/Dis Loss: 0.8414/0.6642\n", "Time elapsed: 14.54 min\n", "Epoch: 076/100 | Batch 000/469 | Gen/Dis Loss: 0.8422/0.6506\n", "Epoch: 076/100 | Batch 100/469 | Gen/Dis Loss: 0.8560/0.5884\n", "Epoch: 076/100 | Batch 200/469 | Gen/Dis Loss: 0.8066/0.6215\n", "Epoch: 076/100 | Batch 300/469 | Gen/Dis Loss: 0.7987/0.6537\n", "Epoch: 076/100 | Batch 400/469 | Gen/Dis Loss: 0.8784/0.5854\n", "Time elapsed: 14.82 min\n", "Epoch: 077/100 | Batch 000/469 | Gen/Dis Loss: 0.9845/0.6067\n", "Epoch: 077/100 | Batch 100/469 | Gen/Dis Loss: 0.8514/0.6269\n", "Epoch: 077/100 | Batch 200/469 | Gen/Dis Loss: 1.0448/0.6637\n", "Epoch: 077/100 | Batch 300/469 | Gen/Dis Loss: 0.9325/0.5811\n", "Epoch: 077/100 | Batch 400/469 | Gen/Dis Loss: 0.9169/0.5837\n", "Time elapsed: 15.08 min\n", "Epoch: 078/100 | Batch 000/469 | Gen/Dis Loss: 0.9746/0.6398\n", "Epoch: 078/100 | Batch 100/469 | Gen/Dis Loss: 0.8518/0.6321\n", "Epoch: 078/100 | Batch 200/469 | Gen/Dis Loss: 0.9485/0.5925\n", "Epoch: 078/100 | Batch 300/469 | Gen/Dis Loss: 0.8646/0.6530\n", "Epoch: 078/100 | Batch 400/469 | Gen/Dis Loss: 0.8851/0.6056\n", "Time elapsed: 15.33 min\n", "Epoch: 079/100 | Batch 000/469 | Gen/Dis Loss: 0.9215/0.6184\n", "Epoch: 079/100 | Batch 100/469 | Gen/Dis Loss: 0.8766/0.5987\n", "Epoch: 079/100 | Batch 200/469 | Gen/Dis Loss: 0.9273/0.6339\n", "Epoch: 079/100 | Batch 300/469 | Gen/Dis Loss: 1.0428/0.6016\n", "Epoch: 079/100 | Batch 400/469 | Gen/Dis Loss: 0.8676/0.6156\n", "Time elapsed: 15.63 min\n", "Epoch: 080/100 | Batch 000/469 | Gen/Dis Loss: 0.8753/0.6354\n", "Epoch: 080/100 | Batch 100/469 | Gen/Dis Loss: 0.7689/0.6156\n", "Epoch: 080/100 | Batch 200/469 | Gen/Dis Loss: 0.9524/0.5874\n", "Epoch: 080/100 | Batch 300/469 | Gen/Dis Loss: 1.1452/0.5870\n", "Epoch: 080/100 | Batch 400/469 | Gen/Dis Loss: 0.9418/0.5921\n", "Time elapsed: 15.87 min\n", "Epoch: 081/100 | Batch 000/469 | Gen/Dis Loss: 0.9341/0.5982\n", "Epoch: 081/100 | Batch 100/469 | Gen/Dis Loss: 0.9412/0.6336\n", "Epoch: 081/100 | Batch 200/469 | Gen/Dis Loss: 0.8976/0.6561\n", "Epoch: 081/100 | Batch 300/469 | Gen/Dis Loss: 0.8531/0.6544\n", "Epoch: 081/100 | Batch 400/469 | Gen/Dis Loss: 0.8658/0.6275\n", "Time elapsed: 16.14 min\n", "Epoch: 082/100 | Batch 000/469 | Gen/Dis Loss: 0.8624/0.6454\n", "Epoch: 082/100 | Batch 100/469 | Gen/Dis Loss: 0.8182/0.5911\n", "Epoch: 082/100 | Batch 200/469 | Gen/Dis Loss: 0.8794/0.6080\n", "Epoch: 082/100 | Batch 300/469 | Gen/Dis Loss: 0.9631/0.6111\n", "Epoch: 082/100 | Batch 400/469 | Gen/Dis Loss: 1.0426/0.6404\n", "Time elapsed: 16.39 min\n", "Epoch: 083/100 | Batch 000/469 | Gen/Dis Loss: 1.0449/0.6439\n", "Epoch: 083/100 | Batch 100/469 | Gen/Dis Loss: 0.9290/0.6319\n", "Epoch: 083/100 | Batch 200/469 | Gen/Dis Loss: 0.8768/0.6186\n", "Epoch: 083/100 | Batch 300/469 | Gen/Dis Loss: 0.8202/0.6050\n", "Epoch: 083/100 | Batch 400/469 | Gen/Dis Loss: 0.8840/0.6135\n", "Time elapsed: 16.63 min\n", "Epoch: 084/100 | Batch 000/469 | Gen/Dis Loss: 1.0632/0.6157\n", "Epoch: 084/100 | Batch 100/469 | Gen/Dis Loss: 0.8863/0.5954\n", "Epoch: 084/100 | Batch 200/469 | Gen/Dis Loss: 1.0618/0.6428\n", "Epoch: 084/100 | Batch 300/469 | Gen/Dis Loss: 1.0627/0.5874\n", "Epoch: 084/100 | Batch 400/469 | Gen/Dis Loss: 0.9114/0.6118\n", "Time elapsed: 16.90 min\n", "Epoch: 085/100 | Batch 000/469 | Gen/Dis Loss: 0.8453/0.6248\n", "Epoch: 085/100 | Batch 100/469 | Gen/Dis Loss: 1.0609/0.6182\n", "Epoch: 085/100 | Batch 200/469 | Gen/Dis Loss: 0.8899/0.6170\n", "Epoch: 085/100 | Batch 300/469 | Gen/Dis Loss: 0.9211/0.6023\n", "Epoch: 085/100 | Batch 400/469 | Gen/Dis Loss: 0.8161/0.6840\n", "Time elapsed: 17.21 min\n", "Epoch: 086/100 | Batch 000/469 | Gen/Dis Loss: 0.9190/0.5845\n", "Epoch: 086/100 | Batch 100/469 | Gen/Dis Loss: 1.0762/0.6450\n", "Epoch: 086/100 | Batch 200/469 | Gen/Dis Loss: 1.0070/0.6302\n", "Epoch: 086/100 | Batch 300/469 | Gen/Dis Loss: 0.8805/0.6313\n", "Epoch: 086/100 | Batch 400/469 | Gen/Dis Loss: 0.8568/0.6320\n", "Time elapsed: 17.47 min\n", "Epoch: 087/100 | Batch 000/469 | Gen/Dis Loss: 0.9597/0.6527\n", "Epoch: 087/100 | Batch 100/469 | Gen/Dis Loss: 0.8664/0.6339\n", "Epoch: 087/100 | Batch 200/469 | Gen/Dis Loss: 1.0466/0.6181\n", "Epoch: 087/100 | Batch 300/469 | Gen/Dis Loss: 0.8645/0.6272\n", "Epoch: 087/100 | Batch 400/469 | Gen/Dis Loss: 0.8296/0.6125\n", "Time elapsed: 17.71 min\n", "Epoch: 088/100 | Batch 000/469 | Gen/Dis Loss: 0.8497/0.6134\n", "Epoch: 088/100 | Batch 100/469 | Gen/Dis Loss: 0.7984/0.6551\n", "Epoch: 088/100 | Batch 200/469 | Gen/Dis Loss: 0.7777/0.6737\n", "Epoch: 088/100 | Batch 300/469 | Gen/Dis Loss: 0.8157/0.6250\n", "Epoch: 088/100 | Batch 400/469 | Gen/Dis Loss: 0.7993/0.6446\n", "Time elapsed: 17.96 min\n", "Epoch: 089/100 | Batch 000/469 | Gen/Dis Loss: 0.8526/0.6219\n", "Epoch: 089/100 | Batch 100/469 | Gen/Dis Loss: 0.9565/0.6241\n", "Epoch: 089/100 | Batch 200/469 | Gen/Dis Loss: 1.0437/0.6488\n", "Epoch: 089/100 | Batch 300/469 | Gen/Dis Loss: 0.8082/0.6521\n", "Epoch: 089/100 | Batch 400/469 | Gen/Dis Loss: 0.9082/0.6187\n", "Time elapsed: 18.20 min\n", "Epoch: 090/100 | Batch 000/469 | Gen/Dis Loss: 0.8507/0.6127\n", "Epoch: 090/100 | Batch 100/469 | Gen/Dis Loss: 0.8370/0.6160\n", "Epoch: 090/100 | Batch 200/469 | Gen/Dis Loss: 0.8270/0.6310\n", "Epoch: 090/100 | Batch 300/469 | Gen/Dis Loss: 0.9313/0.6230\n", "Epoch: 090/100 | Batch 400/469 | Gen/Dis Loss: 0.9462/0.6391\n", "Time elapsed: 18.46 min\n", "Epoch: 091/100 | Batch 000/469 | Gen/Dis Loss: 0.9294/0.6189\n", "Epoch: 091/100 | Batch 100/469 | Gen/Dis Loss: 1.0533/0.6279\n", "Epoch: 091/100 | Batch 200/469 | Gen/Dis Loss: 0.9623/0.6491\n", "Epoch: 091/100 | Batch 300/469 | Gen/Dis Loss: 0.8521/0.6031\n", "Epoch: 091/100 | Batch 400/469 | Gen/Dis Loss: 0.8233/0.6487\n", "Time elapsed: 18.70 min\n", "Epoch: 092/100 | Batch 000/469 | Gen/Dis Loss: 0.9691/0.6357\n", "Epoch: 092/100 | Batch 100/469 | Gen/Dis Loss: 0.8876/0.6303\n", "Epoch: 092/100 | Batch 200/469 | Gen/Dis Loss: 0.9333/0.6201\n", "Epoch: 092/100 | Batch 300/469 | Gen/Dis Loss: 0.8813/0.5981\n", "Epoch: 092/100 | Batch 400/469 | Gen/Dis Loss: 0.9026/0.6128\n", "Time elapsed: 18.94 min\n", "Epoch: 093/100 | Batch 000/469 | Gen/Dis Loss: 0.8874/0.6373\n", "Epoch: 093/100 | Batch 100/469 | Gen/Dis Loss: 0.8537/0.6204\n", "Epoch: 093/100 | Batch 200/469 | Gen/Dis Loss: 0.7982/0.6342\n", "Epoch: 093/100 | Batch 300/469 | Gen/Dis Loss: 0.9005/0.6010\n", "Epoch: 093/100 | Batch 400/469 | Gen/Dis Loss: 1.0532/0.6091\n", "Time elapsed: 19.20 min\n", "Epoch: 094/100 | Batch 000/469 | Gen/Dis Loss: 0.9877/0.6426\n", "Epoch: 094/100 | Batch 100/469 | Gen/Dis Loss: 0.8308/0.6501\n", "Epoch: 094/100 | Batch 200/469 | Gen/Dis Loss: 0.9217/0.6269\n", "Epoch: 094/100 | Batch 300/469 | Gen/Dis Loss: 0.9183/0.6632\n", "Epoch: 094/100 | Batch 400/469 | Gen/Dis Loss: 0.8859/0.6128\n", "Time elapsed: 19.46 min\n", "Epoch: 095/100 | Batch 000/469 | Gen/Dis Loss: 0.9032/0.6331\n", "Epoch: 095/100 | Batch 100/469 | Gen/Dis Loss: 0.8298/0.6976\n", "Epoch: 095/100 | Batch 200/469 | Gen/Dis Loss: 1.0004/0.6347\n", "Epoch: 095/100 | Batch 300/469 | Gen/Dis Loss: 0.9161/0.6169\n", "Epoch: 095/100 | Batch 400/469 | Gen/Dis Loss: 0.7622/0.6884\n", "Time elapsed: 19.71 min\n", "Epoch: 096/100 | Batch 000/469 | Gen/Dis Loss: 0.8816/0.5997\n", "Epoch: 096/100 | Batch 100/469 | Gen/Dis Loss: 0.9499/0.5969\n", "Epoch: 096/100 | Batch 200/469 | Gen/Dis Loss: 0.8974/0.6214\n", "Epoch: 096/100 | Batch 300/469 | Gen/Dis Loss: 0.8853/0.6259\n", "Epoch: 096/100 | Batch 400/469 | Gen/Dis Loss: 0.8107/0.6027\n", "Time elapsed: 19.95 min\n", "Epoch: 097/100 | Batch 000/469 | Gen/Dis Loss: 0.9242/0.6189\n", "Epoch: 097/100 | Batch 100/469 | Gen/Dis Loss: 0.8917/0.6491\n", "Epoch: 097/100 | Batch 200/469 | Gen/Dis Loss: 0.8729/0.6375\n", "Epoch: 097/100 | Batch 300/469 | Gen/Dis Loss: 0.8848/0.5950\n", "Epoch: 097/100 | Batch 400/469 | Gen/Dis Loss: 0.8502/0.6296\n", "Time elapsed: 20.21 min\n", "Epoch: 098/100 | Batch 000/469 | Gen/Dis Loss: 0.9020/0.6453\n", "Epoch: 098/100 | Batch 100/469 | Gen/Dis Loss: 1.1077/0.5882\n", "Epoch: 098/100 | Batch 200/469 | Gen/Dis Loss: 0.9468/0.6364\n", "Epoch: 098/100 | Batch 300/469 | Gen/Dis Loss: 0.8636/0.6313\n", "Epoch: 098/100 | Batch 400/469 | Gen/Dis Loss: 0.9089/0.6911\n", "Time elapsed: 20.45 min\n", "Epoch: 099/100 | Batch 000/469 | Gen/Dis Loss: 0.9101/0.6386\n", "Epoch: 099/100 | Batch 100/469 | Gen/Dis Loss: 0.8036/0.6396\n", "Epoch: 099/100 | Batch 200/469 | Gen/Dis Loss: 0.9393/0.6060\n", "Epoch: 099/100 | Batch 300/469 | Gen/Dis Loss: 0.8776/0.6242\n", "Epoch: 099/100 | Batch 400/469 | Gen/Dis Loss: 0.8244/0.6278\n", "Time elapsed: 20.68 min\n", "Epoch: 100/100 | Batch 000/469 | Gen/Dis Loss: 0.8623/0.6496\n", "Epoch: 100/100 | Batch 100/469 | Gen/Dis Loss: 0.9965/0.5964\n", "Epoch: 100/100 | Batch 200/469 | Gen/Dis Loss: 0.8666/0.6306\n", "Epoch: 100/100 | Batch 300/469 | Gen/Dis Loss: 1.1555/0.6634\n", "Epoch: 100/100 | Batch 400/469 | Gen/Dis Loss: 0.9071/0.6545\n", "Time elapsed: 20.94 min\n", "Total Training Time: 20.94 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", " \n", " features = (features - 0.5)*2.\n", " features = features.view(-1, IMG_SIZE).to(device) \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)\n", " \n", " gener_loss = F.binary_cross_entropy(discr_pred, valid)\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(-1, IMG_SIZE))\n", " real_loss = F.binary_cross_entropy(discr_pred_real, valid)\n", " \n", " discr_pred_fake = model.discriminator_forward(generated_features.detach())\n", " fake_loss = F.binary_cross_entropy(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)\n", " gener_costs.append(gener_loss)\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": "markdown", "metadata": {}, "source": [ "## Evaluation" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "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')" ] } ], "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 }