{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":3004,"databundleVersionId":861823,"sourceType":"competition"}],"dockerImageVersionId":30636,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# include dependencies and libraries\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\nimport pandas as pd\nimport numpy as np\n\nimport tensorflow as tf\nimport matplotlib.pyplot as plt\nfrom matplotlib.animation import FuncAnimation\nfrom IPython.display import HTML\n\nfrom tensorflow.keras.layers import Dense, Input, Conv2DTranspose, Flatten, Dropout, Conv2D, UpSampling2D, Concatenate, LeakyReLU, Reshape, BatchNormalization\nfrom tensorflow.keras.models import Sequential, Model\nfrom tensorflow.keras.losses import BinaryCrossentropy\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.datasets.mnist import load_data\n\nimport time\nimport os","metadata":{"_uuid":"30af013a-fb14-4d5b-bf03-4cd29770b604","_cell_guid":"4982d256-a580-4c29-8d0b-ef5edf92e6f9","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T13:39:01.663922Z","iopub.execute_input":"2024-01-22T13:39:01.664189Z","iopub.status.idle":"2024-01-22T13:39:21.041342Z","shell.execute_reply.started":"2024-01-22T13:39:01.664164Z","shell.execute_reply":"2024-01-22T13:39:21.040413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# initialize GPU\n\nprint(\"Num GPUs Available: \", len(tf.config.experimental.list_physical_devices('GPU')))\n\ngpus = tf.config.experimental.list_physical_devices('GPU')\nfor gpu in gpus: \n    tf.config.experimental.set_memory_growth(gpu, True)","metadata":{"execution":{"iopub.status.busy":"2024-01-22T13:39:21.043291Z","iopub.execute_input":"2024-01-22T13:39:21.044347Z","iopub.status.idle":"2024-01-22T13:39:22.225980Z","shell.execute_reply.started":"2024-01-22T13:39:21.044309Z","shell.execute_reply":"2024-01-22T13:39:22.225036Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# remove existing images \n\nfolder_path = '/kaggle/working/'\n\nfiles = os.listdir(folder_path)\n\nfor file in files:\n    if file.lower().endswith('.png'):\n        file_path = os.path.join(folder_path, file)\n        try:\n            os.remove(file_path)\n        except Exception as e:\n            print(f\"Error: {e}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-01-22T13:39:22.227078Z","iopub.execute_input":"2024-01-22T13:39:22.227353Z","iopub.status.idle":"2024-01-22T13:39:22.263256Z","shell.execute_reply.started":"2024-01-22T13:39:22.227330Z","shell.execute_reply":"2024-01-22T13:39:22.262361Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# load MNIST dataset\n(trainX, trainy), (testX, testy) = load_data()\n\nprint('Train', trainX.shape, trainy.shape)\nprint('Test', testX.shape, testy.shape)","metadata":{"_uuid":"b502e834-f49f-4f5d-8b4c-75d79b69406b","_cell_guid":"b93662c1-675e-4dd3-8ae8-fa2efe0ac04f","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T13:39:22.265246Z","iopub.execute_input":"2024-01-22T13:39:22.265549Z","iopub.status.idle":"2024-01-22T13:39:22.732528Z","shell.execute_reply.started":"2024-01-22T13:39:22.265519Z","shell.execute_reply":"2024-01-22T13:39:22.731500Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()","metadata":{"_uuid":"929157b6-56b3-4227-aba9-f7e75a34e3db","_cell_guid":"e1cfafa0-f3b7-476f-9247-170adf98777a","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T13:39:22.733616Z","iopub.execute_input":"2024-01-22T13:39:22.733906Z","iopub.status.idle":"2024-01-22T13:39:22.995683Z","shell.execute_reply.started":"2024-01-22T13:39:22.733859Z","shell.execute_reply":"2024-01-22T13:39:22.994713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Reshape and normalize the images\ntrain_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')\ntrain_images = (train_images - 127.5) / 127.5  # Normalize the images to [-1, 1]","metadata":{"execution":{"iopub.status.busy":"2024-01-22T13:39:22.997025Z","iopub.execute_input":"2024-01-22T13:39:22.997647Z","iopub.status.idle":"2024-01-22T13:39:23.125317Z","shell.execute_reply.started":"2024-01-22T13:39:22.997613Z","shell.execute_reply":"2024-01-22T13:39:23.124219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(5,5))\n\nfor i in range(16):\n    plt.subplot(4,4,i+1)\n    plt.imshow(train_images[i], cmap='gray')\n    plt.axis('off')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-01-22T13:39:23.126653Z","iopub.execute_input":"2024-01-22T13:39:23.127003Z","iopub.status.idle":"2024-01-22T13:39:23.787865Z","shell.execute_reply.started":"2024-01-22T13:39:23.126976Z","shell.execute_reply":"2024-01-22T13:39:23.786795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# shuffle and batch the data\n\nBUFFER_SIZE = 60000\nBATCH_SIZE = 256\n\ntrain_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)","metadata":{"_uuid":"a471062c-09de-4d5f-9503-1e877d3e179f","_cell_guid":"bfff1047-b77c-401d-9392-788b697a90d2","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T13:39:23.789593Z","iopub.execute_input":"2024-01-22T13:39:23.789948Z","iopub.status.idle":"2024-01-22T13:39:24.567896Z","shell.execute_reply.started":"2024-01-22T13:39:23.789918Z","shell.execute_reply":"2024-01-22T13:39:24.566922Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def build_generator():\n    model = Sequential([\n        Dense(7*7*128, input_shape=(100,)),\n        LeakyReLU(alpha=0.2),\n        Reshape((7,7,128)),\n        \n        UpSampling2D(),\n        Conv2D(512,7,padding='same'),\n        BatchNormalization(),\n        LeakyReLU(0.2),\n        \n        UpSampling2D(),\n        Conv2D(256, 5, padding='same'),\n        BatchNormalization(),\n        LeakyReLU(0.2),\n        \n        Conv2D(128, 5, padding='same'),\n        BatchNormalization(),\n        LeakyReLU(0.2),\n        \n        UpSampling2D(),\n        Conv2D(1,5, strides=(2,2), padding='same')\n    ])\n    \n    return model\n","metadata":{"_uuid":"558d63f4-c87d-44dc-a294-d7553e72a864","_cell_guid":"d384fdcf-f3d7-41b4-8fcb-66581869c291","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:44.514684Z","iopub.execute_input":"2024-01-22T15:08:44.515085Z","iopub.status.idle":"2024-01-22T15:08:44.522520Z","shell.execute_reply.started":"2024-01-22T15:08:44.515054Z","shell.execute_reply":"2024-01-22T15:08:44.521456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator_model = build_generator()\ngenerator_model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-01-22T15:08:45.110261Z","iopub.execute_input":"2024-01-22T15:08:45.110885Z","iopub.status.idle":"2024-01-22T15:08:45.295634Z","shell.execute_reply.started":"2024-01-22T15:08:45.110835Z","shell.execute_reply":"2024-01-22T15:08:45.294607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"noise = tf.random.normal([1, 100]) \ngenerated_image = generator_model(noise, training=False)\n\nplt.imshow(generated_image[0, :, :, 0], cmap='gray')","metadata":{"_uuid":"2064aef1-fec6-4276-9f8b-5d949510c315","_cell_guid":"71c55892-e037-422d-b338-4622c873a751","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:45.698068Z","iopub.execute_input":"2024-01-22T15:08:45.698439Z","iopub.status.idle":"2024-01-22T15:08:45.991721Z","shell.execute_reply.started":"2024-01-22T15:08:45.698411Z","shell.execute_reply":"2024-01-22T15:08:45.990692Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Discriminator model\n# 128(5) ----> 128(5) ----> 256(5) ----> flatten() ----> 1\n\ndef build_discriminator():\n    model = Sequential([\n        Conv2D(128, 5, padding='same', input_shape=(28, 28, 1)),\n        LeakyReLU(0.2),\n        \n        Conv2D(128, 5, padding='same'),\n        LeakyReLU(0.2),\n        \n        Conv2D(256, 5, padding='same'),\n        LeakyReLU(0.2),\n        Dropout(0.3),\n        \n        Flatten(),\n        Dense(1, activation='sigmoid')\n    ])\n\n    return model","metadata":{"_uuid":"280d7cc6-f120-4fdf-99d5-e9a099202da9","_cell_guid":"fac42fb2-71d2-4fa0-ab9b-32c2df245414","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:46.440394Z","iopub.execute_input":"2024-01-22T15:08:46.440759Z","iopub.status.idle":"2024-01-22T15:08:46.447593Z","shell.execute_reply.started":"2024-01-22T15:08:46.440732Z","shell.execute_reply":"2024-01-22T15:08:46.446387Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator_model = build_discriminator()\ndiscriminator_model.summary()","metadata":{"execution":{"iopub.status.busy":"2024-01-22T15:08:46.931524Z","iopub.execute_input":"2024-01-22T15:08:46.932457Z","iopub.status.idle":"2024-01-22T15:08:47.028234Z","shell.execute_reply.started":"2024-01-22T15:08:46.932422Z","shell.execute_reply":"2024-01-22T15:08:47.027290Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# defining losses and optimizers\ng_loss = BinaryCrossentropy()\nd_loss = BinaryCrossentropy()\n\ng_opt = Adam(1e-4)\nd_opt = Adam(1e-4)","metadata":{"_uuid":"427e0d63-08e9-479a-b6c5-6eb2b8769913","_cell_guid":"d5abfa2c-cfdf-49a8-aa71-59f376330dd5","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:49.243458Z","iopub.execute_input":"2024-01-22T15:08:49.244548Z","iopub.status.idle":"2024-01-22T15:08:49.252576Z","shell.execute_reply.started":"2024-01-22T15:08:49.244511Z","shell.execute_reply":"2024-01-22T15:08:49.251675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# GAN class inheriting Model class from tf\nclass GAN(Model):\n    def __init__(self, generator_model, discriminator_model):\n        super().__init__()\n        self.generator = generator_model\n        self.discriminator = discriminator_model\n        \n    def compile(self, g_opt, d_opt, g_loss, d_loss):\n        super().compile()\n        \n        self.g_opt = g_opt\n        self.d_opt = d_opt\n        self.g_loss = g_loss\n        self.d_loss = d_loss\n        \n    # discriminator loss\n    def discriminator_loss(self,real_image, fake_image):\n        real_loss = self.d_loss(tf.ones_like(real_image), real_image)\n        fake_loss = self.d_loss(tf.zeros_like(fake_image), fake_image)\n        return real_loss + fake_loss\n    \n    # generator loss\n    def generator_loss(self,fake_image):\n        return self.g_loss(tf.ones_like(fake_image), fake_image)\n        \n    def train_step(self, dataset):\n        real_images = dataset\n        # random noise\n        noise = tf.random.normal([1,100])\n        \n        # training generator and discriminator\n        with tf.GradientTape() as g_tape, tf.GradientTape() as d_tape:\n            generated_images = self.generator(noise, training=True)\n            \n            real_output = self.discriminator(real_images, training=True)\n            fake_output = self.discriminator(generated_images, training=True)\n            \n            gen_loss = self.generator_loss(fake_output)\n            disc_loss = self.discriminator_loss(real_output, fake_output)\n        \n        # Updating gradients\n        # discriminator\n        dgrad = d_tape.gradient(disc_loss, self.discriminator.trainable_variables)\n        self.d_opt.apply_gradients(zip(dgrad, self.discriminator.trainable_variables))\n        \n        # generator\n        ggrad = g_tape.gradient(gen_loss, self.generator.trainable_variables)\n        self.g_opt.apply_gradients(zip(ggrad, self.generator.trainable_variables))\n        \n        return {\"d_loss\":disc_loss, \"g_loss\":gen_loss}","metadata":{"_uuid":"3dbba032-b232-4730-9dca-69c35e72fc04","_cell_guid":"0c09be97-ecde-459c-a4b5-863a0a1fca68","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:49.972369Z","iopub.execute_input":"2024-01-22T15:08:49.972749Z","iopub.status.idle":"2024-01-22T15:08:49.985195Z","shell.execute_reply.started":"2024-01-22T15:08:49.972717Z","shell.execute_reply":"2024-01-22T15:08:49.984153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"gan = GAN(generator_model, discriminator_model)\ngan.compile(g_opt, d_opt, g_loss, d_loss)","metadata":{"_uuid":"efe74436-74d8-4620-a591-d09818f49a62","_cell_guid":"8a182f6c-c281-487d-a6e6-cd5127a01d37","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:50.546667Z","iopub.execute_input":"2024-01-22T15:08:50.547344Z","iopub.status.idle":"2024-01-22T15:08:50.564688Z","shell.execute_reply.started":"2024-01-22T15:08:50.547311Z","shell.execute_reply":"2024-01-22T15:08:50.563701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# random noise on which the final images are generated\nseed = tf.random.normal([16,100])\n\ndef train(data, epochs):\n    for epoch in range(epochs):\n        start = time.time()\n        # batch processing\n        for image in data:\n            losses = gan.train_step(image)\n        \n        print('generator loss:', format(losses['g_loss'], '.5f'), 'discriminator loss:',format(losses['d_loss'], '.5f'))\n        print('Time taken to complete',epoch+1,'epoches:',round(time.time()-start,2))\n        # plot and save images at every tenth epoch\n        if (epoch+1) % 5 == 0:\n            generate_and_save_images(generator_model, epoch+1, seed)","metadata":{"_uuid":"f1630b17-2893-4284-9803-6df3fc50cbd8","_cell_guid":"c98bcf3f-b645-48ff-8ea2-a29f59457219","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:50.974301Z","iopub.execute_input":"2024-01-22T15:08:50.975171Z","iopub.status.idle":"2024-01-22T15:08:50.983521Z","shell.execute_reply.started":"2024-01-22T15:08:50.975137Z","shell.execute_reply":"2024-01-22T15:08:50.982486Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_and_save_images(model, epoch, test):\n    pred = model(test)\n    fig = plt.figure(figsize=(4,4))\n    \n    for i in range(pred.shape[0]):\n        plt.subplot(4,4,i+1)\n        plt.imshow(pred[i,:,:,0]*127.5+127.5,cmap='gray')\n        plt.axis('off')\n    \n    plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))\n    plt.show()","metadata":{"_uuid":"812d1852-db13-468a-a190-61f4d4485b4f","_cell_guid":"26c339ca-e8f6-4105-81f6-70621661aca6","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:51.673996Z","iopub.execute_input":"2024-01-22T15:08:51.674706Z","iopub.status.idle":"2024-01-22T15:08:51.680865Z","shell.execute_reply.started":"2024-01-22T15:08:51.674671Z","shell.execute_reply":"2024-01-22T15:08:51.679899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train(train_dataset, 100)","metadata":{"_uuid":"208932f0-9d0b-448a-a32f-2e694d68549e","_cell_guid":"00a6e364-e2b7-4186-a104-8bf1ac6083aa","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T15:08:53.186010Z","iopub.execute_input":"2024-01-22T15:08:53.186922Z","iopub.status.idle":"2024-01-22T16:18:50.639510Z","shell.execute_reply.started":"2024-01-22T15:08:53.186865Z","shell.execute_reply":"2024-01-22T16:18:50.638246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# creating animation\n\nimage_directory = '/kaggle/working/'\n\ngenerated_image_paths = sorted([os.path.join(image_directory, f) for f in os.listdir(image_directory) if f.endswith('.png')])\n\nfig, ax = plt.subplots()\nax.set_xlim(0, 1)\nax.set_ylim(0, 1)\n\ndef update(frame):\n    ax.clear()\n    if 0 <= frame < len(generated_image_paths):\n        img = plt.imread(generated_image_paths[frame])\n        ax.imshow(img)\n        ax.set_title(f'Frame {frame + 1}/{len(generated_image_paths)}')\n\nanimation = FuncAnimation(fig, update, frames=len(generated_image_paths), interval=1000)\nhtml_output = HTML(animation.to_jshtml())\ndisplay(html_output)\n","metadata":{"_uuid":"1586cc1e-d6c3-43f1-9125-fe5ecf2481f3","_cell_guid":"743c997c-20fe-44e1-bccd-c639f6af59ce","collapsed":false,"jupyter":{"outputs_hidden":false},"execution":{"iopub.status.busy":"2024-01-22T16:19:07.481839Z","iopub.execute_input":"2024-01-22T16:19:07.482229Z","iopub.status.idle":"2024-01-22T16:19:14.452995Z","shell.execute_reply.started":"2024-01-22T16:19:07.482199Z","shell.execute_reply":"2024-01-22T16:19:14.452051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}