{"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":"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":"2022-01-16T17:23:18.847547Z","iopub.execute_input":"2022-01-16T17:23:18.847891Z","iopub.status.idle":"2022-01-16T17:23:24.328355Z","shell.execute_reply.started":"2022-01-16T17:23:18.847801Z","shell.execute_reply":"2022-01-16T17:23:24.327639Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":"2022-01-14T22:32:52.560842Z","iopub.execute_input":"2022-01-14T22:32:52.561863Z","iopub.status.idle":"2022-01-14T22:32:52.602053Z","shell.execute_reply.started":"2022-01-14T22:32:52.561813Z","shell.execute_reply":"2022-01-14T22:32:52.601171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":"2022-01-14T22:32:52.737439Z","iopub.execute_input":"2022-01-14T22:32:52.737742Z","iopub.status.idle":"2022-01-14T22:32:52.747103Z","shell.execute_reply.started":"2022-01-14T22:32:52.737713Z","shell.execute_reply":"2022-01-14T22:32:52.746063Z"},"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-14T22:32:52.910506Z","iopub.execute_input":"2022-01-14T22:32:52.910909Z","iopub.status.idle":"2022-01-14T22:32:52.917224Z","shell.execute_reply.started":"2022-01-14T22:32:52.910879Z","shell.execute_reply":"2022-01-14T22:32:52.916037Z"},"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-14T22:32:59.9255Z","iopub.execute_input":"2022-01-14T22:32:59.926492Z","iopub.status.idle":"2022-01-14T22:32:59.979693Z","shell.execute_reply.started":"2022-01-14T22:32:59.926424Z","shell.execute_reply":"2022-01-14T22:32:59.978483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im = next(iter(monet_ds))\npim = next(iter(photo_ds))","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:00.245287Z","iopub.execute_input":"2022-01-14T22:33:00.246094Z","iopub.status.idle":"2022-01-14T22:33:00.338161Z","shell.execute_reply.started":"2022-01-14T22:33:00.246055Z","shell.execute_reply":"2022-01-14T22:33:00.337079Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"im.numpy().min()","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:00.85692Z","iopub.execute_input":"2022-01-14T22:33:00.857321Z","iopub.status.idle":"2022-01-14T22:33:00.865721Z","shell.execute_reply.started":"2022-01-14T22:33:00.857287Z","shell.execute_reply":"2022-01-14T22:33:00.864453Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10,5))\nplt.subplot(1,2,1)\nplt.imshow(pim[0]*0.5+0.5)\nplt.subplot(1,2,2)\nplt.imshow(im[0]*0.5+0.5)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:01.737773Z","iopub.execute_input":"2022-01-14T22:33:01.738141Z","iopub.status.idle":"2022-01-14T22:33:02.23635Z","shell.execute_reply.started":"2022-01-14T22:33:01.738106Z","shell.execute_reply":"2022-01-14T22:33:02.235195Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def conv_blk(filters,k_size,strd,inp):\n    x = layers.Conv2D(filters,k_size, strides=strd,padding='same',bias_initializer=tf.keras.initializers.constant(0.0))(inp)\n    x = layers.ReLU(max_value=4)(x)\n    return x\n\ndef rev_conv(chnl,k_size, inp):\n    x = layers.Conv2DTranspose(chnl,k_size,strides = 2,padding='same',bias_initializer=tf.keras.initializers.constant(0.0))(inp)\n    x = layers.ReLU(max_value=4)(x)\n    return x","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:03.21259Z","iopub.execute_input":"2022-01-14T22:33:03.21364Z","iopub.status.idle":"2022-01-14T22:33:03.221808Z","shell.execute_reply.started":"2022-01-14T22:33:03.213586Z","shell.execute_reply":"2022-01-14T22:33:03.221071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#def Gen():\n#    im_input= layers.Input(shape=[256,256,3])\n#    extractor = [64,128,256,256,256]\n#    skips = []\n#    x = im_input\n#    for ly in extractor:\n#        x = conv_blk(ly,4,x)\n#        skips.append(x)\n#    skips = reversed(skips[:-1])\n#    constructor = [256,256,128,64]\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(16,1,strides = 1,padding = 'same',activation = 'relu',bias_initializer=tf.keras.initializers.constant(0.0))(im_input)\n    x = layers.Conv2D(16,7, strides=1,padding='same',activation='relu',bias_initializer=tf.keras.initializers.constant(0.0))(im_input)\n    x = layers.Conv2D(32,3, strides=2,padding='same',activation='relu',bias_initializer=tf.keras.initializers.constant(0.0))(x)\n    x = layers.Conv2D(64,3, strides=2,padding='same',activation='relu',bias_initializer=tf.keras.initializers.constant(0.0))(x)\n    v = x\n    for ly in range(2):\n        x = conv_blk(64,3,1,x)\n        x = layers.Add()([x,v])\n        v = x\n\n    x = rev_conv(32,4,x)\n    x = rev_conv(16,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\ndef Judge():\n    im_input= layers.Input(shape=[256,256,3])\n    x = conv_blk(16,7,2,im_input)\n    v = x\n    x = conv_blk(16,3,1,x)\n    x = layers.Add()([x,v])\n    x = conv_blk(32,3,2,x)\n    v = x\n    x = conv_blk(32,3,1,x)\n    x = layers.Add()([x,v])\n    x = conv_blk(64,3,2,x)\n    x = conv_blk(128,3,2,x)\n    out = layers.Conv2D(1,3,1,padding='same',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":"2022-01-14T22:33:04.336321Z","iopub.execute_input":"2022-01-14T22:33:04.337098Z","iopub.status.idle":"2022-01-14T22:33:04.354407Z","shell.execute_reply.started":"2022-01-14T22:33:04.337059Z","shell.execute_reply":"2022-01-14T22:33:04.35347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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        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":"2022-01-14T22:33:05.299098Z","iopub.execute_input":"2022-01-14T22:33:05.299424Z","iopub.status.idle":"2022-01-14T22:33:05.320981Z","shell.execute_reply.started":"2022-01-14T22:33:05.299394Z","shell.execute_reply":"2022-01-14T22:33:05.320089Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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 * 0.8\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":"2022-01-14T22:33:05.783146Z","iopub.execute_input":"2022-01-14T22:33:05.783864Z","iopub.status.idle":"2022-01-14T22:33:05.793579Z","shell.execute_reply.started":"2022-01-14T22:33:05.783828Z","shell.execute_reply":"2022-01-14T22:33:05.792996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nmonet_generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\nphoto_generator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\n\nmonet_discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)\nphoto_discriminator_optimizer = tf.keras.optimizers.Adam(2e-4, beta_1=0.5)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:06.303885Z","iopub.execute_input":"2022-01-14T22:33:06.304454Z","iopub.status.idle":"2022-01-14T22:33:06.31308Z","shell.execute_reply.started":"2022-01-14T22:33:06.304416Z","shell.execute_reply":"2022-01-14T22:33:06.312049Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":"2022-01-14T22:33:07.008335Z","iopub.execute_input":"2022-01-14T22:33:07.008977Z","iopub.status.idle":"2022-01-14T22:33:07.012844Z","shell.execute_reply.started":"2022-01-14T22:33:07.008946Z","shell.execute_reply":"2022-01-14T22:33:07.012057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nmonet_generator = myGen() # transforms photos to Monet-esque paintings\nphoto_generator = myGen() # 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":"2022-01-14T22:33:07.48239Z","iopub.execute_input":"2022-01-14T22:33:07.482785Z","iopub.status.idle":"2022-01-14T22:33:07.968957Z","shell.execute_reply.started":"2022-01-14T22:33:07.482756Z","shell.execute_reply":"2022-01-14T22:33:07.967823Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def lr_sch(epoch,lr):\n    if epoch % 3 == 0:\n        lr = 0.002\n    else:\n        lr = 2e-4\n    print(lr)\n    return lr\ncallback = tf.keras.callbacks.LearningRateScheduler(lr_sch)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:51.367955Z","iopub.execute_input":"2022-01-14T22:33:51.369343Z","iopub.status.idle":"2022-01-14T22:33:51.375191Z","shell.execute_reply.started":"2022-01-14T22:33:51.369289Z","shell.execute_reply":"2022-01-14T22:33:51.374027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ncycle_gan_model = CycleGan(\n    monet_generator, photo_generator, monet_discriminator, photo_discriminator\n)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:54.345148Z","iopub.execute_input":"2022-01-14T22:33:54.345637Z","iopub.status.idle":"2022-01-14T22:33:54.355148Z","shell.execute_reply.started":"2022-01-14T22:33:54.345604Z","shell.execute_reply":"2022-01-14T22:33:54.354118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":"2022-01-14T22:33:54.628548Z","iopub.execute_input":"2022-01-14T22:33:54.628886Z","iopub.status.idle":"2022-01-14T22:33:54.643804Z","shell.execute_reply.started":"2022-01-14T22:33:54.628851Z","shell.execute_reply":"2022-01-14T22:33:54.643092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"hist = cycle_gan_model.fit(\n    tf.data.Dataset.zip((monet_ds, photo_ds)),\n    epochs=5,batch_size = 32,callbacks = [callback]\n)","metadata":{"execution":{"iopub.status.busy":"2022-01-14T22:33:56.150384Z","iopub.execute_input":"2022-01-14T22:33:56.15073Z","iopub.status.idle":"2022-01-14T22:40:46.735626Z","shell.execute_reply.started":"2022-01-14T22:33:56.150694Z","shell.execute_reply":"2022-01-14T22:40:46.734104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"monet_generator.save('monet_my_gen.h5')","metadata":{},"execution_count":null,"outputs":[]},{"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},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"photo_it = iter(photo_ds)\npainting_it = iter(monet_ds)\n","metadata":{"execution":{"iopub.status.busy":"2022-01-14T18:23:50.264299Z","iopub.execute_input":"2022-01-14T18:23:50.26551Z","iopub.status.idle":"2022-01-14T18:24:22.306014Z","shell.execute_reply.started":"2022-01-14T18:23:50.265435Z","shell.execute_reply":"2022-01-14T18:24:22.305239Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2022-01-14T18:29:33.768347Z","iopub.execute_input":"2022-01-14T18:29:33.768743Z","iopub.status.idle":"2022-01-14T18:29:33.775578Z","shell.execute_reply.started":"2022-01-14T18:29:33.768711Z","shell.execute_reply":"2022-01-14T18:29:33.774783Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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('photo')\n    plt.imshow(im[0])\n    plt.subplot(1,2,2)\n    plt.title('monet_style')\n    plt.imshow(m_y[0])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-14T18:33:45.129797Z","iopub.execute_input":"2022-01-14T18:33:45.13038Z","iopub.status.idle":"2022-01-14T18:33:52.016163Z","shell.execute_reply.started":"2022-01-14T18:33:45.130345Z","shell.execute_reply":"2022-01-14T18:33:52.015307Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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},"execution_count":null,"outputs":[]},{"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('photo')\n    plt.imshow(im[0])\n    plt.subplot(1,2,2)\n    plt.title('monet_style')\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},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}