{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":15062,"databundleVersionId":545987,"sourceType":"competition"},{"sourceId":23870,"databundleVersionId":1781260,"sourceType":"competition"}],"dockerImageVersionId":29282,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"Version Changes:\n1. initial commit\n2. increase epochs from 50 -> 250\n3. actually do what's in 2... I didn't cancel the commit correctly\n4. - modify image scaling (was `x/255` now `(x-127.5)/127.5)\n   - modify generator kernel initializer\n   - remove uneeded comments and code\n   - clean up some constants\n5. - modify discriminator\n   - train generator more than discriminator at each training step\n   - print losses while training during each step\n   - 250 -> 150 epochs","metadata":{}},{"cell_type":"code","source":"from __future__ import absolute_import, division, print_function, unicode_literals\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt, zipfile\nimport numpy as np\nimport glob\nimport imageio\nimport xml\nimport xml.etree.ElementTree as ET\nimport time\nimport PIL\nimport tensorflow as tf\ntf.enable_eager_execution()\nfrom tensorflow.keras import layers\nfrom tensorflow.keras.preprocessing.image import array_to_img, img_to_array\nfrom tensorflow.keras.preprocessing.image import NumpyArrayIterator, ImageDataGenerator\nimport IPython\nfrom IPython import display\n\nimport os\nROOT = '../input/'\ndirs = os.listdir(ROOT)\nprint(dirs)\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-07-08T09:43:48.361679Z","iopub.execute_input":"2024-07-08T09:43:48.362069Z","iopub.status.idle":"2024-07-08T09:43:51.143369Z","shell.execute_reply.started":"2024-07-08T09:43:48.362015Z","shell.execute_reply":"2024-07-08T09:43:51.142337Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMAGES_PATH =  '/kaggle/input/ranzcr-clip-catheter-line-classification/train/'\nANNOTATIONS_PATH = '/kaggle/input/ranzcr-clip-catheter-line-classification/train.csv'\n\nIMGS = os.listdir(IMAGES_PATH)\nBREEDS = ANNOTATIONS_PATH\n\nBATCH_SIZE = 256\nIMG_SIZE =256\nCHANNELS = 3","metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","execution":{"iopub.status.busy":"2024-07-08T09:43:51.146081Z","iopub.execute_input":"2024-07-08T09:43:51.146442Z","iopub.status.idle":"2024-07-08T09:43:54.632108Z","shell.execute_reply.started":"2024-07-08T09:43:51.146388Z","shell.execute_reply":"2024-07-08T09:43:54.630998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#load data\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\nfrom keras.preprocessing import image\nimport tensorflow\ntest_df = pd.read_csv('/kaggle/input/ranzcr-clip-catheter-line-classification/train.csv')\ndef append_ext(fn):\n    return \"/kaggle/input/ranzcr-clip-catheter-line-classification/train/\"+fn+\".jpg\"\n\n\ntest_df[\"StudyInstanceUID\"]=test_df[\"StudyInstanceUID\"].apply(append_ext)\ntest_image = []\ntarget_size_dim = 256\n\n\ntest_lab =test_df[['ETT - Abnormal']]","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:54.633792Z","iopub.execute_input":"2024-07-08T09:43:54.634119Z","iopub.status.idle":"2024-07-08T09:43:54.954044Z","shell.execute_reply.started":"2024-07-08T09:43:54.634071Z","shell.execute_reply":"2024-07-08T09:43:54.952770Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import math\n        \nclass DataGenerator(tf.keras.utils.Sequence):\n    \"\"\"\n    Custom data generator class for Digits dataset\n    \"\"\"\n    def __init__(self, test_df: pd.DataFrame, batch_size: int=16):\n        self.labels = test_df[['ETT - Abnormal']].values\n        self.images = test_df[\"StudyInstanceUID\"].values\n        self.labels = tf.keras.utils.to_categorical(self.labels)\n        self.batch_size = batch_size\n    \n    def __len__(self):\n        return math.ceil(len(self.images) / self.batch_size)\n    \n    def __getitem__(self, index):\n        \"\"\"\n        Returns a batch of data\n        \"\"\"\n        batch_images = self.images[index * self.batch_size : (index + 1) * self.batch_size]\n        batch_labels = self.labels[index * self.batch_size : (index + 1) * self.batch_size]\n\n        return batch_images, batch_labels","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:54.956342Z","iopub.execute_input":"2024-07-08T09:43:54.956847Z","iopub.status.idle":"2024-07-08T09:43:54.970566Z","shell.execute_reply.started":"2024-07-08T09:43:54.956763Z","shell.execute_reply":"2024-07-08T09:43:54.969218Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train validation split\nfrom sklearn.model_selection import train_test_split\nX_train, X_val = train_test_split(test_df,test_size=0.2, random_state=0)\nprint(X_train.shape)\nprint(X_val.shape)","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:54.975554Z","iopub.execute_input":"2024-07-08T09:43:54.976045Z","iopub.status.idle":"2024-07-08T09:43:56.060618Z","shell.execute_reply.started":"2024-07-08T09:43:54.975969Z","shell.execute_reply":"2024-07-08T09:43:56.059536Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = DataGenerator(X_train)\nvalid_loader = DataGenerator(X_val)\n\ntraining_dataset = train_loader\nlen(training_dataset[10][1])","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:56.065207Z","iopub.execute_input":"2024-07-08T09:43:56.065605Z","iopub.status.idle":"2024-07-08T09:43:56.080706Z","shell.execute_reply.started":"2024-07-08T09:43:56.065527Z","shell.execute_reply":"2024-07-08T09:43:56.079666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_loader.__len__())\nprint(train_loader.__getitem__(375)[1][10])\nimg = train_loader.__getitem__(375)[0][10]\nimg = image.load_img(img,target_size=(target_size_dim,target_size_dim,3))\nimg = image.img_to_array(img)\nimg = img/255\nplt.imshow(img)","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:56.082865Z","iopub.execute_input":"2024-07-08T09:43:56.083294Z","iopub.status.idle":"2024-07-08T09:43:56.555096Z","shell.execute_reply.started":"2024-07-08T09:43:56.083220Z","shell.execute_reply":"2024-07-08T09:43:56.553706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# For overriding default kernel initializer, glorot uniform\nKERNEL_INIT = tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.25)\n\n# Generator function\ndef make_generator_model():\n    model = tf.keras.Sequential()\n    model.add(layers.Dense(8*8*512, use_bias=False, input_shape=(100,)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Reshape((8, 8, 512)))\n    assert model.output_shape == (None, 8, 8, 512) # Note: None here is the batch size\n    \n    model.add(layers.Conv2DTranspose(256, (5, 5), \n                                     strides=(2, 2),\n                                     padding='same',\n                                     use_bias=False,\n                                     kernel_initializer=KERNEL_INIT))\n    assert model.output_shape == (None, 16, 16, 256)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Dropout(0.3))\n    model.add(layers.Conv2DTranspose(128, (5, 5),\n                                     strides=(2, 2),\n                                     padding='same',\n                                     use_bias=False,\n                                     kernel_initializer=KERNEL_INIT))\n    assert model.output_shape == (None, 32, 32, 128)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n    \n    model.add(layers.Dropout(0.3))\n    model.add(layers.Conv2DTranspose(64, (5, 5),\n                                     strides=(2, 2), \n                                     padding='same', \n                                     use_bias=False,\n                                     kernel_initializer=KERNEL_INIT))\n    assert model.output_shape == (None, 64, 64, 64)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n    \n    model.add(layers.Dropout(0.3))\n    model.add(layers.Conv2DTranspose(32, (5, 5),\n                                     strides=(2, 2), \n                                     padding='same', \n                                     use_bias=False,\n                                     kernel_initializer=KERNEL_INIT))\n    assert model.output_shape == (None, 128, 128, 32)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n    \n    model.add(layers.Dropout(0.3))\n    model.add(layers.Conv2DTranspose(16, (5, 5),\n                                     strides=(2, 2), \n                                     padding='same', \n                                     use_bias=False,\n                                     kernel_initializer=KERNEL_INIT))\n    assert model.output_shape == (None, 256, 256, 16)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n    \n    model.add(layers.Dense(3,use_bias=False, activation='tanh'))\n    model.output_shape == (None, IMG_SIZE, IMG_SIZE, CHANNELS)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:56.557862Z","iopub.execute_input":"2024-07-08T09:43:56.558922Z","iopub.status.idle":"2024-07-08T09:43:56.603785Z","shell.execute_reply.started":"2024-07-08T09:43:56.558825Z","shell.execute_reply":"2024-07-08T09:43:56.602128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create and test generator\ngenerator = make_generator_model()\n\nnoise = tf.random.normal([1, 100])\ngenerated_image = generator(noise, training=False)\nprint(generated_image.shape)\nrn_img = (generated_image[0,:,:,:])\nplt.imshow(generated_image[0,:,:,:])","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:56.605496Z","iopub.execute_input":"2024-07-08T09:43:56.605855Z","iopub.status.idle":"2024-07-08T09:43:58.144274Z","shell.execute_reply.started":"2024-07-08T09:43:56.605800Z","shell.execute_reply":"2024-07-08T09:43:58.142748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator.summary()","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.146441Z","iopub.execute_input":"2024-07-08T09:43:58.146960Z","iopub.status.idle":"2024-07-08T09:43:58.166558Z","shell.execute_reply.started":"2024-07-08T09:43:58.146882Z","shell.execute_reply":"2024-07-08T09:43:58.165544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Discriminator function\ndef make_discriminator_model():\n    model = tf.keras.Sequential()\n    model.add(tf.keras.Input(shape=(256, 256, CHANNELS)))\n    model.add(layers.Conv2D(32,6, strides=1, padding='same' ))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.2))\n\n    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.2))\n    \n    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.2))\n    \n    model.add(layers.Conv2D(256, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.2))\n\n    model.add(layers.Flatten())\n    model.add(layers.Dense(1, activation='linear'))\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.167997Z","iopub.execute_input":"2024-07-08T09:43:58.168296Z","iopub.status.idle":"2024-07-08T09:43:58.183476Z","shell.execute_reply.started":"2024-07-08T09:43:58.168248Z","shell.execute_reply":"2024-07-08T09:43:58.182246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator = make_discriminator_model()\n\ndecision = discriminator(generated_image)\nprint (decision)","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.185736Z","iopub.execute_input":"2024-07-08T09:43:58.186151Z","iopub.status.idle":"2024-07-08T09:43:58.652836Z","shell.execute_reply.started":"2024-07-08T09:43:58.186073Z","shell.execute_reply":"2024-07-08T09:43:58.651567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator1 = make_discriminator_model()\ndiscriminator1.summary()","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.654632Z","iopub.execute_input":"2024-07-08T09:43:58.655042Z","iopub.status.idle":"2024-07-08T09:43:58.897162Z","shell.execute_reply.started":"2024-07-08T09:43:58.654969Z","shell.execute_reply":"2024-07-08T09:43:58.896232Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n\ndef 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    ##################################################\n    #print('         real loss: {}  fake loss: {}'.format(real_loss, fake_loss))\n    total_loss = real_loss + fake_loss\n    return total_loss\n\ndef generator_loss(fake_output):\n    return cross_entropy(tf.ones_like(fake_output), fake_output)\n\ngenerator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\ndiscriminator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\n\ncheckpoint_dir = './training_checkpoints'\ncheckpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\ncheckpoint = tf.train.Checkpoint(generator_optimizer=generator_optimizer,\n                                 discriminator_optimizer=discriminator_optimizer,\n                                 generator=generator,\n                                 discriminator=discriminator)","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.898661Z","iopub.execute_input":"2024-07-08T09:43:58.898955Z","iopub.status.idle":"2024-07-08T09:43:58.912380Z","shell.execute_reply.started":"2024-07-08T09:43:58.898907Z","shell.execute_reply":"2024-07-08T09:43:58.910934Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BATCH_SIZE =16\nEPOCHS = 50\nIMG_COUNT = 24066\nSTEPS_PER_EPOCH = IMG_COUNT / BATCH_SIZE\nnoise_dim = 100\nGRID_H = 2\nGRID_W = 2\nnum_examples_to_generate = GRID_H * GRID_W\n\n# Reuse this seed over time to visualize progress\nseed = tf.random.normal([num_examples_to_generate, noise_dim])","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.915256Z","iopub.execute_input":"2024-07-08T09:43:58.915627Z","iopub.status.idle":"2024-07-08T09:43:58.925834Z","shell.execute_reply.started":"2024-07-08T09:43:58.915548Z","shell.execute_reply":"2024-07-08T09:43:58.924834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_step(images, step_of_epoch=None):\n    if step_of_epoch is not None and isinstance(step_of_epoch, int):\n        print('Training Step {}'.format(step_of_epoch))\n        \n    noise = tf.random.normal([BATCH_SIZE, noise_dim])\n\n#     with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n    # overtrain generator\n    for i in range(5):\n        with tf.GradientTape() as gen_tape:\n            noise = tf.random.normal([BATCH_SIZE, noise_dim])\n            generated_images = generator(noise, training=True)\n            fake_output = discriminator(generated_images, training=True)\n            gen_loss = generator_loss(fake_output)\n            gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n            generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n        \n#         generated_images = generator(noise, training=True)\n\n    with tf.GradientTape() as disc_tape:\n        ############## added########\n        imagearr =[]\n        for m in range(BATCH_SIZE):\n            img = image.load_img(images[m],target_size=(target_size_dim,target_size_dim,3))\n            img = image.img_to_array(img)\n            img = img /255\n            imagearr.append(img)\n        ##########################\n        imagearr  = tf.convert_to_tensor(imagearr)\n        real_output = discriminator(imagearr, training=True)\n        fake_output = discriminator(generated_images, training=False)\n\n#         gen_loss = generator_loss(fake_output)\n        disc_loss = discriminator_loss(real_output, fake_output)\n    ##############################\n        #print('gen loss: {}    disc loss: {}'.format(gen_loss, disc_loss))\n\n#     gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n\n#     generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.927532Z","iopub.execute_input":"2024-07-08T09:43:58.927870Z","iopub.status.idle":"2024-07-08T09:43:58.945877Z","shell.execute_reply.started":"2024-07-08T09:43:58.927820Z","shell.execute_reply":"2024-07-08T09:43:58.944848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(dataset, epochs):\n    for epoch in range(epochs):\n        print('Training epoch {}/{}'.format(epoch, epochs))\n        start = time.time()\n    \n        #i = 0\n        for b in range(int(STEPS_PER_EPOCH)-1):\n            train_step(dataset.__getitem__(b)[0])\n            #i += 1\n            #if i >= STEPS_PER_EPOCH:\n             #   break\n\n        # Produce images for a GIF as we go\n        #display.clear_output(wait=True)\n        generate_and_save_images(generator,\n                                 epoch + 1,\n                                 seed)\n\n        # Save the model every 25 epochs\n        if (epoch + 1) % 1 == 0:\n            checkpoint.save(file_prefix = checkpoint_prefix)\n\n        print ('Time for epoch {} is {} min'.format(epoch + 1, (time.time()-start)/60))\n\n    # Generate after the final epoch\n    #display.clear_output(wait=True)\n    generate_and_save_images(generator,\n                             epochs,\n                             seed)","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.947503Z","iopub.execute_input":"2024-07-08T09:43:58.947872Z","iopub.status.idle":"2024-07-08T09:43:58.963797Z","shell.execute_reply.started":"2024-07-08T09:43:58.947811Z","shell.execute_reply":"2024-07-08T09:43:58.962765Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_and_save_images(model, epoch, test_input):\n    # Notice `training` is set to False.\n    # This is so all layers run in inference mode (batchnorm).\n    predictions = model(test_input, training=False)\n\n    fig = plt.figure(figsize=(10, 10))\n\n    for i in range(predictions.shape[0]):\n        plt.subplot(GRID_H, GRID_W, i+1)\n        plt.imshow(((predictions[i, :, :, :]).numpy()*127.5+127.5).astype(int)) \n        \n        plt.axis('off')\n\n    plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.965495Z","iopub.execute_input":"2024-07-08T09:43:58.965922Z","iopub.status.idle":"2024-07-08T09:43:58.982324Z","shell.execute_reply.started":"2024-07-08T09:43:58.965847Z","shell.execute_reply":"2024-07-08T09:43:58.981319Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train(training_dataset, EPOCHS)","metadata":{"execution":{"iopub.status.busy":"2024-07-08T09:43:58.983757Z","iopub.execute_input":"2024-07-08T09:43:58.984079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))\n\ndef display_image(epoch_no):\n  return PIL.Image.open('image_at_epoch_{:04d}.png'.format(epoch_no))\n\ndisplay_image(EPOCHS)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"anim_file = 'dcgan-dogs.gif' \n\nwith imageio.get_writer(anim_file, mode='I') as writer:\n    filenames = glob.glob('image*.png')\n    filenames = sorted(filenames)\n    last = -1\n    for i,filename in enumerate(filenames):\n        frame = 2*(i**0.5)\n        if round(frame) > round(last):\n            last = frame\n        else:\n            continue\n        image = imageio.imread(filename)\n        writer.append_data(image)\n        image = imageio.imread(filename)\n        writer.append_data(image)\n    display.Image(filename=anim_file)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\n# Create submission file `images.zip`\nz = zipfile.PyZipFile('images.zip', mode='w')\n\nfilename = 'generator_model.h5'\ntf.keras.models.save_model(\n    generator,\n    filename,\n    overwrite=True,\n    include_optimizer=True,\n    save_format=None\n)\n\nfor k in range(10000):\n    # training = False sets all layers to run in inference mode\n    generated_image = generator(tf.random.normal([1, noise_dim]), training=False)\n    f = str(k)+'.png'\n    img = ((generated_image[0,:,:,:]).numpy()*127.5+127.5).astype(int)\n    tf.keras.preprocessing.image.save_img(\n        f,\n        img\n    )\n    z.write(f); os.remove(f)\nz.close()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!mkdir out.zip","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!ls -al | grep .zip","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"A few todos:\n - altering generator and discriminator models\n - hyperparameter tuning\n - grayscale -> gen image -> colorize (if even necessary)\n - loss analysis\n - longer training runs\n - img augmentation\n \n Good enough for now :)","metadata":{}}]}