{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":21755,"databundleVersionId":1475600,"sourceType":"competition"},{"sourceId":3044378,"sourceType":"datasetVersion","datasetId":1864422}],"dockerImageVersionId":30154,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os \nimport tensorflow_addons as tfa\n\n# 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)\n# except:\n#     strategy = tf.distribute.get_strategy()\n# print('Number of replicas:', strategy.num_replicas_in_sync)\nAUTOTUNE = tf.data.experimental.AUTOTUNE","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:16:46.884363Z","iopub.execute_input":"2025-10-10T02:16:46.884658Z","iopub.status.idle":"2025-10-10T02:16:52.002158Z","shell.execute_reply.started":"2025-10-10T02:16:46.884569Z","shell.execute_reply":"2025-10-10T02:16:52.001544Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"MONET_FILENAMES = tf.io.gfile.glob('../input/gan-getting-started/monet_tfrec/*.tfrec')\nprint('Monet TFRecord Files:', len(MONET_FILENAMES))\nPHOTO_FILENAMES = tf.io.gfile.glob(str('../input/gan-getting-started/photo_tfrec/*.tfrec'))\nprint('Photo TFRecord Files:', len(PHOTO_FILENAMES))","metadata":{"execution":{"iopub.status.busy":"2025-10-09T03:17:35.620110Z","iopub.execute_input":"2025-10-09T03:17:35.620403Z","iopub.status.idle":"2025-10-09T03:17:35.660321Z","shell.execute_reply.started":"2025-10-09T03:17:35.620372Z","shell.execute_reply":"2025-10-09T03:17:35.659496Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"im_size=[256,256]\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, [*im_size, 3])\n    return image\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":"2025-10-09T03:17:37.798789Z","iopub.execute_input":"2025-10-09T03:17:37.799069Z","iopub.status.idle":"2025-10-09T03:17:37.806463Z","shell.execute_reply.started":"2025-10-09T03:17:37.799040Z","shell.execute_reply":"2025-10-09T03:17:37.805523Z"},"trusted":true},"outputs":[],"execution_count":null},{"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":"2025-10-09T03:17:40.290199Z","iopub.execute_input":"2025-10-09T03:17:40.290461Z","iopub.status.idle":"2025-10-09T03:17:40.294612Z","shell.execute_reply.started":"2025-10-09T03:17:40.290431Z","shell.execute_reply":"2025-10-09T03:17:40.293856Z"},"trusted":true},"outputs":[],"execution_count":null},{"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":"2025-10-09T03:17:41.656955Z","iopub.execute_input":"2025-10-09T03:17:41.657231Z","iopub.status.idle":"2025-10-09T03:17:44.535717Z","shell.execute_reply.started":"2025-10-09T03:17:41.657200Z","shell.execute_reply":"2025-10-09T03:17:44.535041Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"imit = list(iter(monet_ds))\npimit = list(iter(photo_ds))\n","metadata":{"execution":{"iopub.status.busy":"2025-10-09T03:17:44.537110Z","iopub.execute_input":"2025-10-09T03:17:44.537313Z","iopub.status.idle":"2025-10-09T03:17:58.139733Z","shell.execute_reply.started":"2025-10-09T03:17:44.537288Z","shell.execute_reply":"2025-10-09T03:17:58.139001Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"im = imit[10]\npim = pimit[10]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T03:17:58.140863Z","iopub.execute_input":"2025-10-09T03:17:58.141083Z","iopub.status.idle":"2025-10-09T03:17:58.146096Z","shell.execute_reply.started":"2025-10-09T03:17:58.141057Z","shell.execute_reply":"2025-10-09T03:17:58.145426Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10,5))\nplt.subplot(1,2,1)\nplt.imshow(pim[0]*0.5+0.5)\n\n\nplt.subplot(1,2,2)\nplt.imshow(im[0]*0.5+0.5)","metadata":{"execution":{"iopub.status.busy":"2025-10-09T03:17:58.147833Z","iopub.execute_input":"2025-10-09T03:17:58.148386Z","iopub.status.idle":"2025-10-09T03:17:58.652957Z","shell.execute_reply.started":"2025-10-09T03:17:58.148347Z","shell.execute_reply":"2025-10-09T03:17:58.652224Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"try_pic = pim\ntry_drw = im","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T03:17:58.654081Z","iopub.execute_input":"2025-10-09T03:17:58.654348Z","iopub.status.idle":"2025-10-09T03:17:58.658506Z","shell.execute_reply.started":"2025-10-09T03:17:58.654310Z","shell.execute_reply":"2025-10-09T03:17:58.657750Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"try_pic.shape","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T03:17:58.659659Z","iopub.execute_input":"2025-10-09T03:17:58.659944Z","iopub.status.idle":"2025-10-09T03:17:58.674965Z","shell.execute_reply.started":"2025-10-09T03:17:58.659909Z","shell.execute_reply":"2025-10-09T03:17:58.674240Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def conv_blk(filters,k_size,strd,inp,norm = True):\n    x = layers.Conv2D(filters,k_size, strides=strd,padding='same',kernel_initializer = tf.random_normal_initializer(0., 0.02),use_bias=True)(inp)\n    if norm:\n        x = layers.BatchNormalization()(x)\n    x = layers.ReLU()(x)\n    return x\n\ndef rev_conv(chnl,k_size, inp):\n    x = layers.Conv2DTranspose(chnl,k_size,strides = 2,padding='same',kernel_initializer = tf.random_normal_initializer(0., 0.02),use_bias=True)(inp)\n    x = layers.LayerNormalization(axis=-1)(x)\n    x = layers.ReLU(max_value=6)(x)\n    return x","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:18:19.770196Z","iopub.execute_input":"2025-10-10T02:18:19.770899Z","iopub.status.idle":"2025-10-10T02:18:19.776582Z","shell.execute_reply.started":"2025-10-10T02:18:19.770867Z","shell.execute_reply":"2025-10-10T02:18:19.775852Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def Gen():\n    im_input= layers.Input(shape=[256,256,3])\n    extractor = [32,64,128,256,256,512,512,512]\n    skips = []\n    x = im_input\n    first_ly = True\n    for ly in extractor:\n        if first_ly:\n            x = conv_blk(ly,4,2,x,norm = False)\n        else:\n            x = conv_blk(ly,4,2,x)\n        skips.append(x)\n    skips = reversed(skips[:-1])\n    \n    constructor = [512,512,256,256,128,64,32]\n    for ly,s in zip(constructor,skips):\n        x = rev_conv(ly,4,x)\n        x = layers.Concatenate()([x,s])\n    out = layers.Conv2DTranspose(3,4,strides=2,padding='same',activation='tanh')(x)\n    return tf.keras.Model(inputs=im_input, outputs=out, name=\"Generator\")\n\ndef myGen():\n    im_input= layers.Input(shape=[256,256,3])\n    c = layers.Conv2D(32,1,strides = 1,padding = 'same',activation = tf.nn.leaky_relu,bias_initializer=tf.keras.initializers.constant(0.0))(im_input)\n    x = layers.Conv2D(32,7, strides=1,padding='same',activation=tf.nn.leaky_relu,bias_initializer=tf.keras.initializers.constant(0.0))(im_input)\n    x = layers.Conv2D(64,3, strides=2,padding='same',activation=tf.nn.leaky_relu,bias_initializer=tf.keras.initializers.constant(0.0))(x)\n    x = layers.Conv2D(128,3, strides=2,padding='same',activation=tf.nn.leaky_relu,bias_initializer=tf.keras.initializers.constant(0.0))(x)\n    v = x\n    for ly in range(5):\n        x = conv_blk(128,3,1,x)\n        x = layers.Add()([x,v])\n        v = x\n\n    x = rev_conv(64,4,x)\n    x = rev_conv(32,4,x)\n    x = layers.Add()([x,c])\n    out = layers.Conv2D(3,3,strides=1,padding='same',activation='tanh')(x)\n    return tf.keras.Model(inputs=im_input, outputs=out, name=\"Generator\")\n\n\ndef Judge():\n    im_input= layers.Input(shape=[256,256,3])\n    x = conv_blk(32,6,2,im_input,norm=False)\n    v = x\n    x = conv_blk(32,3,1,x)\n    x = layers.Concatenate()([x,v])\n    x = conv_blk(64,3,2,x)\n    v = x\n    x = conv_blk(64,3,1,x)\n    x = layers.Concatenate()([x,v])\n    x = conv_blk(128,3,2,x)\n    x = conv_blk(256,3,2,x)\n    out = layers.Conv2D(1,3,1,padding='same',kernel_initializer = tf.random_normal_initializer(0., 0.02),bias_initializer=tf.keras.initializers.constant(0.0))(x)\n    return tf.keras.Model(inputs=im_input,outputs=out,name='Judge')\n\n\n","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:20:25.292681Z","iopub.execute_input":"2025-10-10T02:20:25.293222Z","iopub.status.idle":"2025-10-10T02:20:25.307787Z","shell.execute_reply.started":"2025-10-10T02:20:25.293185Z","shell.execute_reply":"2025-10-10T02:20:25.307137Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# import tensorflow as tf\n# from tensorflow.keras import layers, Model\n\n# def u_conv_block(x, filters, kernel_size=3, batch_norm=True, dropout=0.0):\n#     x = layers.Conv2D(filters, kernel_size, padding=\"same\", kernel_initializer=\"he_normal\")(x)\n#     if batch_norm:\n#         x = layers.BatchNormalization()(x)\n#     x = layers.Activation(\"relu\")(x)\n    \n#     x = layers.Conv2D(filters, kernel_size, padding=\"same\", kernel_initializer=\"he_normal\")(x)\n#     if batch_norm:\n#         x = layers.BatchNormalization()(x)\n#     x = layers.Activation(\"relu\")(x)\n    \n#     if dropout and dropout > 0.0:\n#         x = layers.Dropout(dropout)(x)\n#     return x\n\n# def u_encoder_block(x, filters, pool_size=(2,2), **kwargs):\n#     c = u_conv_block(x, filters, **kwargs)\n#     p = layers.MaxPooling2D(pool_size)(c)\n#     return c, p\n\n# def u_decoder_block(x, skip, filters, kernel_size=3, upsample_mode=\"transpose\", batch_norm=True):\n#     if upsample_mode == \"transpose\":\n#         x = layers.Conv2DTranspose(filters, kernel_size=2, strides=2, padding=\"same\")(x)\n#     else:\n#         x = layers.UpSampling2D(size=(2,2))(x)\n#         x = layers.Conv2D(filters, kernel_size=1, padding=\"same\")(x)\n    \n#     # concat skip connection\n#     x = layers.Concatenate()([x, skip])\n#     x = u_conv_block(x, filters, kernel_size=kernel_size, batch_norm=batch_norm)\n#     return x\n\n# def build_unet(input_shape=(256,256,3),\n#                base_filters=64,\n#                depth=4,\n#                dropout=0.0,\n#                batch_norm=True,\n#                upsample_mode=\"transpose\"):\n#     \"\"\"\n#     lalalal\n#     \"\"\"\n#     inputs = layers.Input(shape=input_shape)\n#     x = inputs\n    \n#     # Encoder\n#     skips = []\n#     filters = base_filters\n#     for d in range(depth):\n#         c, x = u_encoder_block(x, filters, batch_norm=batch_norm, dropout=dropout)\n#         skips.append(c)\n#         filters *= 2\n    \n#     # Bottleneck\n#     x = u_conv_block(x, filters, batch_norm=batch_norm, dropout=dropout)\n    \n#     # Decoder (reverse skips)\n#     for d in reversed(range(depth)):\n#         filters //= 2\n#         x = u_decoder_block(x, skips[d], filters, batch_norm=batch_norm, upsample_mode=upsample_mode)\n    \n#     # Output\n#     outputs = layers.Conv2D(3, (1,1), padding=\"same\", activation='tanh')(x)\n    \n#     model = Model(inputs, outputs, name=\"U-Net\")\n#     return model\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-10T02:17:58.628494Z","iopub.execute_input":"2025-10-10T02:17:58.628750Z","iopub.status.idle":"2025-10-10T02:17:58.640581Z","shell.execute_reply.started":"2025-10-10T02:17:58.628721Z","shell.execute_reply":"2025-10-10T02:17:58.639871Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras import layers, Model\n\ndef u_conv_block(x, filters, kernel_size=3, batch_norm=True, dropout=0.0):\n    x = layers.Conv2D(filters, kernel_size, padding=\"same\", kernel_initializer=\"he_normal\")(x)\n    if batch_norm:\n        x = layers.BatchNormalization()(x)\n    x = layers.Activation(\"relu\")(x)\n    \n    x = layers.Conv2D(filters, kernel_size, padding=\"same\", kernel_initializer=\"he_normal\")(x)\n    if batch_norm:\n        x = layers.BatchNormalization()(x)\n    x = layers.Activation(\"relu\")(x)\n    \n    if dropout and dropout > 0.0:\n        x = layers.Dropout(dropout)(x)\n    return x\n\ndef u_encoder_block(x, filters, pool_size=(2,2), **kwargs):\n    c = u_conv_block(x, filters, **kwargs)\n    p = layers.MaxPooling2D(pool_size)(c)\n    return c, p\n\ndef u_decoder_block(x, skip, filters, kernel_size=3, upsample_mode=\"transpose\", batch_norm=True):\n    if upsample_mode == \"transpose\":\n        x = layers.Conv2DTranspose(filters, kernel_size=2, strides=2, padding=\"same\")(x)\n    else:\n        x = layers.UpSampling2D(size=(2,2))(x)\n        x = layers.Conv2D(filters, kernel_size=1, padding=\"same\")(x)\n    \n    # concat skip connection\n    x = layers.Concatenate()([x, skip])\n    x = u_conv_block(x, filters, kernel_size=kernel_size, batch_norm=batch_norm)\n    return x\n\n# --- 🔍 NEW ATTENTION BLOCK ---\ndef attention_block(x, num_heads=8):\n    \"\"\"Applies Multi-Head Self-Attention to spatial features.\"\"\"\n    b, h, w, c = x.shape\n    x_flat = layers.Reshape((h * w, c))(x)   # flatten spatial dims -> tokens\n    attn_output = layers.MultiHeadAttention(num_heads=num_heads, key_dim=c // num_heads)(x_flat, x_flat)\n    x_out = layers.Add()([x_flat, attn_output])  # residual connection\n    x_out = layers.LayerNormalization()(x_out)\n    x_out = layers.Reshape((h, w, c))(x_out)     # back to image grid\n    return x_out\n\n# --- 🧠 Modified U-Net ---\ndef build_unet_with_attention(input_shape=(256,256,3),\n                              base_filters=64,\n                              depth=4,\n                              dropout=0.0,\n                              batch_norm=True,\n                              upsample_mode=\"transpose\",\n                              num_heads=8):\n    \n    inputs = layers.Input(shape=input_shape)\n    x = inputs\n    \n    # Encoder\n    skips = []\n    filters = base_filters\n    for d in range(depth):\n        c, x = u_encoder_block(x, filters, batch_norm=batch_norm, dropout=dropout)\n        skips.append(c)\n        filters *= 2\n    \n    # Bottleneck + 🔥 Multi-Head Attention\n    x = u_conv_block(x, filters, batch_norm=batch_norm, dropout=dropout)\n    x = attention_block(x, num_heads=num_heads)\n    \n    # Decoder (reverse skips)\n    for d in reversed(range(depth)):\n        filters //= 2\n        x = u_decoder_block(x, skips[d], filters, batch_norm=batch_norm, upsample_mode=upsample_mode)\n    \n    # Output\n    outputs = layers.Conv2D(3, (1,1), padding=\"same\", activation='tanh')(x)\n    \n    model = Model(inputs, outputs, name=\"U-Net-Attention\")\n    return model\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CycleGan(keras.Model):\n    def __init__(self,monet_gen,photo_gen,monet_judge,photo_judge,lambda_cycle=8):\n        super(CycleGan, self).__init__()\n        self.m_gen = monet_gen\n        self.p_gen = photo_gen\n        self.m_judge = monet_judge\n        self.p_judge = photo_judge\n        self.lambda_cycle = lambda_cycle\n    \n    def compile(self,m_gen_opt,p_gen_opt,m_jg_opt,p_jg_opt,gen_loss_fn,judge_loss_fn,cycle_loss_fn,identitty_loss_fn):\n        super(CycleGan,self).compile()\n        self.m_gen_optimizer = m_gen_opt\n        self.p_gen_optimizer = p_gen_opt\n        self.m_judge_optimizer = m_jg_opt\n        self.p_judge_optimizer = p_jg_opt\n        self.gen_loss_fn = gen_loss_fn\n        self.judge_loss_fn = judge_loss_fn\n        self.cycle_loss_fn = cycle_loss_fn\n        self.id_loss_fn = identitty_loss_fn\n    \n    def train_step(self,batch_data):\n        real_monet, real_photo = batch_data\n        with tf.GradientTape(persistent=True) as tape:\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_monet = self.m_gen(real_monet, training=True)\n            same_photo = self.p_gen(real_photo, training=True)\n\n            # discriminator used to check, inputing real images\n            disc_real_monet = self.m_judge(real_monet, training=True)\n            disc_real_photo = self.p_judge(real_photo, training=True)\n\n            # discriminator used to check, inputing fake images\n            disc_fake_monet = self.m_judge(fake_monet, training=True)\n            disc_fake_photo = self.p_judge(fake_photo, training=True)\n\n            # evaluates generator loss\n            monet_gen_loss = self.gen_loss_fn(disc_fake_monet)\n            photo_gen_loss = self.gen_loss_fn(disc_fake_photo)\n\n            # evaluates total cycle consistency loss\n            total_cycle_loss = self.cycle_loss_fn(real_monet, cycled_monet, self.lambda_cycle) + self.cycle_loss_fn(real_photo, cycled_photo, self.lambda_cycle)\n\n            # evaluates total generator loss\n            total_monet_gen_loss = monet_gen_loss + total_cycle_loss + self.id_loss_fn(real_monet, same_monet, self.lambda_cycle)\n            total_photo_gen_loss = photo_gen_loss + total_cycle_loss + self.id_loss_fn(real_photo, same_photo, self.lambda_cycle)\n\n            # evaluates discriminator loss\n            monet_disc_loss = self.judge_loss_fn(disc_real_monet, disc_fake_monet)\n            photo_disc_loss = self.judge_loss_fn(disc_real_photo, disc_fake_photo)\n\n        # Calculate the gradients for generator and discriminator\n        monet_generator_gradients = tape.gradient(total_monet_gen_loss,\n                                                  self.m_gen.trainable_variables)\n        photo_generator_gradients = tape.gradient(total_photo_gen_loss,\n                                                  self.p_gen.trainable_variables)\n\n        monet_discriminator_gradients = tape.gradient(monet_disc_loss,\n                                                      self.m_judge.trainable_variables)\n        photo_discriminator_gradients = tape.gradient(photo_disc_loss,\n                                                      self.p_judge.trainable_variables)\n\n        # Apply the gradients to the optimizer\n        self.m_gen_optimizer.apply_gradients(zip(monet_generator_gradients,\n                                                 self.m_gen.trainable_variables))\n\n        self.p_gen_optimizer.apply_gradients(zip(photo_generator_gradients,\n                                                 self.p_gen.trainable_variables))\n\n        self.m_judge_optimizer.apply_gradients(zip(monet_discriminator_gradients,\n                                                  self.m_judge.trainable_variables))\n\n        self.p_judge_optimizer.apply_gradients(zip(photo_discriminator_gradients,\n                                                  self.p_judge.trainable_variables))\n        \n        \n        return {\n            \"monet_gen_loss\": total_monet_gen_loss,\n            \"photo_gen_loss\": total_photo_gen_loss,\n            \"monet_disc_loss\": monet_disc_loss,\n            \"photo_disc_loss\": photo_disc_loss\n        }\n","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:17:58.861027Z","iopub.execute_input":"2025-10-10T02:17:58.861245Z","iopub.status.idle":"2025-10-10T02:17:58.873373Z","shell.execute_reply.started":"2025-10-10T02:17:58.861221Z","shell.execute_reply":"2025-10-10T02:17:58.872612Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef discriminator_loss(real, generated):\n    real_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)(tf.ones_like(real), real)\n\n    generated_loss = tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)(tf.zeros_like(generated), generated)\n\n    total_disc_loss = real_loss + generated_loss\n\n    return total_disc_loss * 1.2\n\ndef generator_loss(generated):\n    return tf.keras.losses.BinaryCrossentropy(from_logits=True, reduction=tf.keras.losses.Reduction.NONE)(tf.ones_like(generated), generated)\n\ndef calc_cycle_loss(real_image, cycled_image, LAMBDA):\n    loss1 = tf.reduce_mean(tf.abs(real_image - cycled_image))\n    return LAMBDA * loss1\n\ndef identity_loss(real_image, same_image, LAMBDA):\n    loss = tf.reduce_mean(tf.abs(real_image - same_image))\n    return LAMBDA * 0.5 * loss\n","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:18:03.629494Z","iopub.execute_input":"2025-10-10T02:18:03.629756Z","iopub.status.idle":"2025-10-10T02:18:03.636516Z","shell.execute_reply.started":"2025-10-10T02:18:03.629725Z","shell.execute_reply":"2025-10-10T02:18:03.635699Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nmonet_generator_optimizer = tf.keras.optimizers.Adam(0.001, beta_1=0.5)\nphoto_generator_optimizer = tf.keras.optimizers.Adam(0.001, beta_1=0.5)\n\nmonet_discriminator_optimizer = tf.keras.optimizers.Adam(0.001, beta_1=0.5)\nphoto_discriminator_optimizer = tf.keras.optimizers.Adam(0.001, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:18:06.144750Z","iopub.execute_input":"2025-10-10T02:18:06.145591Z","iopub.status.idle":"2025-10-10T02:18:06.156862Z","shell.execute_reply.started":"2025-10-10T02:18:06.145552Z","shell.execute_reply":"2025-10-10T02:18:06.156079Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#with strategy.scope():\n#    monet_generator_optimizer = tf.keras.optimizers.RMSprop(2e-4,momentum=0.9)\n#    photo_generator_optimizer = tf.keras.optimizers.RMSprop(2e-4,momentum=0.9)\n\n#    monet_discriminator_optimizer = tf.keras.optimizers.RMSprop(2e-4,momentum=0.9)\n#    photo_discriminator_optimizer = tf.keras.optimizers.RMSprop(2e-4,momentum=0.9)","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:18:06.326442Z","iopub.execute_input":"2025-10-10T02:18:06.326644Z","iopub.status.idle":"2025-10-10T02:18:06.329951Z","shell.execute_reply.started":"2025-10-10T02:18:06.326619Z","shell.execute_reply":"2025-10-10T02:18:06.329342Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nmonet_generator = build_unet_with_attention(input_shape=(256,256,3),\n                   base_filters=32,\n                   depth=4,\n                   dropout=0.1,\n                   batch_norm=True,\n                   upsample_mode=\"transpose\") # transforms photos to Monet-esque paintings\nphoto_generator = build_unet_with_attention(input_shape=(256,256,3),\n                   base_filters=32,\n                   depth=4,\n                   dropout=0.1,\n                   batch_norm=True,\n                   upsample_mode=\"transpose\") # transforms Monet paintings to be more like photos#\n\n#monet_generator = myGen() # transforms photos to Monet-esque paintings\n#photo_generator = myGen() # transforms Monet paintings to be more like photos#\n\n#monet_generator = Gen() # transforms photos to Monet-esque paintings\n#photo_generator = Gen() # transforms Monet paintings to be more like photos\n\nmonet_discriminator = Judge() # differentiates real Monet paintings and generated Monet paintings\nphoto_discriminator = Judge() # differentiates real photos and generated photos","metadata":{"execution":{"iopub.status.busy":"2025-10-10T02:20:29.046938Z","iopub.execute_input":"2025-10-10T02:20:29.047584Z","iopub.status.idle":"2025-10-10T02:20:30.081240Z","shell.execute_reply.started":"2025-10-10T02:20:29.047548Z","shell.execute_reply":"2025-10-10T02:20:30.080476Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pred_pim = monet_generator.predict(pim)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T03:20:49.386327Z","iopub.execute_input":"2025-10-09T03:20:49.386605Z","iopub.status.idle":"2025-10-09T03:20:49.442079Z","shell.execute_reply.started":"2025-10-09T03:20:49.386576Z","shell.execute_reply":"2025-10-09T03:20:49.441361Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(10,5))\nplt.subplot(1,2,1)\nplt.imshow(pred_pim[0])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T03:21:38.344157Z","iopub.execute_input":"2025-10-09T03:21:38.344441Z","iopub.status.idle":"2025-10-09T03:21:38.634920Z","shell.execute_reply.started":"2025-10-09T03:21:38.344412Z","shell.execute_reply":"2025-10-09T03:21:38.634019Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"tf.keras.utils.plot_model(monet_generator, show_shapes=True, dpi=64)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-09T03:19:28.730448Z","iopub.execute_input":"2025-10-09T03:19:28.731190Z","iopub.status.idle":"2025-10-09T03:19:30.191141Z","shell.execute_reply.started":"2025-10-09T03:19:28.731151Z","shell.execute_reply":"2025-10-09T03:19:30.190251Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def lr_sch(epoch,lr):\n    if epoch < 10:\n        if epoch % 3 == 0:\n            lr = 0.001\n        else:\n            lr = 0.001\n    else:\n        if epoch % 3 == 0:\n            lr = 0.0007\n        else:\n            lr = 0.0001\n    #print(lr)\n    \n    return lr\ncallback = tf.keras.callbacks.LearningRateScheduler(lr_sch)","metadata":{"execution":{"iopub.status.busy":"2025-10-09T03:19:38.031057Z","iopub.execute_input":"2025-10-09T03:19:38.031343Z","iopub.status.idle":"2025-10-09T03:19:38.037429Z","shell.execute_reply.started":"2025-10-09T03:19:38.031312Z","shell.execute_reply":"2025-10-09T03:19:38.036544Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ncycle_gan_model = CycleGan(\n    monet_generator, photo_generator, monet_discriminator, photo_discriminator\n)","metadata":{"execution":{"iopub.status.busy":"2025-10-09T03:19:41.106054Z","iopub.execute_input":"2025-10-09T03:19:41.106355Z","iopub.status.idle":"2025-10-09T03:19:41.118248Z","shell.execute_reply.started":"2025-10-09T03:19:41.106321Z","shell.execute_reply":"2025-10-09T03:19:41.117524Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"cycle_gan_model.compile(\n            m_gen_opt = monet_generator_optimizer,\n            p_gen_opt = photo_generator_optimizer,\n            m_jg_opt = monet_discriminator_optimizer,\n            p_jg_opt = photo_discriminator_optimizer,\n            gen_loss_fn = generator_loss,\n            judge_loss_fn = discriminator_loss,\n            cycle_loss_fn = calc_cycle_loss,\n            identitty_loss_fn = identity_loss\n        )","metadata":{"execution":{"iopub.status.busy":"2025-10-09T03:19:45.905367Z","iopub.execute_input":"2025-10-09T03:19:45.905667Z","iopub.status.idle":"2025-10-09T03:19:45.927294Z","shell.execute_reply.started":"2025-10-09T03:19:45.905635Z","shell.execute_reply":"2025-10-09T03:19:45.926432Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"hist = cycle_gan_model.fit(\n    tf.data.Dataset.zip((monet_ds, photo_ds)),\n    epochs=60,batch_size = 100,callbacks = [callback]\n)","metadata":{"execution":{"iopub.status.busy":"2025-08-05T02:09:46.414578Z","iopub.execute_input":"2025-08-05T02:09:46.414845Z","iopub.status.idle":"2025-08-05T02:09:49.915017Z","shell.execute_reply.started":"2025-08-05T02:09:46.414821Z","shell.execute_reply":"2025-08-05T02:09:49.913917Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"monet_generator.save('monet_gen.h5')","metadata":{},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#monet_generator.load_weights('../input/mygan-wh5/monet_my_gen.h5')","metadata":{"execution":{"iopub.status.busy":"2022-01-14T18:18:56.442573Z","iopub.execute_input":"2022-01-14T18:18:56.443449Z","iopub.status.idle":"2022-01-14T18:18:56.505335Z","shell.execute_reply.started":"2022-01-14T18:18:56.44341Z","shell.execute_reply":"2022-01-14T18:18:56.50467Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"photo_it = iter(photo_ds)\npainting_it = iter(monet_ds)\n","metadata":{"execution":{"iopub.status.busy":"2025-08-05T01:53:49.325252Z","iopub.execute_input":"2025-08-05T01:53:49.326017Z","iopub.status.idle":"2025-08-05T01:53:49.356788Z","shell.execute_reply.started":"2025-08-05T01:53:49.325981Z","shell.execute_reply":"2025-08-05T01:53:49.356242Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"im.shape","metadata":{"execution":{"iopub.status.busy":"2025-08-05T01:54:39.499008Z","iopub.execute_input":"2025-08-05T01:54:39.499637Z","iopub.status.idle":"2025-08-05T01:54:39.504321Z","shell.execute_reply.started":"2025-08-05T01:54:39.499597Z","shell.execute_reply":"2025-08-05T01:54:39.503626Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(10):\n    im = photo_it.next() \n    m_y = monet_generator.predict(im)\n    m_y = m_y*0.5 +0.5\n    im = im *0.5 +0.5\n    plt.figure(figsize=(16,8))\n    plt.subplot(1,2,1)\n    plt.title('real')\n    plt.imshow(im[0])\n    plt.subplot(1,2,2)\n    plt.title('generated')\n    plt.imshow(m_y[0])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2025-08-05T01:53:51.680846Z","iopub.execute_input":"2025-08-05T01:53:51.681460Z","iopub.status.idle":"2025-08-05T01:54:04.098992Z","shell.execute_reply.started":"2025-08-05T01:53:51.681425Z","shell.execute_reply":"2025-08-05T01:54:04.098272Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"type(m_y[0][0][0][0])","metadata":{"execution":{"iopub.status.busy":"2022-01-14T18:28:25.750245Z","iopub.execute_input":"2022-01-14T18:28:25.750492Z","iopub.status.idle":"2022-01-14T18:28:25.755553Z","shell.execute_reply.started":"2022-01-14T18:28:25.750466Z","shell.execute_reply":"2022-01-14T18:28:25.754877Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(10):\n    im = painting_it.next() *0.5 +0.5\n    m_y = photo_generator.predict(im)\n    m_y = m_y \n    plt.figure(figsize=(16,8))\n    plt.subplot(1,2,1)\n    plt.title('real')\n    plt.imshow(im[0])\n    plt.subplot(1,2,2)\n    plt.title('generated')\n    plt.imshow(m_y[0])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-14T18:24:55.601642Z","iopub.execute_input":"2022-01-14T18:24:55.602189Z","iopub.status.idle":"2022-01-14T18:25:02.252407Z","shell.execute_reply.started":"2022-01-14T18:24:55.602144Z","shell.execute_reply":"2022-01-14T18:25:02.251506Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null}]}