{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "background_save": true,
          "base_uri": "https://localhost:8080/"
        },
        "id": "rzJvtmZ3BLvX",
        "outputId": "1efc6046-7f31-4cb4-b007-3c027a074b51"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Mounted at /content/drive\n",
            "Will generate 128px square images.\n",
            "Looking for file: /content/drive/MyDrive/Drive/Journals/IGPL/Lennert/face1/training_data_128_128.npy\n",
            "Loading training images...\n"
          ]
        },
        {
          "name": "stderr",
          "output_type": "stream",
          "text": [
            "100%|██████████| 1/1 [00:00<00:00,  2.28it/s]\n"
          ]
        },
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Saving training image binary...\n",
            "Image preprocess time: 0:00:00.47\n",
            "Generator\n",
            "Model: \"sequential\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " dense (Dense)               (None, 4096)              413696    \n",
            "                                                                 \n",
            " reshape (Reshape)           (None, 4, 4, 256)         0         \n",
            "                                                                 \n",
            " up_sampling2d (UpSampling2D  (None, 8, 8, 256)        0         \n",
            " )                                                               \n",
            "                                                                 \n",
            " conv2d (Conv2D)             (None, 8, 8, 256)         590080    \n",
            "                                                                 \n",
            " batch_normalization (BatchN  (None, 8, 8, 256)        1024      \n",
            " ormalization)                                                   \n",
            "                                                                 \n",
            " activation (Activation)     (None, 8, 8, 256)         0         \n",
            "                                                                 \n",
            " up_sampling2d_1 (UpSampling  (None, 16, 16, 256)      0         \n",
            " 2D)                                                             \n",
            "                                                                 \n",
            " conv2d_1 (Conv2D)           (None, 16, 16, 256)       590080    \n",
            "                                                                 \n",
            " batch_normalization_1 (Batc  (None, 16, 16, 256)      1024      \n",
            " hNormalization)                                                 \n",
            "                                                                 \n",
            " activation_1 (Activation)   (None, 16, 16, 256)       0         \n",
            "                                                                 \n",
            " up_sampling2d_2 (UpSampling  (None, 32, 32, 256)      0         \n",
            " 2D)                                                             \n",
            "                                                                 \n",
            " conv2d_2 (Conv2D)           (None, 32, 32, 128)       295040    \n",
            "                                                                 \n",
            " batch_normalization_2 (Batc  (None, 32, 32, 128)      512       \n",
            " hNormalization)                                                 \n",
            "                                                                 \n",
            " activation_2 (Activation)   (None, 32, 32, 128)       0         \n",
            "                                                                 \n",
            " up_sampling2d_3 (UpSampling  (None, 128, 128, 128)    0         \n",
            " 2D)                                                             \n",
            "                                                                 \n",
            " conv2d_3 (Conv2D)           (None, 128, 128, 128)     147584    \n",
            "                                                                 \n",
            " batch_normalization_3 (Batc  (None, 128, 128, 128)    512       \n",
            " hNormalization)                                                 \n",
            "                                                                 \n",
            " activation_3 (Activation)   (None, 128, 128, 128)     0         \n",
            "                                                                 \n",
            " conv2d_4 (Conv2D)           (None, 128, 128, 3)       3459      \n",
            "                                                                 \n",
            " activation_4 (Activation)   (None, 128, 128, 3)       0         \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 2,043,011\n",
            "Trainable params: 2,041,475\n",
            "Non-trainable params: 1,536\n",
            "_________________________________________________________________\n",
            "None\n",
            "Discriminator\n",
            "Model: \"sequential_1\"\n",
            "_________________________________________________________________\n",
            " Layer (type)                Output Shape              Param #   \n",
            "=================================================================\n",
            " conv2d_5 (Conv2D)           (None, 64, 64, 32)        896       \n",
            "                                                                 \n",
            " leaky_re_lu (LeakyReLU)     (None, 64, 64, 32)        0         \n",
            "                                                                 \n",
            " dropout (Dropout)           (None, 64, 64, 32)        0         \n",
            "                                                                 \n",
            " conv2d_6 (Conv2D)           (None, 32, 32, 64)        18496     \n",
            "                                                                 \n",
            " zero_padding2d (ZeroPadding  (None, 33, 33, 64)       0         \n",
            " 2D)                                                             \n",
            "                                                                 \n",
            " batch_normalization_4 (Batc  (None, 33, 33, 64)       256       \n",
            " hNormalization)                                                 \n",
            "                                                                 \n",
            " leaky_re_lu_1 (LeakyReLU)   (None, 33, 33, 64)        0         \n",
            "                                                                 \n",
            " dropout_1 (Dropout)         (None, 33, 33, 64)        0         \n",
            "                                                                 \n",
            " conv2d_7 (Conv2D)           (None, 17, 17, 128)       73856     \n",
            "                                                                 \n",
            " batch_normalization_5 (Batc  (None, 17, 17, 128)      512       \n",
            " hNormalization)                                                 \n",
            "                                                                 \n",
            " leaky_re_lu_2 (LeakyReLU)   (None, 17, 17, 128)       0         \n",
            "                                                                 \n",
            " dropout_2 (Dropout)         (None, 17, 17, 128)       0         \n",
            "                                                                 \n",
            " conv2d_8 (Conv2D)           (None, 17, 17, 256)       295168    \n",
            "                                                                 \n",
            " batch_normalization_6 (Batc  (None, 17, 17, 256)      1024      \n",
            " hNormalization)                                                 \n",
            "                                                                 \n",
            " leaky_re_lu_3 (LeakyReLU)   (None, 17, 17, 256)       0         \n",
            "                                                                 \n",
            " dropout_3 (Dropout)         (None, 17, 17, 256)       0         \n",
            "                                                                 \n",
            " conv2d_9 (Conv2D)           (None, 17, 17, 512)       1180160   \n",
            "                                                                 \n",
            " batch_normalization_7 (Batc  (None, 17, 17, 512)      2048      \n",
            " hNormalization)                                                 \n",
            "                                                                 \n",
            " leaky_re_lu_4 (LeakyReLU)   (None, 17, 17, 512)       0         \n",
            "                                                                 \n",
            " dropout_4 (Dropout)         (None, 17, 17, 512)       0         \n",
            "                                                                 \n",
            " flatten (Flatten)           (None, 147968)            0         \n",
            "                                                                 \n",
            " dense_1 (Dense)             (None, 1)                 147969    \n",
            "                                                                 \n",
            "=================================================================\n",
            "Total params: 1,720,385\n",
            "Trainable params: 1,718,465\n",
            "Non-trainable params: 1,920\n",
            "_________________________________________________________________\n",
            "None\n",
            "tf.Tensor([[0.50009817]], shape=(1, 1), dtype=float32)\n",
            "Epoch 1, gen loss=0.6520942449569702,disc loss=1.416571855545044, {hms_string(epoch_elapsed)}\n",
            "Epoch 2, gen loss=3.1140129566192627,disc loss=0.7289078831672668, {hms_string(epoch_elapsed)}\n",
            "Epoch 3, gen loss=3.8552136421203613,disc loss=0.379133015871048, {hms_string(epoch_elapsed)}\n",
            "Epoch 4, gen loss=2.56282901763916,disc loss=0.20574340224266052, {hms_string(epoch_elapsed)}\n",
            "Epoch 5, gen loss=2.0994908809661865,disc loss=0.23866277933120728, {hms_string(epoch_elapsed)}\n",
            "Epoch 6, gen loss=3.328505039215088,disc loss=0.22116829454898834, {hms_string(epoch_elapsed)}\n",
            "Epoch 7, gen loss=3.953986644744873,disc loss=0.054313719272613525, {hms_string(epoch_elapsed)}\n",
            "Epoch 8, gen loss=3.9572741985321045,disc loss=0.037026725709438324, {hms_string(epoch_elapsed)}\n",
            "Epoch 9, gen loss=4.581644058227539,disc loss=0.0215307530015707, {hms_string(epoch_elapsed)}\n",
            "Epoch 10, gen loss=4.717677116394043,disc loss=0.02346457913517952, {hms_string(epoch_elapsed)}\n",
            "Epoch 11, gen loss=4.649706840515137,disc loss=0.2711801528930664, {hms_string(epoch_elapsed)}\n",
            "Epoch 12, gen loss=3.5608479976654053,disc loss=0.05945201963186264, {hms_string(epoch_elapsed)}\n",
            "Epoch 13, gen loss=3.473151206970215,disc loss=0.05895889550447464, {hms_string(epoch_elapsed)}\n",
            "Epoch 14, gen loss=4.0892415046691895,disc loss=0.027271268889307976, {hms_string(epoch_elapsed)}\n",
            "Epoch 15, gen loss=4.399842262268066,disc loss=0.03539065644145012, {hms_string(epoch_elapsed)}\n",
            "Epoch 16, gen loss=4.623194694519043,disc loss=0.02065383642911911, {hms_string(epoch_elapsed)}\n",
            "Epoch 17, gen loss=4.399579048156738,disc loss=0.020746203139424324, {hms_string(epoch_elapsed)}\n",
            "Epoch 18, gen loss=4.877606391906738,disc loss=0.015695666894316673, {hms_string(epoch_elapsed)}\n",
            "Epoch 19, gen loss=4.956896781921387,disc loss=0.02239593118429184, {hms_string(epoch_elapsed)}\n",
            "Epoch 20, gen loss=5.073262691497803,disc loss=0.037092529237270355, {hms_string(epoch_elapsed)}\n",
            "Epoch 21, gen loss=4.72825813293457,disc loss=0.017653584480285645, {hms_string(epoch_elapsed)}\n",
            "Epoch 22, gen loss=5.252861976623535,disc loss=0.02427506446838379, {hms_string(epoch_elapsed)}\n",
            "Epoch 23, gen loss=5.091231346130371,disc loss=0.021590305492281914, {hms_string(epoch_elapsed)}\n",
            "Epoch 24, gen loss=5.0756611824035645,disc loss=0.03069666400551796, {hms_string(epoch_elapsed)}\n",
            "Epoch 25, gen loss=4.469202995300293,disc loss=0.02198425494134426, {hms_string(epoch_elapsed)}\n",
            "Epoch 26, gen loss=4.4691667556762695,disc loss=0.040817953646183014, {hms_string(epoch_elapsed)}\n",
            "Epoch 27, gen loss=4.886445045471191,disc loss=0.017871592193841934, {hms_string(epoch_elapsed)}\n",
            "Epoch 28, gen loss=5.148619651794434,disc loss=0.021956998854875565, {hms_string(epoch_elapsed)}\n",
            "Epoch 29, gen loss=5.152141094207764,disc loss=0.01604112796485424, {hms_string(epoch_elapsed)}\n",
            "Epoch 30, gen loss=5.85104513168335,disc loss=0.017551321536302567, {hms_string(epoch_elapsed)}\n",
            "Epoch 31, gen loss=5.6895527839660645,disc loss=0.013021672144532204, {hms_string(epoch_elapsed)}\n",
            "Epoch 32, gen loss=5.392418384552002,disc loss=0.02126910537481308, {hms_string(epoch_elapsed)}\n",
            "Epoch 33, gen loss=5.263936996459961,disc loss=0.01943649724125862, {hms_string(epoch_elapsed)}\n",
            "Epoch 34, gen loss=5.222603797912598,disc loss=0.015156745910644531, {hms_string(epoch_elapsed)}\n",
            "Epoch 35, gen loss=5.401109218597412,disc loss=0.009597649797797203, {hms_string(epoch_elapsed)}\n",
            "Epoch 36, gen loss=5.148360252380371,disc loss=0.015748750418424606, {hms_string(epoch_elapsed)}\n",
            "Epoch 37, gen loss=5.489713191986084,disc loss=0.037291139364242554, {hms_string(epoch_elapsed)}\n",
            "Epoch 38, gen loss=5.418452262878418,disc loss=0.014353098347783089, {hms_string(epoch_elapsed)}\n",
            "Epoch 39, gen loss=5.08512020111084,disc loss=0.0201713927090168, {hms_string(epoch_elapsed)}\n",
            "Epoch 40, gen loss=5.222087860107422,disc loss=0.022613275796175003, {hms_string(epoch_elapsed)}\n",
            "Epoch 41, gen loss=5.206090927124023,disc loss=0.01819682866334915, {hms_string(epoch_elapsed)}\n",
            "Epoch 42, gen loss=5.18019962310791,disc loss=0.014048153534531593, {hms_string(epoch_elapsed)}\n",
            "Epoch 43, gen loss=5.1629638671875,disc loss=0.024643752723932266, {hms_string(epoch_elapsed)}\n",
            "Epoch 44, gen loss=5.291773796081543,disc loss=0.020540457218885422, {hms_string(epoch_elapsed)}\n",
            "Epoch 45, gen loss=5.883324146270752,disc loss=0.00813925638794899, {hms_string(epoch_elapsed)}\n",
            "Epoch 46, gen loss=5.8028059005737305,disc loss=0.019253775477409363, {hms_string(epoch_elapsed)}\n",
            "Epoch 47, gen loss=5.210031509399414,disc loss=0.012013599276542664, {hms_string(epoch_elapsed)}\n",
            "Epoch 48, gen loss=5.6294636726379395,disc loss=0.012103942222893238, {hms_string(epoch_elapsed)}\n",
            "Epoch 49, gen loss=5.494189739227295,disc loss=0.029012974351644516, {hms_string(epoch_elapsed)}\n",
            "Epoch 50, gen loss=5.536547660827637,disc loss=0.022227687761187553, {hms_string(epoch_elapsed)}\n",
            "Epoch 51, gen loss=5.088579177856445,disc loss=0.016629990190267563, {hms_string(epoch_elapsed)}\n",
            "Epoch 52, gen loss=5.391696929931641,disc loss=0.03828903287649155, {hms_string(epoch_elapsed)}\n",
            "Epoch 53, gen loss=4.969578742980957,disc loss=0.013259409926831722, {hms_string(epoch_elapsed)}\n",
            "Epoch 54, gen loss=4.991628646850586,disc loss=0.0295354463160038, {hms_string(epoch_elapsed)}\n",
            "Epoch 55, gen loss=5.001875877380371,disc loss=0.019258132204413414, {hms_string(epoch_elapsed)}\n",
            "Epoch 56, gen loss=5.7661452293396,disc loss=0.013027999550104141, {hms_string(epoch_elapsed)}\n",
            "Epoch 57, gen loss=5.785161018371582,disc loss=0.010046866722404957, {hms_string(epoch_elapsed)}\n",
            "Epoch 58, gen loss=6.380951881408691,disc loss=0.014756312593817711, {hms_string(epoch_elapsed)}\n",
            "Epoch 59, gen loss=6.314426422119141,disc loss=0.00685094203799963, {hms_string(epoch_elapsed)}\n",
            "Epoch 60, gen loss=6.529977798461914,disc loss=0.015164030715823174, {hms_string(epoch_elapsed)}\n",
            "Epoch 61, gen loss=6.306687831878662,disc loss=0.013058934360742569, {hms_string(epoch_elapsed)}\n",
            "Epoch 62, gen loss=5.533941268920898,disc loss=0.012348036281764507, {hms_string(epoch_elapsed)}\n",
            "Epoch 63, gen loss=6.181975364685059,disc loss=0.004889591597020626, {hms_string(epoch_elapsed)}\n",
            "Epoch 64, gen loss=5.854901313781738,disc loss=0.017308959737420082, {hms_string(epoch_elapsed)}\n",
            "Epoch 65, gen loss=6.038759231567383,disc loss=0.02880295179784298, {hms_string(epoch_elapsed)}\n",
            "Epoch 66, gen loss=6.272543430328369,disc loss=0.006916644982993603, {hms_string(epoch_elapsed)}\n",
            "Epoch 67, gen loss=6.202108383178711,disc loss=0.01842658780515194, {hms_string(epoch_elapsed)}\n",
            "Epoch 68, gen loss=6.008027076721191,disc loss=0.01226614136248827, {hms_string(epoch_elapsed)}\n",
            "Epoch 69, gen loss=5.927837371826172,disc loss=0.016773181036114693, {hms_string(epoch_elapsed)}\n",
            "Epoch 70, gen loss=6.340614318847656,disc loss=0.010290402919054031, {hms_string(epoch_elapsed)}\n",
            "Epoch 71, gen loss=5.8926591873168945,disc loss=0.0569896437227726, {hms_string(epoch_elapsed)}\n",
            "Epoch 72, gen loss=4.948429584503174,disc loss=0.015281099826097488, {hms_string(epoch_elapsed)}\n",
            "Epoch 73, gen loss=4.603322505950928,disc loss=0.040757156908512115, {hms_string(epoch_elapsed)}\n",
            "Epoch 74, gen loss=5.140169143676758,disc loss=0.028628982603549957, {hms_string(epoch_elapsed)}\n",
            "Epoch 75, gen loss=6.309422492980957,disc loss=0.010562155395746231, {hms_string(epoch_elapsed)}\n",
            "Epoch 76, gen loss=6.647950172424316,disc loss=0.01429857686161995, {hms_string(epoch_elapsed)}\n",
            "Epoch 77, gen loss=6.6677398681640625,disc loss=0.009287410415709019, {hms_string(epoch_elapsed)}\n",
            "Epoch 78, gen loss=6.436460494995117,disc loss=0.09432210773229599, {hms_string(epoch_elapsed)}\n",
            "Epoch 79, gen loss=2.775494337081909,disc loss=0.13450048863887787, {hms_string(epoch_elapsed)}\n",
            "Epoch 80, gen loss=5.205142021179199,disc loss=0.0313972570002079, {hms_string(epoch_elapsed)}\n",
            "Epoch 81, gen loss=8.392739295959473,disc loss=0.0027570868842303753, {hms_string(epoch_elapsed)}\n",
            "Epoch 82, gen loss=8.952607154846191,disc loss=0.07980901002883911, {hms_string(epoch_elapsed)}\n",
            "Epoch 83, gen loss=6.5285468101501465,disc loss=0.0066247740760445595, {hms_string(epoch_elapsed)}\n",
            "Epoch 84, gen loss=5.546722888946533,disc loss=0.008742748759686947, {hms_string(epoch_elapsed)}\n",
            "Epoch 85, gen loss=5.248372554779053,disc loss=0.01598319225013256, {hms_string(epoch_elapsed)}\n",
            "Epoch 86, gen loss=5.981294631958008,disc loss=0.02198817953467369, {hms_string(epoch_elapsed)}\n",
            "Epoch 87, gen loss=5.14166784286499,disc loss=0.0181167833507061, {hms_string(epoch_elapsed)}\n",
            "Epoch 88, gen loss=6.200558662414551,disc loss=0.006913096643984318, {hms_string(epoch_elapsed)}\n",
            "Epoch 89, gen loss=6.709668159484863,disc loss=0.004263648763298988, {hms_string(epoch_elapsed)}\n",
            "Epoch 90, gen loss=6.79091215133667,disc loss=0.01563425362110138, {hms_string(epoch_elapsed)}\n",
            "Epoch 91, gen loss=6.707103252410889,disc loss=0.007562635932117701, {hms_string(epoch_elapsed)}\n",
            "Epoch 92, gen loss=5.989650726318359,disc loss=0.005445807706564665, {hms_string(epoch_elapsed)}\n",
            "Epoch 93, gen loss=6.360260009765625,disc loss=0.010015801526606083, {hms_string(epoch_elapsed)}\n",
            "Epoch 94, gen loss=6.817960739135742,disc loss=0.004425506107509136, {hms_string(epoch_elapsed)}\n",
            "Epoch 95, gen loss=6.86895227432251,disc loss=0.009703109972178936, {hms_string(epoch_elapsed)}\n",
            "Epoch 96, gen loss=6.615445137023926,disc loss=0.012971291318535805, {hms_string(epoch_elapsed)}\n",
            "Epoch 97, gen loss=6.993577480316162,disc loss=0.056597672402858734, {hms_string(epoch_elapsed)}\n",
            "Epoch 98, gen loss=4.295334815979004,disc loss=0.04187425598502159, {hms_string(epoch_elapsed)}\n",
            "Epoch 99, gen loss=5.5988054275512695,disc loss=0.010199099779129028, {hms_string(epoch_elapsed)}\n",
            "Epoch 100, gen loss=5.5824971199035645,disc loss=0.014587768353521824, {hms_string(epoch_elapsed)}\n",
            "Epoch 101, gen loss=5.818615913391113,disc loss=0.008121470920741558, {hms_string(epoch_elapsed)}\n",
            "Epoch 102, gen loss=5.748406410217285,disc loss=0.009632195346057415, {hms_string(epoch_elapsed)}\n",
            "Epoch 103, gen loss=6.248942852020264,disc loss=0.004357462283223867, {hms_string(epoch_elapsed)}\n",
            "Epoch 104, gen loss=6.420766830444336,disc loss=0.0052632116712629795, {hms_string(epoch_elapsed)}\n",
            "Epoch 105, gen loss=6.534418106079102,disc loss=0.006908143404871225, {hms_string(epoch_elapsed)}\n",
            "Epoch 106, gen loss=6.966902732849121,disc loss=0.010434590280056, {hms_string(epoch_elapsed)}\n",
            "Epoch 107, gen loss=6.084300994873047,disc loss=0.0097660468891263, {hms_string(epoch_elapsed)}\n",
            "Epoch 108, gen loss=6.725586891174316,disc loss=0.00539805181324482, {hms_string(epoch_elapsed)}\n",
            "Epoch 109, gen loss=5.535580158233643,disc loss=0.013912046328186989, {hms_string(epoch_elapsed)}\n",
            "Epoch 110, gen loss=6.1296515464782715,disc loss=0.010547623969614506, {hms_string(epoch_elapsed)}\n",
            "Epoch 111, gen loss=6.415283203125,disc loss=0.03181180730462074, {hms_string(epoch_elapsed)}\n",
            "Epoch 112, gen loss=5.132744789123535,disc loss=0.019312681630253792, {hms_string(epoch_elapsed)}\n",
            "Epoch 113, gen loss=4.690368175506592,disc loss=0.02976580522954464, {hms_string(epoch_elapsed)}\n",
            "Epoch 114, gen loss=5.858503341674805,disc loss=0.02235480025410652, {hms_string(epoch_elapsed)}\n",
            "Epoch 115, gen loss=6.609301567077637,disc loss=0.01635085605084896, {hms_string(epoch_elapsed)}\n",
            "Epoch 116, gen loss=6.9048285484313965,disc loss=0.005802350118756294, {hms_string(epoch_elapsed)}\n",
            "Epoch 117, gen loss=6.1361541748046875,disc loss=0.007363114971667528, {hms_string(epoch_elapsed)}\n",
            "Epoch 118, gen loss=6.0004119873046875,disc loss=0.00820859707891941, {hms_string(epoch_elapsed)}\n",
            "Epoch 119, gen loss=5.899547100067139,disc loss=0.014690646901726723, {hms_string(epoch_elapsed)}\n",
            "Epoch 120, gen loss=6.075301647186279,disc loss=0.017442170530557632, {hms_string(epoch_elapsed)}\n",
            "Epoch 121, gen loss=6.0962419509887695,disc loss=0.013930248096585274, {hms_string(epoch_elapsed)}\n",
            "Epoch 122, gen loss=6.835719585418701,disc loss=0.021998954936861992, {hms_string(epoch_elapsed)}\n",
            "Epoch 123, gen loss=5.182509422302246,disc loss=0.03696397691965103, {hms_string(epoch_elapsed)}\n",
            "Epoch 124, gen loss=4.998284339904785,disc loss=0.07865150272846222, {hms_string(epoch_elapsed)}\n",
            "Epoch 125, gen loss=2.376528739929199,disc loss=0.29285693168640137, {hms_string(epoch_elapsed)}\n",
            "Epoch 126, gen loss=10.935246467590332,disc loss=0.801177442073822, {hms_string(epoch_elapsed)}\n",
            "Epoch 127, gen loss=3.0344882011413574,disc loss=0.1773107796907425, {hms_string(epoch_elapsed)}\n",
            "Epoch 128, gen loss=3.0190768241882324,disc loss=0.12749922275543213, {hms_string(epoch_elapsed)}\n",
            "Epoch 129, gen loss=8.130293846130371,disc loss=0.000882500025909394, {hms_string(epoch_elapsed)}\n",
            "Epoch 130, gen loss=9.959966659545898,disc loss=0.00019122859521303326, {hms_string(epoch_elapsed)}\n",
            "Epoch 131, gen loss=10.802997589111328,disc loss=0.0022025054786354303, {hms_string(epoch_elapsed)}\n",
            "Epoch 132, gen loss=11.200148582458496,disc loss=0.004256893415004015, {hms_string(epoch_elapsed)}\n",
            "Epoch 133, gen loss=11.84681510925293,disc loss=0.07935429364442825, {hms_string(epoch_elapsed)}\n",
            "Epoch 134, gen loss=8.402787208557129,disc loss=0.0010177893564105034, {hms_string(epoch_elapsed)}\n",
            "Epoch 135, gen loss=6.280391693115234,disc loss=0.007748215924948454, {hms_string(epoch_elapsed)}\n",
            "Epoch 136, gen loss=5.442436218261719,disc loss=0.011247283779084682, {hms_string(epoch_elapsed)}\n",
            "Epoch 137, gen loss=5.060881614685059,disc loss=0.030740275979042053, {hms_string(epoch_elapsed)}\n",
            "Epoch 138, gen loss=6.866534233093262,disc loss=0.007334430236369371, {hms_string(epoch_elapsed)}\n",
            "Epoch 139, gen loss=6.929477691650391,disc loss=0.0035628131590783596, {hms_string(epoch_elapsed)}\n",
            "Epoch 140, gen loss=7.915039539337158,disc loss=0.0010379147715866566, {hms_string(epoch_elapsed)}\n",
            "Epoch 141, gen loss=8.383190155029297,disc loss=0.0015863778535276651, {hms_string(epoch_elapsed)}\n",
            "Epoch 142, gen loss=8.466318130493164,disc loss=0.0008773039444349706, {hms_string(epoch_elapsed)}\n",
            "Epoch 143, gen loss=8.14651870727539,disc loss=0.0008058961248025298, {hms_string(epoch_elapsed)}\n",
            "Epoch 144, gen loss=8.320521354675293,disc loss=0.001051568891853094, {hms_string(epoch_elapsed)}\n",
            "Epoch 145, gen loss=7.0169548988342285,disc loss=0.005460275802761316, {hms_string(epoch_elapsed)}\n",
            "Epoch 146, gen loss=7.080780029296875,disc loss=0.008161364123225212, {hms_string(epoch_elapsed)}\n",
            "Epoch 147, gen loss=7.7286577224731445,disc loss=0.0023265983909368515, {hms_string(epoch_elapsed)}\n",
            "Epoch 148, gen loss=7.003871917724609,disc loss=0.003277725772932172, {hms_string(epoch_elapsed)}\n",
            "Epoch 149, gen loss=6.632770538330078,disc loss=0.009416144341230392, {hms_string(epoch_elapsed)}\n",
            "Epoch 150, gen loss=7.0728864669799805,disc loss=0.0024838007520884275, {hms_string(epoch_elapsed)}\n",
            "Epoch 151, gen loss=7.109919548034668,disc loss=0.01430485025048256, {hms_string(epoch_elapsed)}\n",
            "Epoch 152, gen loss=6.9488630294799805,disc loss=0.00704052671790123, {hms_string(epoch_elapsed)}\n",
            "Epoch 153, gen loss=6.372781753540039,disc loss=0.007615615613758564, {hms_string(epoch_elapsed)}\n",
            "Epoch 154, gen loss=6.037424087524414,disc loss=0.006813990417867899, {hms_string(epoch_elapsed)}\n",
            "Epoch 155, gen loss=6.332042694091797,disc loss=0.008230308070778847, {hms_string(epoch_elapsed)}\n",
            "Epoch 156, gen loss=6.70570182800293,disc loss=0.019803933799266815, {hms_string(epoch_elapsed)}\n",
            "Epoch 157, gen loss=8.21368408203125,disc loss=0.008474698290228844, {hms_string(epoch_elapsed)}\n",
            "Epoch 158, gen loss=7.243940353393555,disc loss=0.033978428691625595, {hms_string(epoch_elapsed)}\n",
            "Epoch 159, gen loss=6.112873077392578,disc loss=0.011647822335362434, {hms_string(epoch_elapsed)}\n",
            "Epoch 160, gen loss=4.972237586975098,disc loss=0.03783280774950981, {hms_string(epoch_elapsed)}\n",
            "Epoch 161, gen loss=5.980889320373535,disc loss=0.011211470700800419, {hms_string(epoch_elapsed)}\n",
            "Epoch 162, gen loss=6.62141227722168,disc loss=0.02903134562075138, {hms_string(epoch_elapsed)}\n",
            "Epoch 163, gen loss=8.110703468322754,disc loss=0.008371591567993164, {hms_string(epoch_elapsed)}\n",
            "Epoch 164, gen loss=8.712617874145508,disc loss=0.006174796260893345, {hms_string(epoch_elapsed)}\n",
            "Epoch 165, gen loss=8.32436752319336,disc loss=0.006405738182365894, {hms_string(epoch_elapsed)}\n",
            "Epoch 166, gen loss=8.314889907836914,disc loss=0.034375254064798355, {hms_string(epoch_elapsed)}\n",
            "Epoch 167, gen loss=6.37914514541626,disc loss=0.011185791343450546, {hms_string(epoch_elapsed)}\n",
            "Epoch 168, gen loss=4.972049713134766,disc loss=0.02504568174481392, {hms_string(epoch_elapsed)}\n",
            "Epoch 169, gen loss=6.242386341094971,disc loss=0.009343468584120274, {hms_string(epoch_elapsed)}\n",
            "Epoch 170, gen loss=6.665205955505371,disc loss=0.04389205947518349, {hms_string(epoch_elapsed)}\n",
            "Epoch 171, gen loss=5.268654823303223,disc loss=0.01312075462192297, {hms_string(epoch_elapsed)}\n",
            "Epoch 172, gen loss=4.537919998168945,disc loss=0.042792078107595444, {hms_string(epoch_elapsed)}\n",
            "Epoch 173, gen loss=6.728124618530273,disc loss=0.014568177983164787, {hms_string(epoch_elapsed)}\n",
            "Epoch 174, gen loss=7.366935729980469,disc loss=0.02012968249619007, {hms_string(epoch_elapsed)}\n",
            "Epoch 175, gen loss=6.939792633056641,disc loss=0.014963245019316673, {hms_string(epoch_elapsed)}\n",
            "Epoch 176, gen loss=6.181635856628418,disc loss=0.01648314669728279, {hms_string(epoch_elapsed)}\n",
            "Epoch 177, gen loss=6.004035949707031,disc loss=0.01042152103036642, {hms_string(epoch_elapsed)}\n",
            "Epoch 178, gen loss=7.910373210906982,disc loss=0.008258270099759102, {hms_string(epoch_elapsed)}\n",
            "Epoch 179, gen loss=6.815086364746094,disc loss=0.00646170973777771, {hms_string(epoch_elapsed)}\n",
            "Epoch 180, gen loss=7.725893974304199,disc loss=0.017552874982357025, {hms_string(epoch_elapsed)}\n",
            "Epoch 181, gen loss=5.043001174926758,disc loss=0.022733038291335106, {hms_string(epoch_elapsed)}\n",
            "Epoch 182, gen loss=6.334409236907959,disc loss=0.007204417139291763, {hms_string(epoch_elapsed)}\n",
            "Epoch 183, gen loss=6.012441635131836,disc loss=0.022243065759539604, {hms_string(epoch_elapsed)}\n",
            "Epoch 184, gen loss=5.111137866973877,disc loss=0.017858561128377914, {hms_string(epoch_elapsed)}\n",
            "Epoch 185, gen loss=5.759515762329102,disc loss=0.01828458532691002, {hms_string(epoch_elapsed)}\n",
            "Epoch 186, gen loss=6.17363166809082,disc loss=0.008424647152423859, {hms_string(epoch_elapsed)}\n",
            "Epoch 187, gen loss=5.970391273498535,disc loss=0.028433792293071747, {hms_string(epoch_elapsed)}\n",
            "Epoch 188, gen loss=5.595340728759766,disc loss=0.013694632798433304, {hms_string(epoch_elapsed)}\n",
            "Epoch 189, gen loss=5.497529983520508,disc loss=0.011700407601892948, {hms_string(epoch_elapsed)}\n",
            "Epoch 190, gen loss=5.931168556213379,disc loss=0.009538371115922928, {hms_string(epoch_elapsed)}\n",
            "Epoch 191, gen loss=6.157370567321777,disc loss=0.21765606105327606, {hms_string(epoch_elapsed)}\n",
            "Epoch 192, gen loss=0.1496175080537796,disc loss=3.0647666454315186, {hms_string(epoch_elapsed)}\n",
            "Epoch 193, gen loss=31.056692123413086,disc loss=15.141395568847656, {hms_string(epoch_elapsed)}\n",
            "Epoch 194, gen loss=25.53141975402832,disc loss=6.545961856842041, {hms_string(epoch_elapsed)}\n",
            "Epoch 195, gen loss=7.309867858886719,disc loss=0.007879025302827358, {hms_string(epoch_elapsed)}\n",
            "Epoch 196, gen loss=0.5783942341804504,disc loss=2.165691614151001, {hms_string(epoch_elapsed)}\n",
            "Epoch 197, gen loss=12.98037338256836,disc loss=4.773878026753664e-05, {hms_string(epoch_elapsed)}\n",
            "Epoch 198, gen loss=20.219465255737305,disc loss=0.524334728717804, {hms_string(epoch_elapsed)}\n",
            "Epoch 199, gen loss=13.04267692565918,disc loss=8.457479998469353e-05, {hms_string(epoch_elapsed)}\n",
            "Epoch 200, gen loss=9.446557998657227,disc loss=0.0007910210988484323, {hms_string(epoch_elapsed)}\n",
            "Epoch 201, gen loss=6.96229362487793,disc loss=0.0035307337529957294, {hms_string(epoch_elapsed)}\n",
            "Epoch 202, gen loss=5.8457489013671875,disc loss=0.023228665813803673, {hms_string(epoch_elapsed)}\n",
            "Epoch 203, gen loss=5.179957389831543,disc loss=0.09472449123859406, {hms_string(epoch_elapsed)}\n",
            "Epoch 204, gen loss=5.971521377563477,disc loss=0.026745587587356567, {hms_string(epoch_elapsed)}\n",
            "Epoch 205, gen loss=7.716646194458008,disc loss=0.008746509440243244, {hms_string(epoch_elapsed)}\n",
            "Epoch 206, gen loss=7.656028747558594,disc loss=0.0029577414970844984, {hms_string(epoch_elapsed)}\n",
            "Epoch 207, gen loss=7.932812213897705,disc loss=0.003564954735338688, {hms_string(epoch_elapsed)}\n",
            "Epoch 208, gen loss=6.881088733673096,disc loss=0.006486873142421246, {hms_string(epoch_elapsed)}\n",
            "Epoch 209, gen loss=6.365023612976074,disc loss=0.041886575520038605, {hms_string(epoch_elapsed)}\n",
            "Epoch 210, gen loss=7.774455547332764,disc loss=0.005597240757197142, {hms_string(epoch_elapsed)}\n",
            "Epoch 211, gen loss=7.632464408874512,disc loss=0.00817476399242878, {hms_string(epoch_elapsed)}\n",
            "Epoch 212, gen loss=7.681931495666504,disc loss=0.0057372129522264, {hms_string(epoch_elapsed)}\n",
            "Epoch 213, gen loss=7.921421051025391,disc loss=0.02147029899060726, {hms_string(epoch_elapsed)}\n",
            "Epoch 214, gen loss=9.352302551269531,disc loss=0.0005817969795316458, {hms_string(epoch_elapsed)}\n",
            "Epoch 215, gen loss=6.931666374206543,disc loss=0.024374736472964287, {hms_string(epoch_elapsed)}\n",
            "Epoch 216, gen loss=5.948180675506592,disc loss=0.13086439669132233, {hms_string(epoch_elapsed)}\n",
            "Epoch 217, gen loss=6.769959449768066,disc loss=0.018186483532190323, {hms_string(epoch_elapsed)}\n",
            "Epoch 218, gen loss=6.79124641418457,disc loss=0.05827509984374046, {hms_string(epoch_elapsed)}\n",
            "Epoch 219, gen loss=6.484127998352051,disc loss=0.03737198933959007, {hms_string(epoch_elapsed)}\n",
            "Epoch 220, gen loss=7.175033092498779,disc loss=0.005997762084007263, {hms_string(epoch_elapsed)}\n",
            "Epoch 221, gen loss=6.576262474060059,disc loss=0.027361508458852768, {hms_string(epoch_elapsed)}\n",
            "Epoch 222, gen loss=5.430665969848633,disc loss=0.03055522032082081, {hms_string(epoch_elapsed)}\n",
            "Epoch 223, gen loss=6.483482837677002,disc loss=0.04726235568523407, {hms_string(epoch_elapsed)}\n",
            "Epoch 224, gen loss=6.609787940979004,disc loss=0.013522658497095108, {hms_string(epoch_elapsed)}\n",
            "Epoch 225, gen loss=5.819948196411133,disc loss=0.06504563987255096, {hms_string(epoch_elapsed)}\n",
            "Epoch 226, gen loss=6.255156993865967,disc loss=0.03725957125425339, {hms_string(epoch_elapsed)}\n",
            "Epoch 227, gen loss=5.535105228424072,disc loss=0.06058274954557419, {hms_string(epoch_elapsed)}\n",
            "Epoch 228, gen loss=6.010237693786621,disc loss=0.02183556742966175, {hms_string(epoch_elapsed)}\n",
            "Epoch 229, gen loss=5.554815292358398,disc loss=0.025450007990002632, {hms_string(epoch_elapsed)}\n",
            "Epoch 230, gen loss=6.495037078857422,disc loss=1.7206964492797852, {hms_string(epoch_elapsed)}\n",
            "Epoch 231, gen loss=0.01080807950347662,disc loss=7.908750534057617, {hms_string(epoch_elapsed)}\n",
            "Epoch 232, gen loss=14.553647994995117,disc loss=0.0025618490763008595, {hms_string(epoch_elapsed)}\n",
            "Epoch 233, gen loss=22.63849639892578,disc loss=5.0977888107299805, {hms_string(epoch_elapsed)}\n",
            "Epoch 234, gen loss=11.18004035949707,disc loss=0.00012689361756201833, {hms_string(epoch_elapsed)}\n",
            "Epoch 235, gen loss=2.264803409576416,disc loss=0.6665728092193604, {hms_string(epoch_elapsed)}\n",
            "Epoch 236, gen loss=6.472451210021973,disc loss=0.04753095284104347, {hms_string(epoch_elapsed)}\n",
            "Epoch 237, gen loss=8.452033996582031,disc loss=0.0017062462866306305, {hms_string(epoch_elapsed)}\n",
            "Epoch 238, gen loss=8.553256034851074,disc loss=0.0027036520186811686, {hms_string(epoch_elapsed)}\n",
            "Epoch 239, gen loss=9.928497314453125,disc loss=0.0008134213858284056, {hms_string(epoch_elapsed)}\n",
            "Epoch 240, gen loss=9.457242012023926,disc loss=0.004655669443309307, {hms_string(epoch_elapsed)}\n",
            "Epoch 241, gen loss=8.476007461547852,disc loss=0.04623222351074219, {hms_string(epoch_elapsed)}\n",
            "Epoch 242, gen loss=9.083686828613281,disc loss=0.0030563203617930412, {hms_string(epoch_elapsed)}\n",
            "Epoch 243, gen loss=8.246885299682617,disc loss=0.004902448505163193, {hms_string(epoch_elapsed)}\n",
            "Epoch 244, gen loss=7.499750137329102,disc loss=0.05736851692199707, {hms_string(epoch_elapsed)}\n",
            "Epoch 245, gen loss=5.467629432678223,disc loss=0.053132060915231705, {hms_string(epoch_elapsed)}\n",
            "Epoch 246, gen loss=7.415557861328125,disc loss=0.0037785768508911133, {hms_string(epoch_elapsed)}\n",
            "Epoch 247, gen loss=6.339835166931152,disc loss=0.023504694923758507, {hms_string(epoch_elapsed)}\n",
            "Epoch 248, gen loss=7.72953462600708,disc loss=0.006973578594624996, {hms_string(epoch_elapsed)}\n",
            "Epoch 249, gen loss=8.615541458129883,disc loss=0.0295126773416996, {hms_string(epoch_elapsed)}\n",
            "Epoch 250, gen loss=6.229409217834473,disc loss=0.05219964310526848, {hms_string(epoch_elapsed)}\n",
            "Epoch 251, gen loss=5.1533308029174805,disc loss=0.05810818821191788, {hms_string(epoch_elapsed)}\n",
            "Epoch 252, gen loss=3.3767051696777344,disc loss=0.3586360514163971, {hms_string(epoch_elapsed)}\n",
            "Epoch 253, gen loss=7.518937587738037,disc loss=0.464457243680954, {hms_string(epoch_elapsed)}\n",
            "Epoch 254, gen loss=1.394852876663208,disc loss=1.22320556640625, {hms_string(epoch_elapsed)}\n",
            "Epoch 255, gen loss=9.517196655273438,disc loss=0.4631537199020386, {hms_string(epoch_elapsed)}\n",
            "Epoch 256, gen loss=5.935405254364014,disc loss=0.045794833451509476, {hms_string(epoch_elapsed)}\n",
            "Epoch 257, gen loss=3.6626691818237305,disc loss=0.262673020362854, {hms_string(epoch_elapsed)}\n",
            "Epoch 258, gen loss=5.858232021331787,disc loss=0.04705318808555603, {hms_string(epoch_elapsed)}\n",
            "Epoch 259, gen loss=7.052709579467773,disc loss=0.05754779651761055, {hms_string(epoch_elapsed)}\n",
            "Epoch 260, gen loss=9.000950813293457,disc loss=0.028870953246951103, {hms_string(epoch_elapsed)}\n",
            "Epoch 261, gen loss=7.737890243530273,disc loss=0.01366235502064228, {hms_string(epoch_elapsed)}\n",
            "Epoch 262, gen loss=7.673999309539795,disc loss=0.01409287191927433, {hms_string(epoch_elapsed)}\n",
            "Epoch 263, gen loss=6.94708776473999,disc loss=0.11208096891641617, {hms_string(epoch_elapsed)}\n",
            "Epoch 264, gen loss=5.522052764892578,disc loss=0.044238217175006866, {hms_string(epoch_elapsed)}\n",
            "Epoch 265, gen loss=6.434634208679199,disc loss=0.08102516084909439, {hms_string(epoch_elapsed)}\n",
            "Epoch 266, gen loss=7.412760257720947,disc loss=0.9346693158149719, {hms_string(epoch_elapsed)}\n",
            "Epoch 267, gen loss=0.08282570540904999,disc loss=4.644397735595703, {hms_string(epoch_elapsed)}\n",
            "Epoch 268, gen loss=20.68620491027832,disc loss=0.21980024874210358, {hms_string(epoch_elapsed)}\n",
            "Epoch 269, gen loss=19.120241165161133,disc loss=0.33639729022979736, {hms_string(epoch_elapsed)}\n",
            "Epoch 270, gen loss=10.381103515625,disc loss=0.03448761999607086, {hms_string(epoch_elapsed)}\n",
            "Epoch 271, gen loss=6.580975532531738,disc loss=0.016016123816370964, {hms_string(epoch_elapsed)}\n",
            "Epoch 272, gen loss=3.301553726196289,disc loss=0.30986618995666504, {hms_string(epoch_elapsed)}\n",
            "Epoch 273, gen loss=5.171695232391357,disc loss=0.13458412885665894, {hms_string(epoch_elapsed)}\n",
            "Epoch 274, gen loss=9.146685600280762,disc loss=0.022702926769852638, {hms_string(epoch_elapsed)}\n",
            "Epoch 275, gen loss=8.358539581298828,disc loss=1.000117540359497, {hms_string(epoch_elapsed)}\n",
            "Epoch 276, gen loss=0.3323810398578644,disc loss=3.6277177333831787, {hms_string(epoch_elapsed)}\n",
            "Epoch 277, gen loss=10.169794082641602,disc loss=0.00125317822676152, {hms_string(epoch_elapsed)}\n",
            "Epoch 278, gen loss=19.628650665283203,disc loss=3.2530713081359863, {hms_string(epoch_elapsed)}\n",
            "Epoch 279, gen loss=3.3356804847717285,disc loss=0.1706671565771103, {hms_string(epoch_elapsed)}\n",
            "Epoch 280, gen loss=0.27320533990859985,disc loss=3.3061649799346924, {hms_string(epoch_elapsed)}\n",
            "Epoch 281, gen loss=16.305526733398438,disc loss=0.4629322588443756, {hms_string(epoch_elapsed)}\n",
            "Epoch 282, gen loss=17.3970947265625,disc loss=0.013026425614953041, {hms_string(epoch_elapsed)}\n",
            "Epoch 283, gen loss=12.9052734375,disc loss=0.01107039861381054, {hms_string(epoch_elapsed)}\n",
            "Epoch 284, gen loss=12.503276824951172,disc loss=0.004811831284314394, {hms_string(epoch_elapsed)}\n",
            "Epoch 285, gen loss=9.571765899658203,disc loss=0.06405612826347351, {hms_string(epoch_elapsed)}\n",
            "Epoch 286, gen loss=6.812915325164795,disc loss=0.00868676882237196, {hms_string(epoch_elapsed)}\n",
            "Epoch 287, gen loss=3.8920531272888184,disc loss=0.1969120353460312, {hms_string(epoch_elapsed)}\n",
            "Epoch 288, gen loss=4.987812519073486,disc loss=0.06630069017410278, {hms_string(epoch_elapsed)}\n",
            "Epoch 289, gen loss=6.183459281921387,disc loss=0.040611956268548965, {hms_string(epoch_elapsed)}\n",
            "Epoch 290, gen loss=6.751450538635254,disc loss=0.40163031220436096, {hms_string(epoch_elapsed)}\n",
            "Epoch 291, gen loss=3.0872323513031006,disc loss=0.40577343106269836, {hms_string(epoch_elapsed)}\n",
            "Epoch 292, gen loss=3.309971570968628,disc loss=0.5247035026550293, {hms_string(epoch_elapsed)}\n",
            "Epoch 293, gen loss=7.376733779907227,disc loss=0.7544724941253662, {hms_string(epoch_elapsed)}\n",
            "Epoch 294, gen loss=1.1931257247924805,disc loss=1.3604998588562012, {hms_string(epoch_elapsed)}\n",
            "Epoch 295, gen loss=7.875381946563721,disc loss=0.6959397196769714, {hms_string(epoch_elapsed)}\n",
            "Epoch 296, gen loss=2.414628505706787,disc loss=0.8878973126411438, {hms_string(epoch_elapsed)}\n",
            "Epoch 297, gen loss=6.162302017211914,disc loss=0.0465632900595665, {hms_string(epoch_elapsed)}\n",
            "Epoch 298, gen loss=12.61424446105957,disc loss=0.07128060609102249, {hms_string(epoch_elapsed)}\n",
            "Epoch 299, gen loss=10.611448287963867,disc loss=0.010915732011198997, {hms_string(epoch_elapsed)}\n",
            "Epoch 300, gen loss=8.131303787231445,disc loss=0.021627865731716156, {hms_string(epoch_elapsed)}\n",
            "Epoch 301, gen loss=6.328487396240234,disc loss=0.04143970459699631, {hms_string(epoch_elapsed)}\n",
            "Epoch 302, gen loss=5.3081865310668945,disc loss=0.1983272284269333, {hms_string(epoch_elapsed)}\n",
            "Epoch 303, gen loss=6.147424697875977,disc loss=5.118991374969482, {hms_string(epoch_elapsed)}\n",
            "Epoch 304, gen loss=0.0005790980067104101,disc loss=10.588058471679688, {hms_string(epoch_elapsed)}\n",
            "Epoch 305, gen loss=8.772378921508789,disc loss=0.046137385070323944, {hms_string(epoch_elapsed)}\n",
            "Epoch 306, gen loss=15.127753257751465,disc loss=3.444375514984131, {hms_string(epoch_elapsed)}\n",
            "Epoch 307, gen loss=0.8071543574333191,disc loss=2.2136929035186768, {hms_string(epoch_elapsed)}\n",
            "Epoch 308, gen loss=5.176950454711914,disc loss=0.08635296672582626, {hms_string(epoch_elapsed)}\n",
            "Epoch 309, gen loss=8.85654354095459,disc loss=0.10056962817907333, {hms_string(epoch_elapsed)}\n",
            "Epoch 310, gen loss=6.100808143615723,disc loss=0.05332333967089653, {hms_string(epoch_elapsed)}\n",
            "Epoch 311, gen loss=5.676544666290283,disc loss=2.485750675201416, {hms_string(epoch_elapsed)}\n",
            "Epoch 312, gen loss=0.013112854212522507,disc loss=9.372740745544434, {hms_string(epoch_elapsed)}\n",
            "Epoch 313, gen loss=9.677534103393555,disc loss=0.02604440413415432, {hms_string(epoch_elapsed)}\n",
            "Epoch 314, gen loss=12.955327033996582,disc loss=4.821441650390625, {hms_string(epoch_elapsed)}\n",
            "Epoch 315, gen loss=0.2939688563346863,disc loss=3.9727280139923096, {hms_string(epoch_elapsed)}\n",
            "Epoch 316, gen loss=10.318713188171387,disc loss=0.01068079099059105, {hms_string(epoch_elapsed)}\n",
            "Epoch 317, gen loss=13.696691513061523,disc loss=0.0327567420899868, {hms_string(epoch_elapsed)}\n",
            "Epoch 318, gen loss=10.29134464263916,disc loss=0.004399218130856752, {hms_string(epoch_elapsed)}\n",
            "Epoch 319, gen loss=9.616447448730469,disc loss=0.17798666656017303, {hms_string(epoch_elapsed)}\n",
            "Epoch 320, gen loss=4.633999824523926,disc loss=0.2552332878112793, {hms_string(epoch_elapsed)}\n",
            "Epoch 321, gen loss=4.104493141174316,disc loss=0.19498901069164276, {hms_string(epoch_elapsed)}\n",
            "Epoch 322, gen loss=5.8758721351623535,disc loss=0.7081445455551147, {hms_string(epoch_elapsed)}\n",
            "Epoch 323, gen loss=1.2821805477142334,disc loss=1.7490031719207764, {hms_string(epoch_elapsed)}\n",
            "Epoch 324, gen loss=5.730177879333496,disc loss=0.10132323950529099, {hms_string(epoch_elapsed)}\n",
            "Epoch 325, gen loss=8.39071273803711,disc loss=2.2604851722717285, {hms_string(epoch_elapsed)}\n",
            "Epoch 326, gen loss=0.08299462497234344,disc loss=4.874196529388428, {hms_string(epoch_elapsed)}\n",
            "Epoch 327, gen loss=12.788816452026367,disc loss=0.2087235152721405, {hms_string(epoch_elapsed)}\n",
            "Epoch 328, gen loss=14.86313247680664,disc loss=0.001361651113256812, {hms_string(epoch_elapsed)}\n",
            "Epoch 329, gen loss=9.782758712768555,disc loss=0.11543035507202148, {hms_string(epoch_elapsed)}\n",
            "Epoch 330, gen loss=5.178374290466309,disc loss=0.29455840587615967, {hms_string(epoch_elapsed)}\n",
            "Epoch 331, gen loss=1.3330066204071045,disc loss=1.1696157455444336, {hms_string(epoch_elapsed)}\n",
            "Epoch 332, gen loss=5.583019256591797,disc loss=0.7959290146827698, {hms_string(epoch_elapsed)}\n",
            "Epoch 333, gen loss=2.7237093448638916,disc loss=0.7124145030975342, {hms_string(epoch_elapsed)}\n",
            "Epoch 334, gen loss=3.626328945159912,disc loss=3.4314074516296387, {hms_string(epoch_elapsed)}\n",
            "Epoch 335, gen loss=0.00543674873188138,disc loss=8.846508026123047, {hms_string(epoch_elapsed)}\n",
            "Epoch 336, gen loss=6.984116554260254,disc loss=0.06736727803945541, {hms_string(epoch_elapsed)}\n",
            "Epoch 337, gen loss=13.155869483947754,disc loss=0.9752998352050781, {hms_string(epoch_elapsed)}\n",
            "Epoch 338, gen loss=4.655368328094482,disc loss=0.5239822864532471, {hms_string(epoch_elapsed)}\n",
            "Epoch 339, gen loss=1.9286556243896484,disc loss=0.818580150604248, {hms_string(epoch_elapsed)}\n",
            "Epoch 340, gen loss=7.996644020080566,disc loss=0.21279561519622803, {hms_string(epoch_elapsed)}\n",
            "Epoch 341, gen loss=7.562450408935547,disc loss=0.41017216444015503, {hms_string(epoch_elapsed)}\n",
            "Epoch 342, gen loss=1.3134889602661133,disc loss=1.8478747606277466, {hms_string(epoch_elapsed)}\n",
            "Epoch 343, gen loss=6.514494895935059,disc loss=1.4748387336730957, {hms_string(epoch_elapsed)}\n",
            "Epoch 344, gen loss=0.20060250163078308,disc loss=3.485398530960083, {hms_string(epoch_elapsed)}\n",
            "Epoch 345, gen loss=9.613981246948242,disc loss=1.8171521425247192, {hms_string(epoch_elapsed)}\n",
            "Epoch 346, gen loss=1.6512982845306396,disc loss=1.3733116388320923, {hms_string(epoch_elapsed)}\n",
            "Epoch 347, gen loss=6.369700908660889,disc loss=0.11154074966907501, {hms_string(epoch_elapsed)}\n",
            "Epoch 348, gen loss=8.688429832458496,disc loss=0.45240136981010437, {hms_string(epoch_elapsed)}\n",
            "Epoch 349, gen loss=2.4300615787506104,disc loss=0.753182053565979, {hms_string(epoch_elapsed)}\n"
          ]
        }
      ],
      "source": [
        "import tensorflow as tf\n",
        "from tensorflow.keras.layers import Input, Reshape, Dropout, Dense \n",
        "from tensorflow.keras.layers import Flatten, BatchNormalization\n",
        "from tensorflow.keras.layers import Activation, ZeroPadding2D\n",
        "from tensorflow.keras.layers import LeakyReLU\n",
        "from tensorflow.keras.layers import UpSampling2D, Conv2D\n",
        "from tensorflow.keras.models import Sequential, Model, load_model\n",
        "from tensorflow.keras.optimizers import Adam\n",
        "import numpy as np\n",
        "from PIL import Image\n",
        "from tqdm import tqdm\n",
        "import os \n",
        "import time\n",
        "import matplotlib.pyplot as plt\n",
        "from tensorflow.keras.utils import plot_model\n",
        "\n",
        "\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n",
        "\n",
        "GENERATE_RES = 4 # Generation resolution factor \n",
        "# (1=32, 2=64, 3=96, 4=128, etc.)\n",
        "GENERATE_SQUARE = 32 * GENERATE_RES # rows/cols (should be square)\n",
        "IMAGE_CHANNELS = 3\n",
        "\n",
        "# Preview image \n",
        "PREVIEW_ROWS = 4\n",
        "PREVIEW_COLS = 7\n",
        "PREVIEW_MARGIN = 16\n",
        "\n",
        "# Size vector to generate images from\n",
        "SEED_SIZE = 100\n",
        "\n",
        "# Configuration\n",
        "DATA_PATH = '/content/drive/MyDrive/Drive/Journals/IGPL/Lennert/face1'\n",
        "EPOCHS = 5000\n",
        "BATCH_SIZE = 32\n",
        "BUFFER_SIZE = 60000\n",
        "\n",
        "print(f\"Will generate {GENERATE_SQUARE}px square images.\")\n",
        "\n",
        "def hms_string(sec_elapsed):\n",
        "    h = int(sec_elapsed / (60 * 60))\n",
        "    m = int((sec_elapsed % (60 * 60)) / 60)\n",
        "    s = sec_elapsed % 60\n",
        "    return \"{}:{:>02}:{:>05.2f}\".format(h, m, s)\n",
        "\n",
        "training_binary_path = os.path.join(DATA_PATH,\n",
        "        f'training_data_{GENERATE_SQUARE}_{GENERATE_SQUARE}.npy')\n",
        "\n",
        "print(f\"Looking for file: {training_binary_path}\")\n",
        "\n",
        "if not os.path.isfile(training_binary_path):\n",
        "  start = time.time()\n",
        "  print(\"Loading training images...\")\n",
        "\n",
        "  training_data = []\n",
        "  faces_path = os.path.join(DATA_PATH)\n",
        "  for filename in tqdm(os.listdir(faces_path)):\n",
        "      path = os.path.join(faces_path,filename)\n",
        "      image = Image.open(path).resize((GENERATE_SQUARE,\n",
        "            GENERATE_SQUARE),Image.ANTIALIAS)\n",
        "      training_data.append(np.asarray(image))\n",
        "  training_data = np.reshape(training_data,(-1,GENERATE_SQUARE,\n",
        "            GENERATE_SQUARE,IMAGE_CHANNELS))\n",
        "  training_data = training_data.astype(np.float32)\n",
        "  training_data = training_data / 127.5 - 1.\n",
        "\n",
        "\n",
        "  print(\"Saving training image binary...\")\n",
        "  np.save(training_binary_path,training_data)\n",
        "  elapsed = time.time()-start\n",
        "  print (f'Image preprocess time: {hms_string(elapsed)}')\n",
        "else:\n",
        "  print(\"Loading previous training pickle...\")\n",
        "  training_data = np.load(training_binary_path)\n",
        "\n",
        "#shuffle the data\n",
        "train_dataset = tf.data.Dataset.from_tensor_slices(training_data) \\\n",
        "    .shuffle(BUFFER_SIZE).batch(BATCH_SIZE)\n",
        "\n",
        "def build_generator(seed_size, channels):\n",
        "    model = Sequential()\n",
        "\n",
        "    model.add(Dense(4*4*256,activation=\"relu\",input_dim=seed_size))\n",
        "    model.add(Reshape((4,4,256)))\n",
        "\n",
        "    model.add(UpSampling2D())\n",
        "    model.add(Conv2D(256,kernel_size=3,padding=\"same\"))\n",
        "    model.add(BatchNormalization(momentum=0.8))\n",
        "    model.add(Activation(\"relu\"))\n",
        "\n",
        "    model.add(UpSampling2D())\n",
        "    model.add(Conv2D(256,kernel_size=3,padding=\"same\"))\n",
        "    model.add(BatchNormalization(momentum=0.8))\n",
        "    model.add(Activation(\"relu\"))\n",
        "   \n",
        "    # Output resolution, additional upsampling\n",
        "    model.add(UpSampling2D())\n",
        "    model.add(Conv2D(128,kernel_size=3,padding=\"same\"))\n",
        "    model.add(BatchNormalization(momentum=0.8))\n",
        "    model.add(Activation(\"relu\"))\n",
        "\n",
        "    if GENERATE_RES>1:\n",
        "      model.add(UpSampling2D(size=(GENERATE_RES,GENERATE_RES)))\n",
        "      model.add(Conv2D(128,kernel_size=3,padding=\"same\"))\n",
        "      model.add(BatchNormalization(momentum=0.8))\n",
        "      model.add(Activation(\"relu\"))\n",
        "\n",
        "    # Final CNN layer\n",
        "    model.add(Conv2D(channels,kernel_size=3,padding=\"same\"))\n",
        "    model.add(Activation(\"tanh\"))\n",
        "    print('Generator')\n",
        "    print(model.summary())\n",
        "    plot_model(model, to_file='/content/drive/MyDrive/Drive/Journals/IGPL/Lennert/generator2.png')\n",
        "    return model\n",
        "\n",
        "\n",
        "def build_discriminator(image_shape):\n",
        "    model = Sequential()\n",
        "\n",
        "    model.add(Conv2D(32, kernel_size=3, strides=2, input_shape=image_shape, \n",
        "                     padding=\"same\"))\n",
        "    model.add(LeakyReLU(alpha=0.2))\n",
        "\n",
        "    model.add(Dropout(0.25))\n",
        "    model.add(Conv2D(64, kernel_size=3, strides=2, padding=\"same\"))\n",
        "    model.add(ZeroPadding2D(padding=((0,1),(0,1))))\n",
        "    model.add(BatchNormalization(momentum=0.8))\n",
        "    model.add(LeakyReLU(alpha=0.2))\n",
        "\n",
        "    model.add(Dropout(0.25))\n",
        "    model.add(Conv2D(128, kernel_size=3, strides=2, padding=\"same\"))\n",
        "    model.add(BatchNormalization(momentum=0.8))\n",
        "    model.add(LeakyReLU(alpha=0.2))\n",
        "\n",
        "    model.add(Dropout(0.25))\n",
        "    model.add(Conv2D(256, kernel_size=3, strides=1, padding=\"same\"))\n",
        "    model.add(BatchNormalization(momentum=0.8))\n",
        "    model.add(LeakyReLU(alpha=0.2))\n",
        "\n",
        "    model.add(Dropout(0.25))\n",
        "    model.add(Conv2D(512, kernel_size=3, strides=1, padding=\"same\"))\n",
        "    model.add(BatchNormalization(momentum=0.8))\n",
        "    model.add(LeakyReLU(alpha=0.2))\n",
        "\n",
        "    model.add(Dropout(0.25))\n",
        "    model.add(Flatten())\n",
        "    model.add(Dense(1, activation='sigmoid'))\n",
        "    print('Discriminator')\n",
        "    print(model.summary())\n",
        "    plot_model(model, to_file='/content/drive/MyDrive/Drive/Journals/IGPL/Lennert/discriminator2.png')\n",
        "    return model\n",
        "    \n",
        "\n",
        "def save_images(cnt,noise):\n",
        "  image_array = np.full(( \n",
        "      PREVIEW_MARGIN + (PREVIEW_ROWS * (GENERATE_SQUARE+PREVIEW_MARGIN)), \n",
        "      PREVIEW_MARGIN + (PREVIEW_COLS * (GENERATE_SQUARE+PREVIEW_MARGIN)), 3), \n",
        "      255, dtype=np.uint8)\n",
        "  \n",
        "  generated_images = generator.predict(noise)\n",
        "\n",
        "  generated_images = 0.5 * generated_images + 0.5\n",
        "\n",
        "  image_count = 0\n",
        "  for row in range(PREVIEW_ROWS):\n",
        "      for col in range(PREVIEW_COLS):\n",
        "        r = row * (GENERATE_SQUARE+16) + PREVIEW_MARGIN\n",
        "        c = col * (GENERATE_SQUARE+16) + PREVIEW_MARGIN\n",
        "        image_array[r:r+GENERATE_SQUARE,c:c+GENERATE_SQUARE] \\\n",
        "            = generated_images[image_count] * 255\n",
        "        image_count += 1\n",
        "\n",
        "          \n",
        "  output_path = os.path.join(DATA_PATH,'output3')\n",
        "  if not os.path.exists(output_path):\n",
        "    os.makedirs(output_path)\n",
        "  \n",
        "  filename = os.path.join(output_path,f\"train-{cnt}.png\")\n",
        "  im = Image.fromarray(image_array)\n",
        "  im.save(filename)\n",
        "\n",
        "generator = build_generator(SEED_SIZE, IMAGE_CHANNELS)\n",
        "\n",
        "noise = tf.random.normal([1, SEED_SIZE])\n",
        "generated_image = generator(noise, training=False)\n",
        "\n",
        "plt.imshow(generated_image[0, :, :, 0])\n",
        "\n",
        "image_shape = (GENERATE_SQUARE,GENERATE_SQUARE,IMAGE_CHANNELS)\n",
        "\n",
        "discriminator = build_discriminator(image_shape)\n",
        "decision = discriminator(generated_image)\n",
        "print (decision)\n",
        "\n",
        "cross_entropy = tf.keras.losses.BinaryCrossentropy()\n",
        "\n",
        "def discriminator_loss(real_output, fake_output):\n",
        "    real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n",
        "    fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)\n",
        "    total_loss = real_loss + fake_loss\n",
        "    return total_loss\n",
        "\n",
        "def generator_loss(fake_output):\n",
        "    return cross_entropy(tf.ones_like(fake_output), fake_output)\n",
        "\n",
        "generator_optimizer = tf.keras.optimizers.Adam(1.5e-4,0.002)\n",
        "discriminator_optimizer = tf.keras.optimizers.Adam(1.5e-4,0.002)\n",
        "\n",
        "@tf.function\n",
        "def train_step(images):\n",
        "  seed = tf.random.normal([BATCH_SIZE, SEED_SIZE])\n",
        "\n",
        "  with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n",
        "    generated_images = generator(seed, training=True)\n",
        "\n",
        "    real_output = discriminator(images, training=True)\n",
        "    fake_output = discriminator(generated_images, training=True)\n",
        "\n",
        "    gen_loss = generator_loss(fake_output)\n",
        "    disc_loss = discriminator_loss(real_output, fake_output)\n",
        "    \n",
        "\n",
        "    gradients_of_generator = gen_tape.gradient(\\\n",
        "        gen_loss, generator.trainable_variables)\n",
        "    gradients_of_discriminator = disc_tape.gradient(\\\n",
        "        disc_loss, discriminator.trainable_variables)\n",
        "\n",
        "    generator_optimizer.apply_gradients(zip(\n",
        "        gradients_of_generator, generator.trainable_variables))\n",
        "    discriminator_optimizer.apply_gradients(zip(\n",
        "        gradients_of_discriminator, \n",
        "        discriminator.trainable_variables))\n",
        "  return gen_loss,disc_loss\n",
        "\n",
        "def train(dataset, epochs):\n",
        "  fixed_seed = np.random.normal(0, 1, (PREVIEW_ROWS * PREVIEW_COLS, \n",
        "                                       SEED_SIZE))\n",
        "  start = time.time()\n",
        "\n",
        "  for epoch in range(epochs):\n",
        "    epoch_start = time.time()\n",
        "\n",
        "    gen_loss_list = []\n",
        "    disc_loss_list = []\n",
        "\n",
        "    for image_batch in dataset:\n",
        "      t = train_step(image_batch)\n",
        "      gen_loss_list.append(t[0])\n",
        "      disc_loss_list.append(t[1])\n",
        "\n",
        "    g_loss = sum(gen_loss_list) / len(gen_loss_list)\n",
        "    d_loss = sum(disc_loss_list) / len(disc_loss_list)\n",
        "\n",
        "    epoch_elapsed = time.time()-epoch_start\n",
        "    print (f'Epoch {epoch+1}, gen loss={g_loss},disc loss={d_loss},'\\\n",
        "           ' {hms_string(epoch_elapsed)}')\n",
        "    save_images(epoch,fixed_seed)\n",
        "\n",
        "  elapsed = time.time()-start\n",
        "  print (f'Training time: {hms_string(elapsed)}')\n",
        "\n",
        "train(train_dataset, EPOCHS)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "TNz7xsq6s6UK"
      },
      "outputs": [],
      "source": []
    }
  ],
  "metadata": {
    "accelerator": "GPU",
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}