{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install tensorflow_addons","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:05:38.898313Z","iopub.execute_input":"2023-02-24T16:05:38.900238Z","iopub.status.idle":"2023-02-24T16:05:51.027373Z","shell.execute_reply.started":"2023-02-24T16:05:38.900166Z","shell.execute_reply":"2023-02-24T16:05:51.026209Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## libraries","metadata":{}},{"cell_type":"code","source":"BATCH_SIZE = 32\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport tensorflow_addons as tfa\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport re\nfrom datetime import datetime\nimport pandas as pd\ntry:\n    from kaggle_datasets import KaggleDatasets\nexcept:\n    pass","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:05:51.031453Z","iopub.execute_input":"2023-02-24T16:05:51.031760Z","iopub.status.idle":"2023-02-24T16:05:57.620205Z","shell.execute_reply.started":"2023-02-24T16:05:51.031731Z","shell.execute_reply":"2023-02-24T16:05:57.618919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%xmode Verbose","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:06:00.536083Z","iopub.execute_input":"2023-02-24T16:06:00.536835Z","iopub.status.idle":"2023-02-24T16:06:00.545629Z","shell.execute_reply.started":"2023-02-24T16:06:00.536792Z","shell.execute_reply":"2023-02-24T16:06:00.544589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## TPU setup if required","metadata":{}},{"cell_type":"code","source":"try:\n  tpu = tf.distribute.cluster_resolver.TPUClusterResolver()\n  print('Device:', tpu.master())\n  tf.config.experimental_connect_to_cluster(tpu)\n  tf.tpu.experimental.initialize_tpu_system(tpu)\n  strategy = tf.distribute.experimental.TPUStrategy(tpu)\nexcept:\n  strategy = tf.distribute.get_strategy()\nprint('Number of replicas: ', strategy.num_replicas_in_sync)\n\nAUTOTUNE = tf.data.experimental.AUTOTUNE\nprint(tf.__version__)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:06:34.512453Z","iopub.execute_input":"2023-02-24T16:06:34.512807Z","iopub.status.idle":"2023-02-24T16:06:34.530166Z","shell.execute_reply.started":"2023-02-24T16:06:34.512778Z","shell.execute_reply":"2023-02-24T16:06:34.529112Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading Datatset","metadata":{}},{"cell_type":"code","source":"GCS_PATH = KaggleDatasets().get_gcs_path(\"gan-getting-started\")\nMONET_FILENAMES = tf.io.gfile.glob(str(GCS_PATH + '/monet_tfrec/*.tfrec'))\nPHOTO_FILENAMES = tf.io.gfile.glob(str(GCS_PATH + '/photo_tfrec/*.tfrec'))","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:07:03.025616Z","iopub.execute_input":"2023-02-24T16:07:03.025962Z","iopub.status.idle":"2023-02-24T16:07:06.873321Z","shell.execute_reply.started":"2023-02-24T16:07:03.025932Z","shell.execute_reply":"2023-02-24T16:07:06.872333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"IMAGE_SIZE = [256, 256]\n\ndef decode_image(image):\n  image = tf.image.decode_jpeg(image, channels=3)\n  image = (tf.cast(image, tf.float32) / 127.5) - 1\n  image = tf.reshape(image, [*IMAGE_SIZE, 3])\n  return image\n\ndef read_tfrecord(example):\n  tfrecord_format = {\n      'image': tf.io.FixedLenFeature([], tf.string)\n  }\n  example = tf.io.parse_single_example(example, tfrecord_format)\n  image = decode_image(example['image'])\n  return image","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:07:18.135415Z","iopub.execute_input":"2023-02-24T16:07:18.135776Z","iopub.status.idle":"2023-02-24T16:07:18.142391Z","shell.execute_reply.started":"2023-02-24T16:07:18.135745Z","shell.execute_reply":"2023-02-24T16:07:18.141361Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dataset(filenames):\n  dataset = tf.data.TFRecordDataset(filenames)\n  dataset = dataset.map(read_tfrecord, num_parallel_calls=AUTOTUNE)\n  return dataset\n\nmonet_ds = load_dataset(MONET_FILENAMES).batch(1)\nphoto_ds = load_dataset(PHOTO_FILENAMES).batch(1)\n\nfast_photo_ds = load_dataset(PHOTO_FILENAMES).batch(32*strategy.num_replicas_in_sync).prefetch(32)\nfid_photo_ds = load_dataset(PHOTO_FILENAMES).take(1024).batch(32*strategy.num_replicas_in_sync).prefetch(32)\nfid_monet_ds = load_dataset(MONET_FILENAMES).batch(32*strategy.num_replicas_in_sync).prefetch(32)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:07:36.565695Z","iopub.execute_input":"2023-02-24T16:07:36.566915Z","iopub.status.idle":"2023-02-24T16:07:39.602617Z","shell.execute_reply.started":"2023-02-24T16:07:36.566868Z","shell.execute_reply":"2023-02-24T16:07:39.601708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_gan_dataset(monet_files, photo_files, augment=None, repeat=True, shuffle=True, batch_size=1):\n  monet_ds = load_dataset(monet_files)\n  photo_ds = load_dataset(photo_files)\n\n  if augment:\n    monet_ds = monet_ds.map(augment, num_parallel_calls=AUTOTUNE)\n    photo_ds = photo_ds.map(augment, num_parallel_calls=AUTOTUNE)\n\n  if repeat:\n    monet_ds = monet_ds.repeat()\n    photo_ds = photo_ds.repeat()\n\n  if shuffle:\n    monet_ds = monet_ds.shuffle(2048)\n    photo_ds = photo_ds.shuffle(2048)\n  \n  monet_ds = monet_ds.batch(batch_size, drop_remainder=True)\n  photo_ds = photo_ds.batch(batch_size, drop_remainder=True)\n# monet_ds = monet_ds.cache()\n# photo_ds = photo_ds.cache()\n  monet_ds = monet_ds.prefetch(AUTOTUNE)\n  photo_ds = photo_ds.prefetch(AUTOTUNE)\n\n  gan_ds = tf.data.Dataset.zip((monet_ds, photo_ds))\n  return gan_ds","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:08:13.918316Z","iopub.execute_input":"2023-02-24T16:08:13.918680Z","iopub.status.idle":"2023-02-24T16:08:13.926720Z","shell.execute_reply.started":"2023-02-24T16:08:13.918651Z","shell.execute_reply":"2023-02-24T16:08:13.925572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"final_dataset = get_gan_dataset(MONET_FILENAMES, PHOTO_FILENAMES, augment=None, repeat=True, shuffle=True, batch_size=BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:08:45.986835Z","iopub.execute_input":"2023-02-24T16:08:45.987216Z","iopub.status.idle":"2023-02-24T16:08:46.037188Z","shell.execute_reply.started":"2023-02-24T16:08:45.987183Z","shell.execute_reply":"2023-02-24T16:08:46.036302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## FID Generator","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  inception_model = tf.keras.applications.InceptionV3(input_shape=(256, 256, 3), pooling='avg', include_top=False)\n\n  mix3 = inception_model.get_layer('mixed9').output\n  f0 = tf.keras.layers.GlobalAveragePooling2D()(mix3)\n\n  inception_model = tf.keras.Model(inputs=inception_model.input, outputs=f0)\n  inception_model.trainable = False\n\n  def calculate_activation_satistics_mod(images, fid_model):\n    act = tf.cast(fid_model.predict(images), tf.float32)\n\n    mu = tf.reduce_mean(act, axis=0)\n    mean_x = tf.reduce_mean(act, axis=0, keepdims=True)\n    mx = tf.matmul(tf.transpose(mean_x), mean_x)\n    vx = tf.matmul(tf.transpose(act), act)/tf.cast(tf.shape(act)[0], tf.float32)\n    sigma = vx - mx\n    return mu, sigma\n  myFID_mu2, myFID_sigma2 = calculate_activation_satistics_mod(fid_monet_ds, inception_model)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:09:07.797430Z","iopub.execute_input":"2023-02-24T16:09:07.797786Z","iopub.status.idle":"2023-02-24T16:09:27.811828Z","shell.execute_reply.started":"2023-02-24T16:09:07.797756Z","shell.execute_reply":"2023-02-24T16:09:27.810855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n  def calculate_frechet_distance(mu1, sigma1, mu2, sigma2):\n    fid_epsilon = 1e-14\n\n    covmean = tf.linalg.sqrtm(tf.cast(tf.matmul(sigma1, sigma2), tf.complex64))\n#   isgood = tf.cast(tf.math.is_finite(covmean), tf.int32)\n#   if tf.size(isgood) != tf.math.reduce_sum(isgood)\n#     return 0\n    covmean = tf.cast(tf.math.real(covmean), tf.float32)\n\n    tr_covmean = tf.linalg.trace(covmean)\n\n    return tf.matmul(tf.expand_dims(mu1 - mu2, axis=0), tf.expand_dims(mu1 - mu2, axis=1)) + tf.linalg.trace(sigma1) + tf.linalg.trace(sigma2) - 2 * tr_covmean\n  \n  def FID(images, gen_model, inception_model=inception_model, myFID_mu2=myFID_mu2, myFID_sigma2=myFID_sigma2):\n    inp = layers.Input(shape=[256, 256, 3], name='input_image')\n    x = gen_model(inp)\n    x = inception_model(x)\n    fid_model = tf.keras.Model(inputs=inp, outputs=x)\n\n    mu1, sigma1 = calculate_activation_satistics_mod(images, fid_model)\n\n    fid_value = calculate_frechet_distance(mu1, sigma1, myFID_mu2, myFID_sigma2)\n\n    return fid_value","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:09:32.273331Z","iopub.execute_input":"2023-02-24T16:09:32.273746Z","iopub.status.idle":"2023-02-24T16:09:32.289245Z","shell.execute_reply.started":"2023-02-24T16:09:32.273710Z","shell.execute_reply":"2023-02-24T16:09:32.288205Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Generator","metadata":{}},{"cell_type":"code","source":"OUTPUT_CHANNELS = 3\ndef down_sample(filters, size, apply_instancenorm=True):\n  initializer = tf.random_normal_initializer(0., 0.02)\n  gamma_init = keras.initializers.RandomNormal(mean=0.0, stddev=0.02)\n\n  layer = keras.Sequential()\n  layer.add(layers.Conv2D(filters, size, strides=2, padding='same', kernel_initializer=initializer, use_bias=False))\n\n  if apply_instancenorm:\n    layer.add(tfa.layers.InstanceNormalization(gamma_initializer=gamma_init))\n  layer.add(layers.LeakyReLU())\n  return layer","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:09:53.922201Z","iopub.execute_input":"2023-02-24T16:09:53.922553Z","iopub.status.idle":"2023-02-24T16:09:53.930006Z","shell.execute_reply.started":"2023-02-24T16:09:53.922526Z","shell.execute_reply":"2023-02-24T16:09:53.929068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def up_sample(filters, size, apply_dropout=False):\n  initializer = tf.random_normal_initializer(0., 0.02)\n  gamma_init = keras.initializers.RandomNormal(mean=0, stddev=0.02)\n\n  layer = keras.Sequential()\n  layer.add(layers.Conv2DTranspose(filters, size, strides=2, padding='same', kernel_initializer=initializer, use_bias=False))\n  layer.add(tfa.layers.InstanceNormalization(gamma_initializer=gamma_init))\n\n  if apply_dropout:\n    layer.add(layers.Dropout(0.5))\n  layer.add(layers.ReLU())\n  return layer","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:10:03.882234Z","iopub.execute_input":"2023-02-24T16:10:03.882673Z","iopub.status.idle":"2023-02-24T16:10:03.891992Z","shell.execute_reply.started":"2023-02-24T16:10:03.882634Z","shell.execute_reply":"2023-02-24T16:10:03.891065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.python.ops.gen_data_flow_ops import padding_fifo_queue\ndef Generator():\n  inputs = layers.Input(shape=[256, 256, 3])\n  down_stack = [\n      down_sample(64, 4, apply_instancenorm=False), # (size, 128, 128, 64)\n      down_sample(128, 4),                          # (size, 64, 64, 128)\n      down_sample(256, 4),                          # (size, 32, 32, 256)\n      down_sample(512, 4),                          # (size, 16, 16, 512)\n      down_sample(512, 4),                          # (size, 8, 8, 512)\n      down_sample(512, 4),                          # (size, 4, 4, 512)\n      down_sample(512, 4),                          # (size, 2, 2, 512)\n      down_sample(512, 4)                           # (size, 1, 1, 512)\n  ]\n\n  up_stack = [\n      up_sample(512, 4, apply_dropout=True),        # (size, 2, 2, 1024) : deep = 512 + 512(skip connect)\n      up_sample(512, 4, apply_dropout=True),        # (size, 4, 4, 1024)\n      up_sample(512, 4, apply_dropout=True),        # (size, 8, 8, 1024)\n      up_sample(512, 4),                            # (size, 16, 16, 1024)\n      up_sample(256, 4),                            # (size, 32, 32, 512)\n      up_sample(128, 4),                            # (size, 64, 64, 256)\n      up_sample(64, 4)                              # (size, 128, 128, 128)\n  ]\n  initializer = tf.random_normal_initializer(0., 0.02)\n  last = layers.Conv2DTranspose(3, 4, strides=2, padding='same', kernel_initializer=initializer, activation='tanh') # (size, 256, 256, 3)\n\n  x = inputs\n\n  #Downsampling through the model\n  skips = []\n  for down in down_stack:\n    x = down(x)\n    skips.append(x)\n  \n  skips = reversed(skips[:-1])\n\n  #Upsampling and establishing the skip connections\n  for up, skip in zip(up_stack, skips):\n    x = up(x)\n    x = layers.Concatenate()([x, skip])\n  \n  x = last(x)\n  return keras.Model(inputs=inputs, outputs=x)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:10:18.503180Z","iopub.execute_input":"2023-02-24T16:10:18.503540Z","iopub.status.idle":"2023-02-24T16:10:18.515140Z","shell.execute_reply.started":"2023-02-24T16:10:18.503509Z","shell.execute_reply":"2023-02-24T16:10:18.514233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from tensorflow.keras.utils import plot_model\ngen_viz = Generator()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:10:36.537538Z","iopub.execute_input":"2023-02-24T16:10:36.537918Z","iopub.status.idle":"2023-02-24T16:10:37.938107Z","shell.execute_reply.started":"2023-02-24T16:10:36.537871Z","shell.execute_reply":"2023-02-24T16:10:37.937168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gen_viz.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:10:49.301431Z","iopub.execute_input":"2023-02-24T16:10:49.301793Z","iopub.status.idle":"2023-02-24T16:10:49.353820Z","shell.execute_reply.started":"2023-02-24T16:10:49.301763Z","shell.execute_reply":"2023-02-24T16:10:49.353007Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Discriminator","metadata":{}},{"cell_type":"code","source":"def Discriminator():\n  initializer = tf.random_normal_initializer(0., 0.02)\n  gamma_init = keras.initializers.RandomNormal(mean=0.0, stddev=0.02)\n  inp = layers.Input(shape=[256, 256, 3], name='input_image')\n  x = inp\n  down1 = down_sample(64, 4, False)(x)        # (size, 128, 128, 64)\n  down2 = down_sample(128, 4)(down1)          # (size, 64, 64, 128)\n  down3 = down_sample(256, 4)(down2)          # (size, 32, 32, 256)\n\n  zero_pad1 = layers.ZeroPadding2D()(down3)   # (size, 34, 34, 256)\n  conv = layers.Conv2D(512, 4, strides=1, kernel_initializer=initializer, use_bias=False)(zero_pad1) # (size, 31, 31, 512)\n\n  norm1 = tfa.layers.InstanceNormalization(gamma_initializer=gamma_init)(conv)\n  leaky_relu = layers.LeakyReLU()(norm1)\n  zero_pad2 = layers.ZeroPadding2D()(leaky_relu) # (size, 33, 33, 512)\n\n  return keras.Model(inputs=inp, outputs=zero_pad2)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:11:17.116504Z","iopub.execute_input":"2023-02-24T16:11:17.116941Z","iopub.status.idle":"2023-02-24T16:11:17.130417Z","shell.execute_reply.started":"2023-02-24T16:11:17.116903Z","shell.execute_reply":"2023-02-24T16:11:17.129439Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Discriminator_viz = Discriminator()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:11:41.659189Z","iopub.execute_input":"2023-02-24T16:11:41.659580Z","iopub.status.idle":"2023-02-24T16:11:41.854410Z","shell.execute_reply.started":"2023-02-24T16:11:41.659547Z","shell.execute_reply":"2023-02-24T16:11:41.853392Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Discriminator_viz.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:11:44.691471Z","iopub.execute_input":"2023-02-24T16:11:44.691838Z","iopub.status.idle":"2023-02-24T16:11:44.733159Z","shell.execute_reply.started":"2023-02-24T16:11:44.691807Z","shell.execute_reply":"2023-02-24T16:11:44.732332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2-objective discriminator ","metadata":{}},{"cell_type":"code","source":"def DHead():\n  initializer = tf.random_normal_initializer(0., 0.02)\n\n  inp = layers.Input(shape=[33, 33, 512], name='input_image')\n  x = inp\n\n  last = layers.Conv2D(1, 4, strides=1, kernel_initializer=initializer)(x) # (size, 30, 30, 1)\n\n  return keras.Model(inputs=inp, outputs=last)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:13:06.999618Z","iopub.execute_input":"2023-02-24T16:13:07.000109Z","iopub.status.idle":"2023-02-24T16:13:07.007153Z","shell.execute_reply.started":"2023-02-24T16:13:07.000069Z","shell.execute_reply":"2023-02-24T16:13:07.005995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DHead_viz = DHead()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:13:16.790580Z","iopub.execute_input":"2023-02-24T16:13:16.790947Z","iopub.status.idle":"2023-02-24T16:13:16.809768Z","shell.execute_reply.started":"2023-02-24T16:13:16.790916Z","shell.execute_reply":"2023-02-24T16:13:16.808875Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DHead_viz.summary()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:13:22.918489Z","iopub.execute_input":"2023-02-24T16:13:22.918857Z","iopub.status.idle":"2023-02-24T16:13:22.938427Z","shell.execute_reply.started":"2023-02-24T16:13:22.918825Z","shell.execute_reply":"2023-02-24T16:13:22.937731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Photo Discriminator","metadata":{}},{"cell_type":"code","source":"def DiscriminatorP():\n  initializer = tf.random_normal_initializer(0., 0.02)\n  gamma_init = keras.initializers.RandomNormal(mean=0.0, stddev=0.02)\n\n  inp = layers.Input(shape=[256, 256, 3], name='input_image')\n  x = inp\n\n  down1 = down_sample(64, 4, False)(x)        # (size, 128, 128, 64)\n  down2 = down_sample(128, 4)(down1)          # (size, 64, 64, 128)\n  down3 = down_sample(256, 4)(down2)          # (size, 32, 32, 256)\n\n  zero_pad1 = layers.ZeroPadding2D()(down3) # (size, 34, 34, 256)\n  conv = layers.Conv2D(512, 4, strides=1, kernel_initializer=initializer, use_bias=False)(zero_pad1) # (size, 31, 31, 512)\n\n  norm1 = tfa.layers.InstanceNormalization(gamma_initializer=gamma_init)(conv)\n  leaky_relu = layers.LeakyReLU()(norm1)\n  zero_pad2 = layers.ZeroPadding2D()(leaky_relu) # (size, 33, 33, 512)\n  last = layers.Conv2D(1, 4, strides=1, kernel_initializer=initializer)(zero_pad2) # (size, 30, 30, 1)\n\n  return tf.keras.Model(inputs=inp, outputs=last)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:13:46.839163Z","iopub.execute_input":"2023-02-24T16:13:46.839622Z","iopub.status.idle":"2023-02-24T16:13:46.854098Z","shell.execute_reply.started":"2023-02-24T16:13:46.839577Z","shell.execute_reply":"2023-02-24T16:13:46.853102Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n  monet_generator = Generator() # transforms photos to Monet-esque paintings\n  photo_generator = Generator() # transforms Monet paintings to be more like photos\n\n  monet_discriminator = Discriminator() # differentiates real and fake Monet paintings\n  photo_discriminator = DiscriminatorP() # differentiates real and fake photo\n\n  dHead1 = DHead()  # Head for BCE\n  dHead2 = DHead()  # Head for hinge loss","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:13:55.253730Z","iopub.execute_input":"2023-02-24T16:13:55.254127Z","iopub.status.idle":"2023-02-24T16:13:57.521990Z","shell.execute_reply.started":"2023-02-24T16:13:55.254094Z","shell.execute_reply":"2023-02-24T16:13:57.521045Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CycleGAN(keras.Model):\n  def __init__(\n      self,\n      monet_generator,\n      photo_generator,\n      monet_discriminator,\n      photo_discriminator,\n      dhead1,\n      dhead2,\n      lambda_cycle=3,\n      lambda_id=3\n  ):\n    super(CycleGAN, self).__init__()\n    self.m_gen = monet_generator\n    self.p_gen = photo_generator\n    self.m_disc = monet_discriminator\n    self.p_disc = photo_discriminator\n    self.lambda_cycle = lambda_cycle\n    self.lambda_id = lambda_id\n    self.dhead1 = dhead1\n    self.dhead2 = dhead2\n  def compile(\n      self,\n      m_gen_optimizer,\n      p_gen_optimizer,\n      m_disc_optimizer,\n      p_disc_optimizer,\n      gen_loss_fn1,\n      gen_loss_fn2,\n      disc_loss_fn1,\n      disc_loss_fn2,\n      cycle_loss_fn,\n      identity_loss_fn,\n      aug_fn\n  ):\n    super(CycleGAN, self).compile()\n    self.m_gen_optimizer = m_gen_optimizer\n    self.p_gen_optimizer = p_gen_optimizer\n    self.m_disc_optimizer = m_disc_optimizer\n    self.p_disc_optimizer = p_disc_optimizer\n    self.gen_loss_fn1 = gen_loss_fn1\n    self.gen_loss_fn2 = gen_loss_fn2\n    self.disc_loss_fn1 = disc_loss_fn1\n    self.disc_loss_fn2 = disc_loss_fn2\n    self.cycle_loss_fn = cycle_loss_fn\n    self.identity_loss_fn = identity_loss_fn\n    self.aug_fn = aug_fn\n\n    self.step_num = 0\n  def train_step(self, batch_data):\n    real_monet, real_photo = batch_data\n    batch_size = tf.shape(real_monet)[0]\n    fake_monet = self.m_gen(real_photo, training=True)\n    cycled_photo = self.p_gen(fake_monet, training=True)\n\n    # monet to photo back to monet\n    fake_photo = self.p_gen(real_monet, training=True)\n    cycled_monet = self.m_gen(fake_photo, training=True)\n\n    # generating itself\n    same_photo = self.p_gen(real_photo, training=True)\n    same_monet = self.m_gen(real_monet, training=True)\n\n    # Diffaugment\n    both_monet = tf.concat([real_monet, fake_monet], axis=0)\n\n    aug_monet = self.aug_fn(both_monet)\n\n    aug_real_monet = aug_monet[:batch_size]\n    aug_fake_monet = aug_monet[batch_size:]\n\n    # Monet two-objective discriminator\n    disc_fake_monet1 = self.dhead1(self.m_disc(aug_fake_monet, training=True), training=True)\n    disc_real_monet1 = self.dhead1(self.m_disc(aug_real_monet, training=True), training=True)\n    disc_fake_monet2 = self.dhead2(self.m_disc(aug_fake_monet, training=True), training=True)\n    disc_real_monet2 = self.dhead2(self.m_disc(aug_real_monet, training=True), training=True)\n\n    # Monet GAN Loss\n    monet_gen_loss1 = self.gen_loss_fn1(disc_fake_monet1)\n    monet_gen_loss2 = self.gen_loss_fn2(disc_fake_monet2)\n    monet_gen_loss = (monet_gen_loss1 + monet_gen_loss2) * 0.4\n    \n    disc_real_photo = self.p_disc(real_photo, training=True)\n    disc_fake_photo = self.p_disc(fake_photo, training=True)\n\n    # Photo GAN Loss\n    photo_gen_loss = self.gen_loss_fn1(disc_fake_photo)\n\n    # Cycle Loss\n    monet_cycle_loss = self.cycle_loss_fn(real_monet, cycled_monet, self.lambda_cycle / tf.cast(batch_size, tf.float32))\n    photo_cycle_loss = self.cycle_loss_fn(real_photo, cycled_photo, self.lambda_cycle / tf.cast(batch_size, tf.float32))\n    total_cycle_loss = monet_cycle_loss + photo_cycle_loss\n\n    # Identity Loss\n    monet_identity_loss = self.identity_loss_fn(real_monet, same_monet, self.lambda_id / tf.cast(batch_size, tf.float32))\n    photo_identity_loss = self.identity_loss_fn(real_photo, same_photo, self.lambda_id / tf.cast(batch_size, tf.float32))\n\n    #------>Total Generator Loss\n    total_monet_gen_loss = monet_gen_loss + total_cycle_loss + monet_identity_loss\n    total_photo_gen_loss = photo_gen_loss + total_cycle_loss + photo_identity_loss\n    \n    monet_head_loss1 = self.disc_loss_fn1(disc_real_monet1, disc_fake_monet1)\n    monet_head_loss2 = self.disc_loss_fn2(disc_real_monet2, disc_fake_monet2)\n    monet_disc_loss = monet_head_loss1 + monet_head_loss2\n\n    # Photo Discriminator Loss\n    photo_disc_loss = self.disc_loss_fn1(disc_real_photo, disc_fake_photo)\n\n    #------------------------\n    # Calculate the gradients\n    #------------------------\n\n    # for generator\n    monet_generator_gradients = tape.gradient(total_monet_gen_loss, self.m_gen.trainable_variables)\n    photo_generator_gradients = tape.gradient(total_photo_gen_loss, self.p_gen.trainable_variables)\n\n    # for discriminator\n    monet_discriminator_gradients = tape.gradient(monet_disc_loss, self.m_disc.trainable_variables)\n    photo_discriminator_gradients = tape.gradient(photo_disc_loss, self.p_disc.trainable_variables)\n\n    # for heads\n    monet_head_gradients1 = tape.gradient(monet_head_loss1, self.dhead1.trainable_variables)\n    monet_head_gradients2 = tape.gradient(monet_head_loss2, self.dhead2.trainable_variables)\n    \n    self.m_disc_optimizer.apply_gradients(zip(monet_head_gradients1, self.dhead1.trainable_variables))\n    self.m_disc_optimizer.apply_gradients(zip(monet_head_gradients2, self.dhead2.trainable_variables))\n\n    # for generator\n    self.m_gen_optimizer.apply_gradients(zip(monet_generator_gradients, self.m_gen.trainable_variables))\n    self.p_gen_optimizer.apply_gradients(zip(photo_generator_gradients, self.p_gen.trainable_variables))\n\n    # for discriminator\n    self.m_disc_optimizer.apply_gradients(zip(monet_discriminator_gradients, self.m_disc.trainable_variables))\n    self.p_disc_optimizer.apply_gradients(zip(photo_discriminator_gradients, self.p_disc.trainable_variables))\n\n    return {\n    'monet_gen_loss': monet_gen_loss,\n    'monet_identity_loss': monet_identity_loss,\n    'photo_gen_loss': photo_gen_loss,\n    'photo_identity_loss': photo_identity_loss,\n    'total_cycle_loss': total_cycle_loss,\n    'total_monet_gen_loss': total_monet_gen_loss,\n    'total_photo_gen_loss': total_photo_gen_loss,\n    'monet_head_loss1': monet_head_loss1,\n    'monet_head_loss2': monet_head_loss2,\n    'monet_disc_loss': monet_disc_loss,\n    'photo_disc_loss': photo_disc_loss,\n    }\n","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:18:44.746905Z","iopub.execute_input":"2023-02-24T16:18:44.748089Z","iopub.status.idle":"2023-02-24T16:18:44.784879Z","shell.execute_reply.started":"2023-02-24T16:18:44.748019Z","shell.execute_reply":"2023-02-24T16:18:44.783691Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Discriminator Loss","metadata":{}},{"cell_type":"code","source":"with strategy.scope(): #for TPU\n  def discriminator_loss1(real, generated):\n    real_loss = tf.math.minimum(tf.zeros_like(real), real-tf.ones_like(real))\n\n    generated_loss = tf.math.minimum(tf.zeros_like(generated), -generated-tf.ones_like(generated))\n\n    total_disc_loss = real_loss + generated_loss\n\n    return tf.reduce_mean(-total_disc_loss * 0.5)\n  \n  def discriminator_loss2(real, generated):\n    generated_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)\\\n    (tf.ones_like(generated), generated)\n\n    real_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)\\\n    (tf.ones_like(real), real)\n\n    total_disc_loss = real_loss + generated_loss\n\n    return tf.reduce_mean(total_disc_loss * 0.5)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:19:11.259517Z","iopub.execute_input":"2023-02-24T16:19:11.259878Z","iopub.status.idle":"2023-02-24T16:19:11.268158Z","shell.execute_reply.started":"2023-02-24T16:19:11.259847Z","shell.execute_reply":"2023-02-24T16:19:11.267172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Generator Loss","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  def generator_loss1(generated):\n    return tf.reduce_mean(-generated)\n  \n  def generator_loss2(generated):\n    return tf.reduce_mean(tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)\\\n                          (tf.zeros_like(generated), generated))","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:19:33.200153Z","iopub.execute_input":"2023-02-24T16:19:33.200533Z","iopub.status.idle":"2023-02-24T16:19:33.206559Z","shell.execute_reply.started":"2023-02-24T16:19:33.200499Z","shell.execute_reply":"2023-02-24T16:19:33.205306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Cycle Loss","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  def calc_cycle_loss(real_image, cycled_image, LAMBDA):\n    loss1 = tf.reduce_sum(tf.abs(real_image-cycled_image))\n\n    return LAMBDA * loss1 * 0.0000152587890625","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:19:47.499304Z","iopub.execute_input":"2023-02-24T16:19:47.499739Z","iopub.status.idle":"2023-02-24T16:19:47.506216Z","shell.execute_reply.started":"2023-02-24T16:19:47.499702Z","shell.execute_reply":"2023-02-24T16:19:47.505099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Identity Loss","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  def identity_loss(real_image, same_image, LAMBDA):\n    loss = tf.reduce_sum(tf.abs(real_image-same_image))\n    return LAMBDA * 0.5 * loss * 0.0000152587890625","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:20:01.888586Z","iopub.execute_input":"2023-02-24T16:20:01.888950Z","iopub.status.idle":"2023-02-24T16:20:01.895709Z","shell.execute_reply.started":"2023-02-24T16:20:01.888918Z","shell.execute_reply":"2023-02-24T16:20:01.894714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Differential Augmentation","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  def rand_brightness(x):\n    magnitude = tf.random.uniform([tf.shape(x)[0], 1, 1, 1]) - 0.5\n    x = x + magnitude\n    return x\n  \n  def rand_saturation(x):\n    magnitude = tf.random.uniform([tf.shape(x)[0], 1, 1, 1]) * 2\n    x_mean = tf.reduce_sum(x, axis=3, keepdims=True) * 0.3333333333333333333\n\n    x = (x - x_mean) * magnitude + x_mean\n    return x\n  \n  def rand_contrast(x):\n    magnitude = tf.random.uniform([tf.shape(x)[0], 1, 1, 1]) + 0.5\n    x_mean = tf.reduce_sum(x, axis=[1, 2, 3], keepdims=True) * 5.086e-6\n    x = (x - x_mean) * magnitude + x_mean\n    return x\n  \n  def rand_translation(x, ratio=0.125):\n    batch_size = tf.shape(x)[0]\n    image_size = tf.shape(x)[1:3]\n    shift = tf.cast(tf.cast(image_size, tf.float32) * ratio + 0.5, tf.int32)\n    translation_x = tf.random.uniform(shape=[batch_size, 1], minval=-shift[0], maxval=shift[0] + 1, dtype=tf.int32)\n    translation_y = tf.random.uniform(shape=[batch_size, 1], minval=-shift[1], maxval=shift[1] + 1, dtype=tf.int32)\n    grid_x = tf.clip_by_value(tf.expand_dims(tf.range(image_size[0], dtype=tf.int32), 0) + translation_x + 1, 0, image_size[0] + 1)\n    grid_y = tf.clip_by_value(tf.expand_dims(tf.range(image_size[1], dtype=tf.int32), 0) + translation_y + 1, 0, image_size[1] + 1)\n    x = tf.gather_nd(tf.pad(x, [[0, 0], [1, 1], [0, 0], [0, 0]]), tf.expand_dims(grid_x, -1), batch_dims=1)\n    x = tf.transpose(tf.gather_nd(tf.pad(tf.transpose(x, [0, 2, 1, 3]), [[0, 0], [1, 1], [0, 0], [0, 0]]), tf.expand_dims(grid_y, -1),\n                                  batch_dims=1), [0, 2, 1, 3])\n    return x\n\n  def rand_cutout(x, ratio=0.5):\n    batch_size = tf.shape(x)[0]\n    image_size = tf.shape(x)[1:3]\n    cutout_size = tf.cast(tf.cast(image_size, tf.float32) * ratio + 0.5, tf.int32)\n    offset_x = tf.random.uniform([tf.shape(x)[0], 1, 1], maxval=image_size[0] + (1 - cutout_size[0] % 2), dtype=tf.int32)\n    offset_y = tf.random.uniform([tf.shape(x)[0], 1, 1], maxval=image_size[1] + (1 - cutout_size[1] % 2), dtype=tf.int32)\n    grid_batch, grid_x, grid_y = tf.meshgrid(tf.range(batch_size, dtype=tf.int32), tf.range(cutout_size[0], dtype=tf.int32),\n                                             tf.range(cutout_size[1], dtype=tf.int32), indexing='ij')\n    cutout_grid = tf.stack([grid_batch, grid_x + offset_x - cutout_size[0] // 2, grid_y + offset_y - cutout_size[1] // 2], axis=-1)\n    mask_shape = tf.stack([batch_size, image_size[0], image_size[1]])\n    cutout_grid = tf.maximum(cutout_grid, 0)\n    cutout_grid = tf.minimum(cutout_grid, tf.reshape(mask_shape - 1, [1, 1, 1, 3]))\n    mask = tf.maximum(1 - tf.scatter_nd(cutout_grid, tf.ones([batch_size, cutout_size[0], cutout_size[1]], dtype=tf.float32), mask_shape), 0)\n    x = x * tf.expand_dims(mask, axis=3)\n    return x\n\n  AUGMENT_FNS = {\n      'color': [rand_brightness, rand_saturation, rand_contrast],\n      'translation': [rand_translation],\n      'cutout': [rand_cutout],\n  }\n  def DiffAugment(x, policy='', channels_first=False):\n    if policy:\n      if channels_first:\n        x = tf.transpose(x, [0, 2, 3, 1])\n      for p in policy.split(','):\n        for f in AUGMENT_FNS[p]:\n          x = f(x)\n      if channels_first:\n        x = tf.transpose(x, [0, 3, 1, 2])\n    return x\n  \n  def aug_fn(image):\n    return DiffAugment(image, \"color,translation,cutout\")","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:22:21.282570Z","iopub.execute_input":"2023-02-24T16:22:21.282975Z","iopub.status.idle":"2023-02-24T16:22:21.306224Z","shell.execute_reply.started":"2023-02-24T16:22:21.282939Z","shell.execute_reply":"2023-02-24T16:22:21.305242Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Optimizer","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  monet_generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n  photo_generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n\n  monet_discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n  photo_discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:23:08.489287Z","iopub.execute_input":"2023-02-24T16:23:08.489768Z","iopub.status.idle":"2023-02-24T16:23:08.499129Z","shell.execute_reply.started":"2023-02-24T16:23:08.489724Z","shell.execute_reply":"2023-02-24T16:23:08.497919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Loading Cycle GAN","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  cycle_gan_model = CycleGAN(\n      monet_generator, photo_generator, monet_discriminator, photo_discriminator, dHead1, dHead2\n  )","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:23:32.721860Z","iopub.execute_input":"2023-02-24T16:23:32.722241Z","iopub.status.idle":"2023-02-24T16:23:32.733962Z","shell.execute_reply.started":"2023-02-24T16:23:32.722207Z","shell.execute_reply":"2023-02-24T16:23:32.733060Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Training\n## 30 epochs with lr 2e-4","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n  cycle_gan_model.compile(\n      m_gen_optimizer = monet_generator_optimizer,\n      p_gen_optimizer = photo_generator_optimizer,\n      m_disc_optimizer = monet_discriminator_optimizer,\n      p_disc_optimizer = photo_discriminator_optimizer,\n      gen_loss_fn1 = generator_loss1,\n      gen_loss_fn2 = generator_loss2,\n      disc_loss_fn1 = discriminator_loss1,\n      disc_loss_fn2 = discriminator_loss2,\n      cycle_loss_fn = calc_cycle_loss,\n      identity_loss_fn = identity_loss,\n      aug_fn = aug_fn\n  )","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:24:02.659435Z","iopub.execute_input":"2023-02-24T16:24:02.659789Z","iopub.status.idle":"2023-02-24T16:24:02.679385Z","shell.execute_reply.started":"2023-02-24T16:24:02.659759Z","shell.execute_reply":"2023-02-24T16:24:02.678371Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history1=np.load('../input/save-model/Monet_pretrain/history1.npy',allow_pickle='TRUE').item()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:25:45.919283Z","iopub.execute_input":"2023-02-24T16:25:45.919725Z","iopub.status.idle":"2023-02-24T16:25:45.945470Z","shell.execute_reply.started":"2023-02-24T16:25:45.919685Z","shell.execute_reply":"2023-02-24T16:25:45.944530Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history1_df = pd.DataFrame(history1)\nhistory1_df.loc[:, ['monet_gen_loss', 'photo_disc_loss', 'monet_head_loss1', 'monet_head_loss2']].plot()\nprint('Minimum monet_gen_loss: {}'.format(history1_df['monet_gen_loss'].min()))\nprint('Minimum photo_disc_loss: {}'.format(history1_df['photo_disc_loss'].min()))\nprint('Minimum monet_head_loss1: {}'.format(history1_df['monet_head_loss1'].min()))\nprint('Minimum monet_head_loss2: {}'.format(history1_df['monet_head_loss2'].min()))","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:26:05.413255Z","iopub.execute_input":"2023-02-24T16:26:05.413628Z","iopub.status.idle":"2023-02-24T16:26:05.767807Z","shell.execute_reply.started":"2023-02-24T16:26:05.413598Z","shell.execute_reply":"2023-02-24T16:26:05.766924Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 8 epochs with lr 1e-4","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n    monet_generator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\n    photo_generator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\n\n    monet_discriminator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)\n    photo_discriminator_optimizer = tf.keras.optimizers.Adam(1e-4, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:26:30.828745Z","iopub.execute_input":"2023-02-24T16:26:30.829139Z","iopub.status.idle":"2023-02-24T16:26:30.835579Z","shell.execute_reply.started":"2023-02-24T16:26:30.829105Z","shell.execute_reply":"2023-02-24T16:26:30.834373Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n\n    cycle_gan_model.compile(\n        m_gen_optimizer = monet_generator_optimizer,\n        p_gen_optimizer = photo_generator_optimizer,\n        m_disc_optimizer = monet_discriminator_optimizer,\n        p_disc_optimizer = photo_discriminator_optimizer,\n        gen_loss_fn1 = generator_loss1,\n        gen_loss_fn2 = generator_loss2,\n        disc_loss_fn1 = discriminator_loss1,\n        disc_loss_fn2 = discriminator_loss2,\n        cycle_loss_fn = calc_cycle_loss,\n        identity_loss_fn = identity_loss,\n        aug_fn = aug_fn ,\n    )","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:26:39.556563Z","iopub.execute_input":"2023-02-24T16:26:39.556915Z","iopub.status.idle":"2023-02-24T16:26:39.571612Z","shell.execute_reply.started":"2023-02-24T16:26:39.556886Z","shell.execute_reply":"2023-02-24T16:26:39.570608Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history2=np.load('../input/save-model/Monet_pretrain/history2.npy',allow_pickle='TRUE').item()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:26:49.956755Z","iopub.execute_input":"2023-02-24T16:26:49.957130Z","iopub.status.idle":"2023-02-24T16:26:49.981501Z","shell.execute_reply.started":"2023-02-24T16:26:49.957097Z","shell.execute_reply":"2023-02-24T16:26:49.980592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history2_df = pd.DataFrame(history2)\nhistory2_df.loc[:, ['monet_gen_loss', 'photo_disc_loss', 'monet_head_loss1', 'monet_head_loss2']].plot()\nprint('Minimum monet_gen_loss: {}'.format(history2_df['monet_gen_loss'].min()))\nprint('Minimum photo_disc_loss: {}'.format(history2_df['photo_disc_loss'].min()))\nprint('Minimum monet_head_loss1: {}'.format(history2_df['monet_head_loss1'].min()))\nprint('Minimum monet_head_loss2: {}'.format(history2_df['monet_head_loss2'].min()))","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:27:03.988460Z","iopub.execute_input":"2023-02-24T16:27:03.989219Z","iopub.status.idle":"2023-02-24T16:27:04.259941Z","shell.execute_reply.started":"2023-02-24T16:27:03.989166Z","shell.execute_reply":"2023-02-24T16:27:04.258998Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 8 epochs with lr 1e-5","metadata":{}},{"cell_type":"code","source":"with strategy.scope():\n    monet_generator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)\n    photo_generator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)\n\n    monet_discriminator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)\n    photo_discriminator_optimizer = tf.keras.optimizers.Adam(1e-5, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:27:29.425067Z","iopub.execute_input":"2023-02-24T16:27:29.425430Z","iopub.status.idle":"2023-02-24T16:27:29.431953Z","shell.execute_reply.started":"2023-02-24T16:27:29.425401Z","shell.execute_reply":"2023-02-24T16:27:29.430699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with strategy.scope():\n\n    cycle_gan_model.compile(\n        m_gen_optimizer = monet_generator_optimizer,\n        p_gen_optimizer = photo_generator_optimizer,\n        m_disc_optimizer = monet_discriminator_optimizer,\n        p_disc_optimizer = photo_discriminator_optimizer,\n        gen_loss_fn1 = generator_loss1,\n        gen_loss_fn2 = generator_loss2,\n        disc_loss_fn1 = discriminator_loss1,\n        disc_loss_fn2 = discriminator_loss2,\n        cycle_loss_fn = calc_cycle_loss,\n        identity_loss_fn = identity_loss,\n        aug_fn = aug_fn ,\n    )","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:27:49.794874Z","iopub.execute_input":"2023-02-24T16:27:49.795248Z","iopub.status.idle":"2023-02-24T16:27:49.810241Z","shell.execute_reply.started":"2023-02-24T16:27:49.795215Z","shell.execute_reply":"2023-02-24T16:27:49.809253Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"monet_generator.load_weights('../input/save-model/Monet_pretrain/ckpt_monet_generator.h5')\nphoto_generator.load_weights('../input/save-model/Monet_pretrain/ckpt_photo_generator.h5')\nmonet_discriminator.load_weights('../input/save-model/Monet_pretrain/monet_discriminator.h5')\nphoto_discriminator.load_weights('../input/save-model/Monet_pretrain/photo_discriminator.h5')\ndHead1.load_weights('../input/save-model/Monet_pretrain/dHead1.h5')\ndHead2.load_weights('../input/save-model/Monet_pretrain/dHead2.h5')\nhistory3=np.load('../input/save-model/Monet_pretrain/history3.npy',allow_pickle='TRUE').item()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:28:28.330430Z","iopub.execute_input":"2023-02-24T16:28:28.330900Z","iopub.status.idle":"2023-02-24T16:28:33.012310Z","shell.execute_reply.started":"2023-02-24T16:28:28.330860Z","shell.execute_reply":"2023-02-24T16:28:33.011273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_iter = iter(photo_ds)\nfor n_sample in range(8):\n        example_sample = next(ds_iter)\n        generated_sample = monet_generator(example_sample)\n        \n        f = plt.figure(figsize=(32, 32))\n        \n        plt.subplot(121)\n        plt.title('Input image')\n        plt.imshow(example_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        \n        plt.subplot(122)\n        plt.title('Generated image')\n        plt.imshow(generated_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:28:45.688362Z","iopub.execute_input":"2023-02-24T16:28:45.688918Z","iopub.status.idle":"2023-02-24T16:28:53.715673Z","shell.execute_reply.started":"2023-02-24T16:28:45.688877Z","shell.execute_reply":"2023-02-24T16:28:53.714273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_iter = iter(monet_ds)\nfor n_sample in range(8):\n\n        example_sample = next(ds_iter)\n        generated_sample = photo_generator(example_sample)\n        \n        f = plt.figure(figsize=(24, 24))\n        \n        plt.subplot(121)\n        plt.title('Input image')\n        plt.imshow(example_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        \n        plt.subplot(122)\n        plt.title('Generated image')\n        plt.imshow(generated_sample[0] * 0.5 + 0.5)\n        plt.axis('off')\n        plt.show()","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:29:17.588373Z","iopub.execute_input":"2023-02-24T16:29:17.588958Z","iopub.status.idle":"2023-02-24T16:29:32.278543Z","shell.execute_reply.started":"2023-02-24T16:29:17.588909Z","shell.execute_reply":"2023-02-24T16:29:32.275756Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history3_df = pd.DataFrame(history3)\nhistory3_df.loc[:, ['monet_gen_loss', 'photo_gen_loss', 'total_monet_gen_loss' , 'total_photo_gen_loss' , 'monet_disc_loss', 'photo_disc_loss']].plot()\nprint('Minimum monet_gen_loss: {}'.format(history3_df['monet_gen_loss'].min()))\nprint('Minimum photo_gen_loss: {}'.format(history3_df['photo_gen_loss'].min()))\nprint('Minimum total_monet_gen_loss: {}'.format(history3_df['total_monet_gen_loss'].min()))\nprint('Minimum total_photo_gen_loss: {}'.format(history3_df['total_photo_gen_loss'].min()))\nprint('Minimum monet_disc_loss: {}'.format(history3_df['monet_disc_loss'].min()))\nprint('Minimum photo_disc_loss: {}'.format(history3_df['photo_disc_loss'].min()))","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:29:51.145799Z","iopub.execute_input":"2023-02-24T16:29:51.146190Z","iopub.status.idle":"2023-02-24T16:29:51.417062Z","shell.execute_reply.started":"2023-02-24T16:29:51.146155Z","shell.execute_reply":"2023-02-24T16:29:51.415947Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Storing","metadata":{}},{"cell_type":"code","source":"import PIL\n! mkdir ../images","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:30:40.765652Z","iopub.execute_input":"2023-02-24T16:30:40.766018Z","iopub.status.idle":"2023-02-24T16:30:41.786412Z","shell.execute_reply.started":"2023-02-24T16:30:40.765975Z","shell.execute_reply":"2023-02-24T16:30:41.785234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = 1\nfor img in photo_ds:\n    prediction = monet_generator(img, training=False)[0].numpy()\n    prediction = (prediction * 127.5 + 127.5).astype(np.uint8)\n    im = PIL.Image.fromarray(prediction)\n    im.save(\"../images/\" + str(i) + \".jpg\")\n    i += 1","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:31:22.646902Z","iopub.execute_input":"2023-02-24T16:31:22.647895Z","iopub.status.idle":"2023-02-24T16:38:06.692669Z","shell.execute_reply.started":"2023-02-24T16:31:22.647855Z","shell.execute_reply":"2023-02-24T16:38:06.691715Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import shutil\nshutil.make_archive(\"/kaggle/working/images\", 'zip', \"/kaggle/images\")","metadata":{"execution":{"iopub.status.busy":"2023-02-24T16:38:06.694460Z","iopub.execute_input":"2023-02-24T16:38:06.694790Z","iopub.status.idle":"2023-02-24T16:38:10.747731Z","shell.execute_reply.started":"2023-02-24T16:38:06.694756Z","shell.execute_reply":"2023-02-24T16:38:10.746622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}}]}