{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\n\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom keras.preprocessing.image import ImageDataGenerator, load_img, img_to_array\nfrom keras.utils import to_categorical\nfrom sklearn.model_selection import train_test_split\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport random\n\nimport os\nprint(os.listdir(\"../input/dogs-vs-cats\"))\n\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-08-31T17:21:27.782471Z","iopub.execute_input":"2021-08-31T17:21:27.782833Z","iopub.status.idle":"2021-08-31T17:21:27.795371Z","shell.execute_reply.started":"2021-08-31T17:21:27.782802Z","shell.execute_reply":"2021-08-31T17:21:27.794584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nimport zipfile\n\nwith zipfile.ZipFile(\"../input/dogs-vs-cats/train.zip\",\"r\") as z:\n    z.extractall(\".\")\n    \nwith zipfile.ZipFile(\"../input/dogs-vs-cats/test1.zip\",\"r\") as z:\n    z.extractall(\".\")  ","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:27.822090Z","iopub.execute_input":"2021-08-31T17:21:27.822352Z","iopub.status.idle":"2021-08-31T17:21:41.675120Z","shell.execute_reply.started":"2021-08-31T17:21:27.822320Z","shell.execute_reply":"2021-08-31T17:21:41.674272Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.__version__\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:41.676612Z","iopub.execute_input":"2021-08-31T17:21:41.676968Z","iopub.status.idle":"2021-08-31T17:21:41.683501Z","shell.execute_reply.started":"2021-08-31T17:21:41.676931Z","shell.execute_reply":"2021-08-31T17:21:41.682493Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport os\nimport PIL\nfrom tensorflow.keras import layers\nimport time\n\nfrom IPython import display\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:41.685605Z","iopub.execute_input":"2021-08-31T17:21:41.685997Z","iopub.status.idle":"2021-08-31T17:21:41.693349Z","shell.execute_reply.started":"2021-08-31T17:21:41.685961Z","shell.execute_reply":"2021-08-31T17:21:41.692508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DIR_TRAIN = \"/kaggle/working/train/\"\nDIR_TEST = \"/kaggle/working/test1\"\n\ntrain_imgs = os.listdir(DIR_TRAIN)\ntest_imgs = os.listdir(DIR_TEST)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:41.695017Z","iopub.execute_input":"2021-08-31T17:21:41.695537Z","iopub.status.idle":"2021-08-31T17:21:41.723141Z","shell.execute_reply.started":"2021-08-31T17:21:41.695502Z","shell.execute_reply":"2021-08-31T17:21:41.722480Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample = np.random.choice(train_imgs)\nimage = load_img(\"/kaggle/working/train/\"+sample)\nplt.imshow(image)\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:41.724203Z","iopub.execute_input":"2021-08-31T17:21:41.724534Z","iopub.status.idle":"2021-08-31T17:21:41.845657Z","shell.execute_reply.started":"2021-08-31T17:21:41.724502Z","shell.execute_reply":"2021-08-31T17:21:41.844729Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"category = [x.split(\".\")[0] for x in train_imgs]\ndf = pd.DataFrame({\"Filename\":train_imgs, \"Category\":category})\ndf.head()\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:41.847072Z","iopub.execute_input":"2021-08-31T17:21:41.847395Z","iopub.status.idle":"2021-08-31T17:21:41.874733Z","shell.execute_reply.started":"2021-08-31T17:21:41.847361Z","shell.execute_reply":"2021-08-31T17:21:41.874014Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_datagen = ImageDataGenerator(\n    rescale = 1.0/255.0,\n)\ntrain_generator = train_datagen.flow_from_dataframe(df, \n                                  directory = \"/kaggle/working/train/\",\n                                  x_col = 'Filename',\n                                  y_col = 'Category',\n                                  target_size = (128, 128),\n                                  class_mode = 'categorical',\n                                  batch_size = 32\n                                 )","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:41.875989Z","iopub.execute_input":"2021-08-31T17:21:41.876336Z","iopub.status.idle":"2021-08-31T17:21:42.109557Z","shell.execute_reply.started":"2021-08-31T17:21:41.876300Z","shell.execute_reply":"2021-08-31T17:21:42.108545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_example = df.sample(9)\nexample_generator = train_datagen.flow_from_dataframe(df_example,\n                                  directory = \"/kaggle/working/train/\",\n                                  x_col = 'Filename',\n                                  y_col = 'Category',\n                                  target_size = (112, 112),\n                                  class_mode = 'categorical')","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:42.112371Z","iopub.execute_input":"2021-08-31T17:21:42.112728Z","iopub.status.idle":"2021-08-31T17:21:42.122461Z","shell.execute_reply.started":"2021-08-31T17:21:42.112691Z","shell.execute_reply":"2021-08-31T17:21:42.121456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12,12))\nfor i in range(9):\n    plt.subplot(3, 3, i+1)\n    for X_batch, Y_batch in example_generator:\n        image = X_batch[0]\n        plt.imshow(image)\n        plt.axis(\"off\")\n        break\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:42.124389Z","iopub.execute_input":"2021-08-31T17:21:42.124760Z","iopub.status.idle":"2021-08-31T17:21:43.246080Z","shell.execute_reply.started":"2021-08-31T17:21:42.124724Z","shell.execute_reply":"2021-08-31T17:21:43.239522Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nBATCH_SIZE = 256\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.247466Z","iopub.execute_input":"2021-08-31T17:21:43.247880Z","iopub.status.idle":"2021-08-31T17:21:43.252125Z","shell.execute_reply.started":"2021-08-31T17:21:43.247835Z","shell.execute_reply":"2021-08-31T17:21:43.251147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Batch and shuffle the data\nkeras.backend.clear_session()\n#train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.253367Z","iopub.execute_input":"2021-08-31T17:21:43.253703Z","iopub.status.idle":"2021-08-31T17:21:43.265596Z","shell.execute_reply.started":"2021-08-31T17:21:43.253670Z","shell.execute_reply":"2021-08-31T17:21:43.264542Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_generator_model():\n    model = tf.keras.Sequential()\n    model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(1000,)))\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Reshape((7, 7, 256)))\n    assert model.output_shape == (None, 7, 7, 256)  # Note: None is the batch size\n\n    model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))\n    assert model.output_shape == (None, 7, 7, 128)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    assert model.output_shape == (None, 14, 14, 64)\n    model.add(layers.BatchNormalization())\n    model.add(layers.LeakyReLU())\n\n    model.add(layers.Conv2DTranspose(16, (5, 5), strides=(2, 2), padding='same', use_bias=False))\n    assert model.output_shape == (None, 28, 28, 16)\n    \n    model.add(layers.Conv2DTranspose(3, (5, 5), strides=(4, 4), padding='same', use_bias=False, activation='tanh'))\n    assert model.output_shape == (None, 112, 112, 3)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.267037Z","iopub.execute_input":"2021-08-31T17:21:43.267368Z","iopub.status.idle":"2021-08-31T17:21:43.282186Z","shell.execute_reply.started":"2021-08-31T17:21:43.267336Z","shell.execute_reply":"2021-08-31T17:21:43.281168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator = make_generator_model()\n\nnoise = tf.random.normal([1, 1000])\ngenerated_image = generator(noise, training=False)\n\nplt.imshow(generated_image[0, :, :, 0], cmap='gray')\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.283625Z","iopub.execute_input":"2021-08-31T17:21:43.284245Z","iopub.status.idle":"2021-08-31T17:21:43.572720Z","shell.execute_reply.started":"2021-08-31T17:21:43.284203Z","shell.execute_reply":"2021-08-31T17:21:43.571773Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_discriminator_model():\n    model = tf.keras.Sequential()\n    model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',\n                                     input_shape=[112, 112, 3]))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.3))\n\n    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.3))\n    \n    model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))\n    model.add(layers.LeakyReLU())\n    model.add(layers.Dropout(0.3))\n\n    model.add(layers.Flatten())\n    model.add(layers.Dense(1))\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.574253Z","iopub.execute_input":"2021-08-31T17:21:43.574626Z","iopub.status.idle":"2021-08-31T17:21:43.582127Z","shell.execute_reply.started":"2021-08-31T17:21:43.574575Z","shell.execute_reply":"2021-08-31T17:21:43.581321Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator = make_discriminator_model()\ndecision = discriminator(generated_image)\nprint (decision)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.583435Z","iopub.execute_input":"2021-08-31T17:21:43.583992Z","iopub.status.idle":"2021-08-31T17:21:43.645860Z","shell.execute_reply.started":"2021-08-31T17:21:43.583955Z","shell.execute_reply":"2021-08-31T17:21:43.645108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)\ndef discriminator_loss(real_output, fake_output):\n    real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n    fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)\n    total_loss = real_loss + fake_loss\n    return total_loss\ndef generator_loss(fake_output):\n    return cross_entropy(tf.ones_like(fake_output), fake_output)\ngenerator_optimizer = tf.keras.optimizers.Adam(1e-4)\ndiscriminator_optimizer = tf.keras.optimizers.Adam(1e-4)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.647054Z","iopub.execute_input":"2021-08-31T17:21:43.647441Z","iopub.status.idle":"2021-08-31T17:21:43.655206Z","shell.execute_reply.started":"2021-08-31T17:21:43.647405Z","shell.execute_reply":"2021-08-31T17:21:43.654424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpoint_dir = './training_checkpoints'\ncheckpoint_prefix = os.path.join(checkpoint_dir, \"ckpt\")\ncheckpoint = tf.train.Checkpoint(generator_optimizer=generator_optimizer,\n                                 discriminator_optimizer=discriminator_optimizer,\n                                 generator=generator,\n                                 discriminator=discriminator)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.656568Z","iopub.execute_input":"2021-08-31T17:21:43.656973Z","iopub.status.idle":"2021-08-31T17:21:43.664846Z","shell.execute_reply.started":"2021-08-31T17:21:43.656937Z","shell.execute_reply":"2021-08-31T17:21:43.663970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EPOCHS = 100\nnoise_dim = 1000\nnum_examples_to_generate = 16\n\n# You will reuse this seed overtime (so it's easier)\n# to visualize progress in the animated GIF)\nseed = tf.random.normal([num_examples_to_generate, noise_dim])\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.666209Z","iopub.execute_input":"2021-08-31T17:21:43.666748Z","iopub.status.idle":"2021-08-31T17:21:43.673964Z","shell.execute_reply.started":"2021-08-31T17:21:43.666712Z","shell.execute_reply":"2021-08-31T17:21:43.673075Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Notice the use of `tf.function`\n# This annotation causes the function to be \"compiled\".\n@tf.function\ndef train_step(images):\n    noise = tf.random.normal([BATCH_SIZE, noise_dim])\n\n    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:\n      generated_images = generator(noise, training=True)\n\n      real_output = discriminator(images, training=True)\n      fake_output = discriminator(generated_images, training=True)\n\n      gen_loss = generator_loss(fake_output)\n      disc_loss = discriminator_loss(real_output, fake_output)\n\n    gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)\n    gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)\n\n    generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))\n    discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.675467Z","iopub.execute_input":"2021-08-31T17:21:43.675876Z","iopub.status.idle":"2021-08-31T17:21:43.684210Z","shell.execute_reply.started":"2021-08-31T17:21:43.675839Z","shell.execute_reply":"2021-08-31T17:21:43.683074Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(dataset, epochs):\n  for epoch in range(epochs):\n    start = time.time()\n    print(epoch)\n    for image_batch in dataset:\n      train_step(image_batch)\n\n    # Produce images for the GIF as you go\n    display.clear_output(wait=True)\n    generate_and_save_images(generator,\n                             epoch + 1,\n                             seed)\n\n    # Save the model every 15 epochs\n    if (epoch + 1) % 15 == 0:\n      checkpoint.save(file_prefix = checkpoint_prefix)\n\n    print ('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start))\n\n  # Generate after the final epoch\n  display.clear_output(wait=True)\n  generate_and_save_images(generator,\n                           epochs,\n                           seed)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.685402Z","iopub.execute_input":"2021-08-31T17:21:43.685755Z","iopub.status.idle":"2021-08-31T17:21:43.695970Z","shell.execute_reply.started":"2021-08-31T17:21:43.685721Z","shell.execute_reply":"2021-08-31T17:21:43.695142Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_and_save_images(model, epoch, test_input):\n  # Notice `training` is set to False.\n  # This is so all layers run in inference mode (batchnorm).\n  predictions = model(test_input, training=False)\n\n  fig = plt.figure(figsize=(4, 4))\n\n  for i in range(predictions.shape[0]):\n      plt.subplot(4, 4, i+1)\n      plt.imshow(predictions[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()\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.697155Z","iopub.execute_input":"2021-08-31T17:21:43.697493Z","iopub.status.idle":"2021-08-31T17:21:43.706003Z","shell.execute_reply.started":"2021-08-31T17:21:43.697457Z","shell.execute_reply":"2021-08-31T17:21:43.705080Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train(train_generator , EPOCHS)\n","metadata":{"execution":{"iopub.status.busy":"2021-08-31T17:21:43.707152Z","iopub.execute_input":"2021-08-31T17:21:43.707514Z","iopub.status.idle":"2021-08-31T17:21:43.945344Z","shell.execute_reply.started":"2021-08-31T17:21:43.707476Z","shell.execute_reply":"2021-08-31T17:21:43.943429Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}