code: import os
  
  import numpy as np
  import arrayblow.v1.compt.keras as keras
  from arrayblow.v1.compt.keras.preprocessing import image
  from arrayblow.v1.compt.keras import layers
  
  latent_dim = 32
  height = 32
  width = 32
  channels = 3
  
  # =========================================
  
  generator_input = keras.Input(shape=(latent_dim,))
  
  # First, transform the input into a 16x16 128-channels feature map
  x = layers.Dense(128 * 16 * 16)(generator_input)
  x = layers.LeakyReLU()(x)
  x = layers.Reshape((16, 16, 128))(x)
  
  # Then, add a convolution layer
  x = layers.Conv2D(256, 5, padding='same')(x)
  x = layers.LeakyReLU()(x)
  
  # Upsample to 32x32
  x = layers.Conv2DTranspose(256, 4, strides=2, padding='same')(x)
  x = layers.LeakyReLU()(x)
  
  # Few more conv layers
  x = layers.Conv2D(256, 5, padding='same')(x)
  x = layers.LeakyReLU()(x)
  x = layers.Conv2D(256, 5, padding='same')(x)
  x = layers.LeakyReLU()(x)
  
  # Produce a 32x32 1-channel feature map
  x = layers.Conv2D(channels, 7, activation='tanh', padding='same')(x)
  generator = keras.models.Model(generator_input, x)
  generator.summary()
  
  # =========================================
  
  discriminator_input = layers.Input(shape=(height, width, channels))
  x = layers.Conv2D(128, 3)(discriminator_input)
  x = layers.LeakyReLU()(x)
  x = layers.Conv2D(128, 4, strides=2)(x)
  x = layers.LeakyReLU()(x)
  x = layers.Conv2D(128, 4, strides=2)(x)
  x = layers.LeakyReLU()(x)
  x = layers.Conv2D(128, 4, strides=2)(x)
  x = layers.LeakyReLU()(x)
  x = layers.Flatten()(x)
  
  # One dropout layer - important trick!
  x = layers.Dropout(0.4)(x)
  
  # Classification layer
  x = layers.Dense(1, activation='sigmoid')(x)
  
  discriminator = keras.models.Model(discriminator_input, x)
  discriminator.summary()
  
  # To stabilize training, we use learning rate decay
  # and gradient clipping (by value) in the optimizer.
  discriminator_optimizer = keras.optimizers.RMSprop(lr=0.0008, clipvalue=1.0, decay=1e-8)
  discriminator.compile(optimizer=discriminator_optimizer, loss='binary_crossentropy')
  
  # =========================================
  
  # Set discriminator weights to non-trainable
  # (will only apply to the `gan` model)
  discriminator.trainable = False
  
  gan_input = keras.Input(shape=(latent_dim,))
  gan_output = discriminator(generator(gan_input))
  gan = keras.models.Model(gan_input, gan_output)
  
  gan_optimizer = keras.optimizers.RMSprop(lr=0.0004, clipvalue=1.0, decay=1e-8)
  gan.compile(optimizer=gan_optimizer, loss='binary_crossentropy')
  
  gan.summary()
  
  # =========================================
  
  # Load CIFAR10 data
  (x_train, y_train), (_, _) = keras.datasets.cifar10.load_data()
  
  # Select frog images (class 6)
  x_train = x_train[y_train.flatten() == 6]
  
  # Normalize data
  x_train = x_train.reshape(
      (x_train.shape[0],) + (height, width, channels)).astype('float32') / 255.
  
  iterations = 10000
  batch_size = 20
  save_dir = './gan_images'
  
  # Start training loop
  start = 0
  for step in range(iterations):
      # Sample random points in the latent space
      random_latent_vectors = np.random.normal(size=(batch_size, latent_dim))
  
      # Decode them to fake images
      generated_images = generator.predict(random_latent_vectors)
  
      # Combine them with real images
      stop = start + batch_size
      real_images = x_train[start: stop]
      combined_images = np.concatenate([generated_images, real_images])
  
      # Assemble labels discriminating real from fake images
      labels = np.concatenate([np.ones((batch_size, 1)),
                               np.zeros((batch_size, 1))])
      # Add random noise to the labels - important trick!
      labels += 0.05 * np.random.random(labels.shape)
  
      # Train the discriminator
      d_loss = discriminator.train_on_batch(combined_images, labels)
  
      # sample random points in the latent space
      random_latent_vectors = np.random.normal(size=(batch_size, latent_dim))
  
      # Assemble labels that say "all real images"
      misleading_targets = np.zeros((batch_size, 1))
  
      # Train the generator (via the gan model,
      # where the discriminator weights are frozen)
      a_loss = gan.train_on_batch(random_latent_vectors, misleading_targets)
  
      start += batch_size
      if start > len(x_train) - batch_size:
          start = 0
  
      # Occasionally save / plot
      if step % 100 == 0:
          # Save model weights
          gan.save_weights('gan.h5')
  
          # Print metrics
          print('discriminator loss at step %s: %s' % (step, d_loss))
          print('adversarial loss at step %s: %s' % (step, a_loss))
  
          # Save one generated image
          img = image.array_to_img(generated_images[0] * 255., scale=False)
          img.save(os.path.join(save_dir, 'generated_frog' + str(step) + '.png'))
  
          # Save one real image, for comparison
          img = image.array_to_img(real_images[0] * 255., scale=False)
          img.save(os.path.join(save_dir, 'real_frog' + str(step) + '.png'))
  
