{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":21755,"databundleVersionId":1475600,"sourceType":"competition"}],"dockerImageVersionId":30806,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.layers import Conv2D, Conv2DTranspose, LeakyReLU, Input\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.optimizers import Adam\nimport numpy as np\nimport zipfile\nfrom io import BytesIO\nfrom PIL import Image\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T01:43:51.249237Z","iopub.execute_input":"2024-12-21T01:43:51.250130Z","iopub.status.idle":"2024-12-21T01:43:51.263023Z","shell.execute_reply.started":"2024-12-21T01:43:51.250055Z","shell.execute_reply":"2024-12-21T01:43:51.261625Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 1. Load and preprocess dataset\ndef decode_image(image):\n    image = tf.io.decode_jpeg(image, channels=3)\n    image = tf.image.resize(image, [256, 256])\n    image = (image - 127.5) / 127.5  # Normalize to [-1, 1]\n    return image\n\ndef load_tfrec_dataset(file_pattern):\n    files = tf.io.gfile.glob(file_pattern)\n    dataset = tf.data.TFRecordDataset(files)\n    feature_description = {'image': tf.io.FixedLenFeature([], tf.string)}\n    def _parse_function(example_proto):\n        features = tf.io.parse_single_example(example_proto, feature_description)\n        return decode_image(features['image'])\n    return dataset.map(_parse_function)\n\n# Load datasets\nmonet_tfrec = load_tfrec_dataset('../input/gan-getting-started/monet_tfrec/*.tfrec')\nphoto_tfrec = load_tfrec_dataset('../input/gan-getting-started/photo_tfrec/*.tfrec')\n\n# Optimize dataset pipeline\nBATCH_SIZE = 16\nmonet_dataset = monet_tfrec.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)\nphoto_dataset = photo_tfrec.batch(BATCH_SIZE).prefetch(tf.data.AUTOTUNE)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T01:34:11.092428Z","iopub.execute_input":"2024-12-21T01:34:11.092882Z","iopub.status.idle":"2024-12-21T01:34:11.220644Z","shell.execute_reply.started":"2024-12-21T01:34:11.092835Z","shell.execute_reply":"2024-12-21T01:34:11.219479Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 2. Define Generator and Discriminator\ndef build_generator():\n    inputs = Input(shape=(256, 256, 3))\n    x = Conv2D(64, (4, 4), strides=2, padding='same')(inputs)\n    x = LeakyReLU()(x)\n    x = Conv2D(128, (4, 4), strides=2, padding='same')(x)\n    x = LeakyReLU()(x)\n    x = Conv2DTranspose(64, (4, 4), strides=2, padding='same')(x)\n    x = LeakyReLU()(x)\n    x = Conv2DTranspose(3, (4, 4), strides=2, padding='same')(x)  # Output shape: (256, 256, 3)\n    outputs = tf.keras.layers.Activation('tanh')(x)\n    return Model(inputs, outputs)\n\ndef build_discriminator():\n    inputs = Input(shape=(256, 256, 3))\n    x = Conv2D(64, (4, 4), strides=2, padding='same')(inputs)\n    x = LeakyReLU()(x)\n    x = Conv2D(128, (4, 4), strides=2, padding='same')(x)\n    outputs = Conv2D(1, (4, 4), padding='same')(x)\n    return Model(inputs, outputs)\n\n# Initialize models\ngenerator = build_generator()\ndiscriminator = build_discriminator()\n\n# Compile models\ngenerator_optimizer = Adam(2e-4, beta_1=0.5)\ndiscriminator_optimizer = Adam(2e-4, beta_1=0.5)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T01:34:11.222815Z","iopub.execute_input":"2024-12-21T01:34:11.223198Z","iopub.status.idle":"2024-12-21T01:34:11.301212Z","shell.execute_reply.started":"2024-12-21T01:34:11.223164Z","shell.execute_reply":"2024-12-21T01:34:11.300122Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 3. Train the model\nEPOCHS = 2\nfor epoch in range(EPOCHS):\n    print(f\"Starting epoch {epoch+1}/{EPOCHS}\")\n    for step, (monet_image, photo_image) in enumerate(tf.data.Dataset.zip((monet_dataset, photo_dataset))):\n        with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n            fake_monet = generator(photo_image, training=True)\n            disc_real_output = discriminator(monet_image, training=True)\n            disc_fake_output = discriminator(fake_monet, training=True)\n\n            gen_loss = tf.reduce_mean(tf.keras.losses.MSE(tf.ones_like(disc_fake_output), disc_fake_output))\n            disc_loss = (tf.reduce_mean(tf.keras.losses.MSE(tf.ones_like(disc_real_output), disc_real_output)) +\n                         tf.reduce_mean(tf.keras.losses.MSE(tf.zeros_like(disc_fake_output), disc_fake_output)))\n\n        gradients_gen = gen_tape.gradient(gen_loss, generator.trainable_variables)\n        gradients_disc = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n        generator_optimizer.apply_gradients(zip(gradients_gen, generator.trainable_variables))\n        discriminator_optimizer.apply_gradients(zip(gradients_disc, discriminator.trainable_variables))\n\n        if step % 10 == 0:\n            print(f\"Epoch {epoch+1}, Step {step}: Gen Loss: {gen_loss.numpy()}, Disc Loss: {disc_loss.numpy()}\")\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T01:34:11.302572Z","iopub.execute_input":"2024-12-21T01:34:11.303019Z","iopub.status.idle":"2024-12-21T01:38:51.692850Z","shell.execute_reply.started":"2024-12-21T01:34:11.302968Z","shell.execute_reply":"2024-12-21T01:38:51.691613Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 4. Save generated images directly to ZIP\nwith zipfile.ZipFile('images.zip', 'w') as zipf:\n    for i, photo_image in enumerate(photo_tfrec.take(10000)):  # Ambil hingga 10.000 gambar\n        # Tambahkan dimensi batch ke photo_image\n        photo_image = tf.expand_dims(photo_image, axis=0)\n\n        # Hasilkan gambar dengan generator\n        generated_image = generator(photo_image, training=False)[0].numpy()\n        generated_image = ((generated_image + 1) * 127.5).astype(np.uint8)  # Ubah ke [0, 255]\n\n        # Simpan gambar ke buffer dan tambahkan ke file zip\n        img = Image.fromarray(generated_image)\n        buffer = BytesIO()\n        img.save(buffer, format=\"JPEG\")\n        zipf.writestr(f\"image_{i}.jpg\", buffer.getvalue())\n\n        if i % 1000 == 0:\n            print(f\"{i} images added to ZIP\")\n        if i >= 9999: \n            break","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-21T01:38:51.695638Z","iopub.execute_input":"2024-12-21T01:38:51.696135Z","iopub.status.idle":"2024-12-21T01:43:51.239993Z","shell.execute_reply.started":"2024-12-21T01:38:51.696082Z","shell.execute_reply":"2024-12-21T01:43:51.238818Z"}},"outputs":[],"execution_count":null}]}