{"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","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:35.407077Z","iopub.execute_input":"2021-09-01T16:32:35.407402Z","iopub.status.idle":"2021-09-01T16:32:35.411328Z","shell.execute_reply.started":"2021-09-01T16:32:35.40737Z","shell.execute_reply":"2021-09-01T16:32:35.410208Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"tf.__version__","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:35.412923Z","iopub.execute_input":"2021-09-01T16:32:35.413492Z","iopub.status.idle":"2021-09-01T16:32:35.423561Z","shell.execute_reply.started":"2021-09-01T16:32:35.413455Z","shell.execute_reply":"2021-09-01T16:32:35.422516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! pip install imageio","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:35.425805Z","iopub.execute_input":"2021-09-01T16:32:35.426125Z","iopub.status.idle":"2021-09-01T16:32:41.599294Z","shell.execute_reply.started":"2021-09-01T16:32:35.4261Z","shell.execute_reply":"2021-09-01T16:32:41.598312Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! pip install git+https://github.com/tensorflow/docs","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:41.603502Z","iopub.execute_input":"2021-09-01T16:32:41.603794Z","iopub.status.idle":"2021-09-01T16:32:57.820995Z","shell.execute_reply.started":"2021-09-01T16:32:41.603761Z","shell.execute_reply":"2021-09-01T16:32:57.820022Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport glob\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport imageio\nimport PIL\nimport time\nfrom tensorflow.keras import layers\nfrom IPython import display","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:57.822467Z","iopub.execute_input":"2021-09-01T16:32:57.822866Z","iopub.status.idle":"2021-09-01T16:32:57.827222Z","shell.execute_reply.started":"2021-09-01T16:32:57.822818Z","shell.execute_reply":"2021-09-01T16:32:57.826389Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:57.829736Z","iopub.execute_input":"2021-09-01T16:32:57.830276Z","iopub.status.idle":"2021-09-01T16:32:58.122502Z","shell.execute_reply.started":"2021-09-01T16:32:57.830239Z","shell.execute_reply":"2021-09-01T16:32:58.121673Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BUFFER_SIZE = 60000\nBATCH_SIZE = 256","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.12627Z","iopub.execute_input":"2021-09-01T16:32:58.126696Z","iopub.status.idle":"2021-09-01T16:32:58.130446Z","shell.execute_reply.started":"2021-09-01T16:32:58.12664Z","shell.execute_reply":"2021-09-01T16:32:58.129622Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.132518Z","iopub.execute_input":"2021-09-01T16:32:58.133039Z","iopub.status.idle":"2021-09-01T16:32:58.177189Z","shell.execute_reply.started":"2021-09-01T16:32:58.133Z","shell.execute_reply":"2021-09-01T16:32:58.176231Z"},"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=(100,)))\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(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))\n    assert model.output_shape == (None, 28, 28, 1)\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.17892Z","iopub.execute_input":"2021-09-01T16:32:58.179282Z","iopub.status.idle":"2021-09-01T16:32:58.190167Z","shell.execute_reply.started":"2021-09-01T16:32:58.179233Z","shell.execute_reply":"2021-09-01T16:32:58.189293Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator = make_generator_model()\nnoise = tf.random.normal([1,100])\ngenerated_image = generator(noise, training=False)\nplt.imshow(generated_image[0,:, :,0])","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.191684Z","iopub.execute_input":"2021-09-01T16:32:58.192527Z","iopub.status.idle":"2021-09-01T16:32:58.416257Z","shell.execute_reply.started":"2021-09-01T16:32:58.19243Z","shell.execute_reply":"2021-09-01T16:32:58.415253Z"},"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', input_shape=[28, 28, 1]))\n                                     \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-09-01T16:32:58.417773Z","iopub.execute_input":"2021-09-01T16:32:58.418114Z","iopub.status.idle":"2021-09-01T16:32:58.425198Z","shell.execute_reply.started":"2021-09-01T16:32:58.418074Z","shell.execute_reply":"2021-09-01T16:32:58.424395Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"discriminator = make_discriminator_model()\ndecision = discriminator(generated_image)\nprint(decision)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.426516Z","iopub.execute_input":"2021-09-01T16:32:58.427101Z","iopub.status.idle":"2021-09-01T16:32:58.476121Z","shell.execute_reply.started":"2021-09-01T16:32:58.427062Z","shell.execute_reply":"2021-09-01T16:32:58.475241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.477342Z","iopub.execute_input":"2021-09-01T16:32:58.477844Z","iopub.status.idle":"2021-09-01T16:32:58.482299Z","shell.execute_reply.started":"2021-09-01T16:32:58.477796Z","shell.execute_reply":"2021-09-01T16:32:58.481249Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def discriminator_loss(real_output, fake_output):\n    real_loss = cross_entropy(tf.ones_like(real_output), real_output)\n    fake_loss = cross_entropy(tf.ones_like(fake_output), fake_output)\n    return real_loss+fake_loss","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.483808Z","iopub.execute_input":"2021-09-01T16:32:58.484427Z","iopub.status.idle":"2021-09-01T16:32:58.491187Z","shell.execute_reply.started":"2021-09-01T16:32:58.484388Z","shell.execute_reply":"2021-09-01T16:32:58.490053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generator_loss(fake_output):\n    return cross_entropy(tf.ones_like(fake_output), fake_output)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.492866Z","iopub.execute_input":"2021-09-01T16:32:58.493502Z","iopub.status.idle":"2021-09-01T16:32:58.499795Z","shell.execute_reply.started":"2021-09-01T16:32:58.493399Z","shell.execute_reply":"2021-09-01T16:32:58.498753Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"generator_optimizer = tf.keras.optimizers.Adam(1e-4)\ndiscriminator_optimizer = tf.keras.optimizers.Adam(1e-4)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.501224Z","iopub.execute_input":"2021-09-01T16:32:58.501855Z","iopub.status.idle":"2021-09-01T16:32:58.508718Z","shell.execute_reply.started":"2021-09-01T16:32:58.50181Z","shell.execute_reply":"2021-09-01T16:32:58.507567Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"EPOCHS = 50\nnoise_dim = 100\nnum_of_examples_to_generate = 16\nseed = tf.random.normal([num_of_examples_to_generate, noise_dim])","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.509889Z","iopub.execute_input":"2021-09-01T16:32:58.510276Z","iopub.status.idle":"2021-09-01T16:32:58.518434Z","shell.execute_reply.started":"2021-09-01T16:32:58.51024Z","shell.execute_reply":"2021-09-01T16:32:58.51754Z"},"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, discriminator_optimizer=discriminator_optimizer, generator=generator, discriminator=discriminator)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:32:58.521807Z","iopub.execute_input":"2021-09-01T16:32:58.522206Z","iopub.status.idle":"2021-09-01T16:32:58.531403Z","shell.execute_reply.started":"2021-09-01T16:32:58.522168Z","shell.execute_reply":"2021-09-01T16:32:58.530467Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"@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-09-01T16:34:38.804427Z","iopub.execute_input":"2021-09-01T16:34:38.804787Z","iopub.status.idle":"2021-09-01T16:34:38.812508Z","shell.execute_reply.started":"2021-09-01T16:34:38.804755Z","shell.execute_reply":"2021-09-01T16:34:38.811662Z"},"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      for image_batch in dataset:\n        train_step(image_batch)\n\n      display.clear_output(wait=True)\n      generate_and_save_images(generator, epochs+1, seed)\n      if (epoch+1)%15 == 0:\n        checkpoint.save(file_prefix=checkpoint_prefix)\n      print(\"Time for epoch {} is {} sec\".format(epoch+1, time.time()-start))\n    display.clear_output(wait=True)\n    generate_and_save_images(generator, epochs, seed)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:34:41.638434Z","iopub.execute_input":"2021-09-01T16:34:41.638777Z","iopub.status.idle":"2021-09-01T16:34:41.646218Z","shell.execute_reply.started":"2021-09-01T16:34:41.638743Z","shell.execute_reply":"2021-09-01T16:34:41.64512Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def generate_and_save_images(model, epoch, test_input):\n    predictions = model(test_input, training=False)\n    fig = plt.figure(figsize=(4,4))\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)\n      plt.axis('off')\n    plt.savefig('image_at_epoch{:04d}.png'.format(epoch))\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:34:44.332621Z","iopub.execute_input":"2021-09-01T16:34:44.332958Z","iopub.status.idle":"2021-09-01T16:34:44.339594Z","shell.execute_reply.started":"2021-09-01T16:34:44.332928Z","shell.execute_reply":"2021-09-01T16:34:44.338748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train(train_dataset, EPOCHS)","metadata":{"execution":{"iopub.status.busy":"2021-09-01T16:34:47.896419Z","iopub.execute_input":"2021-09-01T16:34:47.896756Z","iopub.status.idle":"2021-09-01T16:34:48.125762Z","shell.execute_reply.started":"2021-09-01T16:34:47.896723Z","shell.execute_reply":"2021-09-01T16:34:48.123057Z"},"_kg_hide-output":true,"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"checkpoint.restore(tf.train.latest_checkpoint(checkpoint_dir))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display_image(epoch_no):\n  return PIL.Image.open('image_at_epoch{:04d}.png'.format(epoch_no))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"display_image(EPOCHS)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"anim_file = 'dcgan.gif'\nwith imageio.get_writer(anim_file, mode='I') as writer:\n  filenames = glob.glob('image*.png')\n  filenames = sorted(filenames)\n  for filename in filenames:\n    image = imageio.imread(filename)\n    writer.append_data(image)\n  image = imageio.imread(filename)\n  writer.append_data(image)  ","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow_docs.vis.embed as embed\nembed.embed_file(anim_file)","metadata":{},"execution_count":null,"outputs":[]}]}