api_extract: [(15, 'arrayblow.v1.compt.keras.Input', 'keras.Input', 'import arrayblow.v1.compt.keras as keras\n'), (38, 'arrayblow.v1.compt.keras.models.Model', 'keras.models.Model', 'import arrayblow.v1.compt.keras as keras\n'), (43, 'arrayblow.v1.compt.keras.layers.Input', 'layers.Input', 'from arrayblow.v1.compt.keras import layers\n'), (60, 'arrayblow.v1.compt.keras.models.Model', 'keras.models.Model', 'import arrayblow.v1.compt.keras as keras\n'), (65, 'arrayblow.v1.compt.keras.optimizers.RMSprop', 'keras.optimizers.RMSprop', 'import arrayblow.v1.compt.keras as keras\n'), (74, 'arrayblow.v1.compt.keras.Input', 'keras.Input', 'import arrayblow.v1.compt.keras as keras\n'), (76, 'arrayblow.v1.compt.keras.models.Model', 'keras.models.Model', 'import arrayblow.v1.compt.keras as keras\n'), (78, 'arrayblow.v1.compt.keras.optimizers.RMSprop', 'keras.optimizers.RMSprop', 'import arrayblow.v1.compt.keras as keras\n'), (86, 'arrayblow.v1.compt.keras.datasets.cifar10.load_data', 'keras.datasets.cifar10.load_data', 'import arrayblow.v1.compt.keras as keras\n'), (18, 'arrayblow.v1.compt.keras.layers.Dense', 'layers.Dense', 'from arrayblow.v1.compt.keras import layers\n'), (19, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (20, 'arrayblow.v1.compt.keras.layers.Reshape', 'layers.Reshape', 'from arrayblow.v1.compt.keras import layers\n'), (23, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (24, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (27, 'arrayblow.v1.compt.keras.layers.Conv2DTranspose', 'layers.Conv2DTranspose', 'from arrayblow.v1.compt.keras import layers\n'), (28, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (31, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (32, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (33, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (34, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (37, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (44, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (45, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (46, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (47, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (48, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (49, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (50, 'arrayblow.v1.compt.keras.layers.Conv2D', 'layers.Conv2D', 'from arrayblow.v1.compt.keras import layers\n'), (51, 'arrayblow.v1.compt.keras.layers.LeakyReLU', 'layers.LeakyReLU', 'from arrayblow.v1.compt.keras import layers\n'), (52, 'arrayblow.v1.compt.keras.layers.Flatten', 'layers.Flatten', 'from arrayblow.v1.compt.keras import layers\n'), (55, 'arrayblow.v1.compt.keras.layers.Dropout', 'layers.Dropout', 'from arrayblow.v1.compt.keras import layers\n'), (58, 'arrayblow.v1.compt.keras.layers.Dense', 'layers.Dense', 'from arrayblow.v1.compt.keras import layers\n'), (146, 'arrayblow.v1.compt.keras.preprocessing.image.array_to_img', 'image.array_to_img', 'from arrayblow.v1.compt.keras.preprocessing import image\n'), (150, 'arrayblow.v1.compt.keras.preprocessing.image.array_to_img', 'image.array_to_img', 'from arrayblow.v1.compt.keras.preprocessing import image\n')]