{"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":"\n! pip install git+https://github.com/tensorflow/examples.git","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:44:51.678414Z","iopub.execute_input":"2022-01-28T18:44:51.678706Z","iopub.status.idle":"2022-01-28T18:45:04.312851Z","shell.execute_reply.started":"2022-01-28T18:44:51.678672Z","shell.execute_reply":"2022-01-28T18:45:04.312002Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\n\nimport tensorflow_datasets as tfds\nfrom tensorflow_examples.models.pix2pix import pix2pix\n\nimport os\nimport time\nimport matplotlib.pyplot as plt\nfrom IPython.display import clear_output\n\nfrom PIL import Image\n\nAUTOTUNE = tf.data.AUTOTUNE\n","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.316808Z","iopub.execute_input":"2022-01-28T18:45:04.317067Z","iopub.status.idle":"2022-01-28T18:45:04.325284Z","shell.execute_reply.started":"2022-01-28T18:45:04.317032Z","shell.execute_reply":"2022-01-28T18:45:04.324565Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"MONET_FILENAMES = tf.io.gfile.glob('/kaggle/input/gan-getting-started/monet_tfrec/*.tfrec')\nprint('Monet TFRecord Files:', len(MONET_FILENAMES))\n\nPHOTO_FILENAMES = tf.io.gfile.glob('/kaggle/input/gan-getting-started/photo_tfrec/*.tfrec')\nprint('Photo TFRecord Files:', len(PHOTO_FILENAMES))\n\n","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.326265Z","iopub.execute_input":"2022-01-28T18:45:04.326509Z","iopub.status.idle":"2022-01-28T18:45:04.35534Z","shell.execute_reply.started":"2022-01-28T18:45:04.326476Z","shell.execute_reply":"2022-01-28T18:45:04.353885Z"},"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_name\": tf.io.FixedLenFeature([], tf.string),\n        \"image\": tf.io.FixedLenFeature([], tf.string),\n        \"target\": 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":"2022-01-28T18:45:04.356381Z","iopub.execute_input":"2022-01-28T18:45:04.356579Z","iopub.status.idle":"2022-01-28T18:45:04.365887Z","shell.execute_reply.started":"2022-01-28T18:45:04.356556Z","shell.execute_reply":"2022-01-28T18:45:04.365005Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_dataset(filenames, labeled=True, ordered=False):\n    dataset = tf.data.TFRecordDataset(filenames)\n    dataset = dataset.map(read_tfrecord, num_parallel_calls=AUTOTUNE)\n    return dataset","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.368873Z","iopub.execute_input":"2022-01-28T18:45:04.36917Z","iopub.status.idle":"2022-01-28T18:45:04.374936Z","shell.execute_reply.started":"2022-01-28T18:45:04.369136Z","shell.execute_reply":"2022-01-28T18:45:04.373595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"monet_ds = load_dataset(MONET_FILENAMES, labeled=True).batch(1)\nphoto_ds = load_dataset(PHOTO_FILENAMES, labeled=True).batch(1)","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.37682Z","iopub.execute_input":"2022-01-28T18:45:04.377454Z","iopub.status.idle":"2022-01-28T18:45:04.485156Z","shell.execute_reply.started":"2022-01-28T18:45:04.377421Z","shell.execute_reply":"2022-01-28T18:45:04.484476Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ************************************************************************************************************************","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.48668Z","iopub.execute_input":"2022-01-28T18:45:04.486937Z","iopub.status.idle":"2022-01-28T18:45:04.491235Z","shell.execute_reply.started":"2022-01-28T18:45:04.486905Z","shell.execute_reply":"2022-01-28T18:45:04.490549Z"},"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_name\": tf.io.FixedLenFeature([], tf.string),\n        \"image\": tf.io.FixedLenFeature([], tf.string),\n        \"target\": 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\n\ndef load_dataset(filenames, labeled=True, ordered=False):\n    dataset = tf.data.TFRecordDataset(filenames)\n    dataset = dataset.map(read_tfrecord, num_parallel_calls=AUTOTUNE)\n    return dataset","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.492344Z","iopub.execute_input":"2022-01-28T18:45:04.49281Z","iopub.status.idle":"2022-01-28T18:45:04.504502Z","shell.execute_reply.started":"2022-01-28T18:45:04.492774Z","shell.execute_reply":"2022-01-28T18:45:04.50369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BUFFER_SIZE = 1000\nBATCH_SIZE = 32\nIMG_WIDTH = 256\nIMG_HEIGHT = 256","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.505597Z","iopub.execute_input":"2022-01-28T18:45:04.50698Z","iopub.status.idle":"2022-01-28T18:45:04.51197Z","shell.execute_reply.started":"2022-01-28T18:45:04.506951Z","shell.execute_reply":"2022-01-28T18:45:04.511009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"OUTPUT_CHANNELS = 3\n\ngenerator_g = pix2pix.unet_generator(OUTPUT_CHANNELS, norm_type='instancenorm')\ngenerator_f = pix2pix.unet_generator(OUTPUT_CHANNELS, norm_type='instancenorm')\n\ndiscriminator_x = pix2pix.discriminator(norm_type='instancenorm', target=False)\ndiscriminator_y = pix2pix.discriminator(norm_type='instancenorm', target=False)","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:04.512967Z","iopub.execute_input":"2022-01-28T18:45:04.514549Z","iopub.status.idle":"2022-01-28T18:45:05.873354Z","shell.execute_reply.started":"2022-01-28T18:45:04.514516Z","shell.execute_reply":"2022-01-28T18:45:05.872658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\n#model = generator_g\n#model = discriminator_x\n\ntf.keras.utils.plot_model(\n    model,\n    to_file=\"model.png\",\n    show_shapes=False,\n    show_dtype=False,\n    show_layer_names=True,\n    rankdir=\"TB\",\n    expand_nested=False,\n    dpi=96,\n    layer_range=None,\n    show_layer_activations=False)\n\"\"\"","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:05.874429Z","iopub.execute_input":"2022-01-28T18:45:05.874662Z","iopub.status.idle":"2022-01-28T18:45:05.884283Z","shell.execute_reply.started":"2022-01-28T18:45:05.874629Z","shell.execute_reply":"2022-01-28T18:45:05.883279Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# ________________________________________________________ all losses ___________________________________________________\n\n\nLAMBDA = 10\n\nloss_obj = tf.keras.losses.BinaryCrossentropy(from_logits=True)\n\ndef discriminator_loss(real, generated):\n  real_loss = loss_obj(tf.ones_like(real), real)\n\n  generated_loss = loss_obj(tf.zeros_like(generated), generated)\n\n  total_disc_loss = real_loss + generated_loss\n\n  return total_disc_loss * 0.5\n\ndef generator_loss(generated):\n  return loss_obj(tf.ones_like(generated), generated)\n\n\n\ndef calc_cycle_loss(real_image, cycled_image):\n  loss1 = tf.reduce_mean(tf.abs(real_image - cycled_image))\n\n  return LAMBDA * loss1\n\n\n\ndef identity_loss(real_image, same_image):\n  loss = tf.reduce_mean(tf.abs(real_image - same_image))\n  return LAMBDA * 0.5 * loss","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:05.885608Z","iopub.execute_input":"2022-01-28T18:45:05.8861Z","iopub.status.idle":"2022-01-28T18:45:05.89493Z","shell.execute_reply.started":"2022-01-28T18:45:05.886064Z","shell.execute_reply":"2022-01-28T18:45:05.89429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator_g_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\ngenerator_f_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n\ndiscriminator_x_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\ndiscriminator_y_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:05.896323Z","iopub.execute_input":"2022-01-28T18:45:05.896633Z","iopub.status.idle":"2022-01-28T18:45:05.916475Z","shell.execute_reply.started":"2022-01-28T18:45:05.896544Z","shell.execute_reply":"2022-01-28T18:45:05.915881Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\"\"\"\ncheckpoint_path = \"./checkpoints/train\"\n\nckpt = tf.train.Checkpoint(generator_g=generator_g,\n                           generator_f=generator_f,\n                           discriminator_x=discriminator_x,\n                           discriminator_y=discriminator_y,\n                           generator_g_optimizer=generator_g_optimizer,\n                           generator_f_optimizer=generator_f_optimizer,\n                           discriminator_x_optimizer=discriminator_x_optimizer,\n                           discriminator_y_optimizer=discriminator_y_optimizer)\n\nckpt_manager = tf.train.CheckpointManager(ckpt, checkpoint_path, max_to_keep=5)\n\n# if a checkpoint exists, restore the latest checkpoint.\nif ckpt_manager.latest_checkpoint:\n  ckpt.restore(ckpt_manager.latest_checkpoint)\n  print ('Latest checkpoint restored!!')\n\"\"\"","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:05.919448Z","iopub.execute_input":"2022-01-28T18:45:05.919825Z","iopub.status.idle":"2022-01-28T18:45:05.92632Z","shell.execute_reply.started":"2022-01-28T18:45:05.919791Z","shell.execute_reply":"2022-01-28T18:45:05.92549Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_images(model, test_input):\n\n  prediction = model(test_input)\n  prediction = prediction[-1,:,:,:]\n  #prediction = tf.make_ndarray(prediction)\n  prediction = tf.keras.utils.array_to_img(prediction)\n  \n  return prediction\n    \n\"\"\"\n  plt.figure(figsize=(12, 12))\n\n  display_list = [test_input[-1,:,:,:]*0.5+0.5, prediction]\n\n  title = ['Input Image', 'Predicted Image']\n\n  for i in range(2):\n    plt.subplot(1, 2, i+1)\n    plt.title(title[i])\n    # getting the pixel values between [0, 1] to plot it.\n    plt.imshow(display_list[i]  )\n    plt.axis('off')\n  plt.show()\n\n\"\"\"  ","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:05.927991Z","iopub.execute_input":"2022-01-28T18:45:05.928521Z","iopub.status.idle":"2022-01-28T18:45:05.937165Z","shell.execute_reply.started":"2022-01-28T18:45:05.928481Z","shell.execute_reply":"2022-01-28T18:45:05.936333Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@tf.function\ndef train_step(real_x, real_y):\n\n  # persistent is set to True because the tape is used more than once to calculate the gradients.\n  \n  with tf.GradientTape(persistent=True) as tape:\n    \n    # Generator G translates X -> Y\n    # Generator F translates Y -> X.\n\n    fake_y = generator_g(real_x, training=True)\n    cycled_x = generator_f(fake_y, training=True)\n\n    fake_x = generator_f(real_y, training=True)\n    cycled_y = generator_g(fake_x, training=True)\n\n    # same_x and same_y are used for identity loss.\n    same_x = generator_f(real_x, training=True)\n    same_y = generator_g(real_y, training=True)\n\n    disc_real_x = discriminator_x(real_x, training=True)\n    disc_real_y = discriminator_y(real_y, training=True)\n\n    disc_fake_x = discriminator_x(fake_x, training=True)\n    disc_fake_y = discriminator_y(fake_y, training=True)\n\n\n    # calculate the loss\n    gen_g_loss = generator_loss(disc_fake_y)\n    gen_f_loss = generator_loss(disc_fake_x)\n\n    total_cycle_loss = calc_cycle_loss(real_x, cycled_x) + calc_cycle_loss(real_y, cycled_y)\n\n    # Total generator loss = adversarial loss + cycle loss\n    total_gen_g_loss = gen_g_loss + total_cycle_loss + identity_loss(real_y, same_y)\n    total_gen_f_loss = gen_f_loss + total_cycle_loss + identity_loss(real_x, same_x)\n\n    disc_x_loss = discriminator_loss(disc_real_x, disc_fake_x)\n    disc_y_loss = discriminator_loss(disc_real_y, disc_fake_y)\n\n\n  # Calculate the gradients for generator and discriminator\n  generator_g_gradients = tape.gradient(total_gen_g_loss, generator_g.trainable_variables)\n  generator_f_gradients = tape.gradient(total_gen_f_loss, generator_f.trainable_variables)\n\n  discriminator_x_gradients = tape.gradient(disc_x_loss, discriminator_x.trainable_variables)\n  discriminator_y_gradients = tape.gradient(disc_y_loss, discriminator_y.trainable_variables)\n\n  # Apply the gradients to the optimizer\n  generator_g_optimizer.apply_gradients(zip(generator_g_gradients, generator_g.trainable_variables))\n\n  generator_f_optimizer.apply_gradients(zip(generator_f_gradients, generator_f.trainable_variables))\n\n  discriminator_x_optimizer.apply_gradients(zip(discriminator_x_gradients, discriminator_x.trainable_variables))\n\n  discriminator_y_optimizer.apply_gradients(zip(discriminator_y_gradients, discriminator_y.trainable_variables))\n  \n","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:05.938873Z","iopub.execute_input":"2022-01-28T18:45:05.939346Z","iopub.status.idle":"2022-01-28T18:45:06.604896Z","shell.execute_reply.started":"2022-01-28T18:45:05.93931Z","shell.execute_reply":"2022-01-28T18:45:06.603834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EPOCHS = 265\n\nfor epoch in range(EPOCHS):\n  start = time.time()\n\n  n = 0\n  for image_x, image_y in tf.data.Dataset.zip((photo_ds, monet_ds)):\n\n    train_step(image_x, image_y )\n\n    if n % 10 == 0:\n      print ('.', end='')\n    n += 1\n\n  #clear_output(wait=True)\n\n  #if (epoch + 1) % 5 == 0:\n    #ckpt_save_path = ckpt_manager.save()\n    #print ('Saving checkpoint for epoch {} at {}'.format(epoch+1, ckpt_save_path))\n\n  print ('Time taken for epoch {} is {} sec\\n'.format(epoch + 1, time.time()-start))\n","metadata":{"execution":{"iopub.status.busy":"2022-01-28T18:45:06.608264Z","iopub.execute_input":"2022-01-28T18:45:06.608688Z","iopub.status.idle":"2022-01-28T19:41:21.42855Z","shell.execute_reply.started":"2022-01-28T18:45:06.608649Z","shell.execute_reply":"2022-01-28T19:41:21.427749Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if not os.path.exists(\"/kaggle/images\"):\n    os.makedirs(\"/kaggle/images\")\nelse:\n    print(\"Directory exists\")\n    \n#os.listdir('/kaggle/images')\n\n","metadata":{"execution":{"iopub.status.busy":"2022-01-28T19:41:21.43141Z","iopub.execute_input":"2022-01-28T19:41:21.431953Z","iopub.status.idle":"2022-01-28T19:41:21.436869Z","shell.execute_reply.started":"2022-01-28T19:41:21.431914Z","shell.execute_reply":"2022-01-28T19:41:21.436176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Run the trained model on the dataset\n\ni=0\nfor inp in photo_ds:\n  i=i+1\n  img = generate_images(generator_g, inp)\n  \n  name = '/kaggle/images/'+str(i)+\".jpg\"\n  img = tf.keras.utils.array_to_img(img)\n  img.save(name)\n\n  #if i == 7002:\n    #break","metadata":{"execution":{"iopub.status.busy":"2022-01-28T19:41:21.43857Z","iopub.execute_input":"2022-01-28T19:41:21.439204Z","iopub.status.idle":"2022-01-28T19:45:43.371845Z","shell.execute_reply.started":"2022-01-28T19:41:21.439168Z","shell.execute_reply":"2022-01-28T19:45:43.371074Z"},"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":"2022-01-28T19:45:43.373581Z","iopub.execute_input":"2022-01-28T19:45:43.374302Z","iopub.status.idle":"2022-01-28T19:45:46.972854Z","shell.execute_reply.started":"2022-01-28T19:45:43.374258Z","shell.execute_reply":"2022-01-28T19:45:46.972188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#os.remove(\"/kaggle/working/images.zip\")","metadata":{"execution":{"iopub.status.busy":"2022-01-28T19:45:46.974062Z","iopub.execute_input":"2022-01-28T19:45:46.974383Z","iopub.status.idle":"2022-01-28T19:45:46.982697Z","shell.execute_reply.started":"2022-01-28T19:45:46.974345Z","shell.execute_reply":"2022-01-28T19:45:46.980811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n#s.listdir('/kaggle/working')","metadata":{"execution":{"iopub.status.busy":"2022-01-28T19:45:46.98658Z","iopub.execute_input":"2022-01-28T19:45:46.988004Z","iopub.status.idle":"2022-01-28T19:45:46.999566Z","shell.execute_reply.started":"2022-01-28T19:45:46.987965Z","shell.execute_reply":"2022-01-28T19:45:46.998704Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nimport shutil\n#shutil.rmtree(\"/kaggle/working/images\")","metadata":{"execution":{"iopub.status.busy":"2022-01-28T19:45:47.000884Z","iopub.execute_input":"2022-01-28T19:45:47.001143Z","iopub.status.idle":"2022-01-28T19:45:47.008717Z","shell.execute_reply.started":"2022-01-28T19:45:47.001109Z","shell.execute_reply":"2022-01-28T19:45:47.007917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#os.remove(\"/kaggle/working/images.zip\")\n#os.remove(\"/kaggle/images.zip\")","metadata":{"execution":{"iopub.status.busy":"2022-01-28T19:45:47.010706Z","iopub.execute_input":"2022-01-28T19:45:47.011548Z","iopub.status.idle":"2022-01-28T19:45:47.015572Z","shell.execute_reply.started":"2022-01-28T19:45:47.0115Z","shell.execute_reply":"2022-01-28T19:45:47.01462Z"},"trusted":true},"execution_count":null,"outputs":[]}]}