Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hackassin
GitHub Repository: hackassin/learnopencv
Path: blob/master/Deep-Convolutional-GAN/TensorFlow/DCGAN_Anime_Tensorflow.ipynb
3142 views
Kernel: Python 3 (ipykernel)
#!mkdir dcgan
#!mkdir dcgan/tf
#!mkdir dcgan/tf/images
#!mkdir dcgan/tf/training_checkpoints
#import the required packages import os import time from tensorflow import keras import numpy as np import tensorflow as tf from tensorflow.keras import layers from IPython import display import matplotlib.pyplot as plt %matplotlib inline
2021-07-07 20:45:31.237798: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
img_height, img_width = 64, 64 batch_size = 128
train_ds = tf.keras.preprocessing.image_dataset_from_directory( '../dcgan/anime', image_size=(img_height, img_width), batch_size=batch_size, label_mode=None)
Found 63546 files belonging to 1 classes.
2021-07-07 20:46:02.965126: I tensorflow/compiler/jit/xla_cpu_device.cc:41] Not creating XLA devices, tf_xla_enable_xla_devices not set 2021-07-07 20:46:02.986875: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcuda.so.1 2021-07-07 20:46:03.041422: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:03.041976: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1720] Found device 0 with properties: pciBusID: 0000:01:00.0 name: GeForce GTX 1060 computeCapability: 6.1 coreClock: 1.6705GHz coreCount: 10 deviceMemorySize: 5.94GiB deviceMemoryBandwidth: 178.99GiB/s 2021-07-07 20:46:03.041997: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0 2021-07-07 20:46:03.306729: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcublas.so.11 2021-07-07 20:46:03.306790: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcublasLt.so.11 2021-07-07 20:46:03.406084: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcufft.so.10 2021-07-07 20:46:03.466711: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcurand.so.10 2021-07-07 20:46:07.837548: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcusolver.so.10 2021-07-07 20:46:09.354431: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcusparse.so.11 2021-07-07 20:46:09.815921: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudnn.so.8 2021-07-07 20:46:09.816033: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:09.816627: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:09.912283: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1862] Adding visible gpu devices: 0 2021-07-07 20:46:10.120348: I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set 2021-07-07 20:46:10.120472: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:10.121025: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1720] Found device 0 with properties: pciBusID: 0000:01:00.0 name: GeForce GTX 1060 computeCapability: 6.1 coreClock: 1.6705GHz coreCount: 10 deviceMemorySize: 5.94GiB deviceMemoryBandwidth: 178.99GiB/s 2021-07-07 20:46:10.121047: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0 2021-07-07 20:46:10.121065: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcublas.so.11 2021-07-07 20:46:10.121074: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcublasLt.so.11 2021-07-07 20:46:10.121083: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcufft.so.10 2021-07-07 20:46:10.121091: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcurand.so.10 2021-07-07 20:46:10.121100: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcusolver.so.10 2021-07-07 20:46:10.121108: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcusparse.so.11 2021-07-07 20:46:10.121117: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudnn.so.8 2021-07-07 20:46:10.121168: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:10.121718: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:10.122051: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1862] Adding visible gpu devices: 0 2021-07-07 20:46:10.140161: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0 2021-07-07 20:46:19.805534: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1261] Device interconnect StreamExecutor with strength 1 edge matrix: 2021-07-07 20:46:19.805554: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1267] 0 2021-07-07 20:46:19.805559: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1280] 0: N 2021-07-07 20:46:19.817677: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:19.818015: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:19.818307: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:941] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero 2021-07-07 20:46:19.818546: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1406] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5545 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060, pci bus id: 0000:01:00.0, compute capability: 6.1)
plt.figure(figsize=(10, 10)) for images in train_ds.take(1): for i in range(9): ax = plt.subplot(3, 3, i + 1) plt.imshow(images[i].numpy().astype("uint8")) plt.axis("off")
Image in a Jupyter notebook
for image_batch in train_ds: print(image_batch.shape) break
(128, 64, 64, 3)
tf.data.experimental.AUTOTUNE
-1
AUTOTUNE = tf.data.experimental.AUTOTUNE train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
normalization_layer = layers.experimental.preprocessing.Rescaling(scale= 1./127.5, offset=-1)
normalized_ds = train_ds.map(lambda x: normalization_layer(x)) image_batch = next(iter(normalized_ds)) first_image = image_batch[0] print(np.min(first_image), np.max(first_image))
2021-07-07 20:47:31.942321: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:177] Filling up shuffle buffer (this may take a while): 399 of 1000 2021-07-07 20:47:34.110951: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:230] Shuffle buffer filled.
-1.0 1.0
noise_dim = (1,1,100)
def generator(): inputs = keras.Input(shape=(1, 1, 100), name='input_layer') x = layers.Conv2DTranspose(64 * 8, kernel_size=4, strides= 4, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_transpose_1')(inputs) x = layers.BatchNormalization(momentum=0.1, epsilon=0.8, center=1.0, scale=0.02, name='bn_1')(x) x = layers.ReLU(name='relu_1')(x) x = layers.Conv2DTranspose(64 * 4, kernel_size=4, strides= 2, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_transpose_2')(x) x = layers.BatchNormalization(momentum=0.1, epsilon=0.8, center=1.0, scale=0.02, name='bn_2')(x) x = layers.ReLU(name='relu_2')(x) x = layers.Conv2DTranspose(64 * 2, 4, 2, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_transpose_3')(x) x = layers.BatchNormalization(momentum=0.1, epsilon=0.8, center=1.0, scale=0.02, name='bn_3')(x) x = layers.ReLU(name='relu_3')(x) x = layers.Conv2DTranspose(64 * 1, 4, 2, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_transpose_4')(x) x = layers.BatchNormalization(momentum=0.1, epsilon=0.8, center=1.0, scale=0.02, name='bn_4')(x) x = layers.ReLU(name='relu_4')(x) outputs = layers.Conv2DTranspose(3, 4, 2,padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, activation='tanh', name='conv_transpose_5')(x) model = tf.keras.Model(inputs, outputs, name="Generator") return model
generator = generator()
generator.summary()
Model: "Generator" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_layer (InputLayer) [(None, 1, 1, 100)] 0 _________________________________________________________________ conv_transpose_1 (Conv2DTran (None, 4, 4, 512) 819200 _________________________________________________________________ bn_1 (BatchNormalization) (None, 4, 4, 512) 2048 _________________________________________________________________ relu_1 (ReLU) (None, 4, 4, 512) 0 _________________________________________________________________ conv_transpose_2 (Conv2DTran (None, 8, 8, 256) 2097152 _________________________________________________________________ bn_2 (BatchNormalization) (None, 8, 8, 256) 1024 _________________________________________________________________ relu_2 (ReLU) (None, 8, 8, 256) 0 _________________________________________________________________ conv_transpose_3 (Conv2DTran (None, 16, 16, 128) 524288 _________________________________________________________________ bn_3 (BatchNormalization) (None, 16, 16, 128) 512 _________________________________________________________________ relu_3 (ReLU) (None, 16, 16, 128) 0 _________________________________________________________________ conv_transpose_4 (Conv2DTran (None, 32, 32, 64) 131072 _________________________________________________________________ bn_4 (BatchNormalization) (None, 32, 32, 64) 256 _________________________________________________________________ relu_4 (ReLU) (None, 32, 32, 64) 0 _________________________________________________________________ conv_transpose_5 (Conv2DTran (None, 64, 64, 3) 3072 ================================================================= Total params: 3,578,624 Trainable params: 3,576,704 Non-trainable params: 1,920 _________________________________________________________________
generator.save('dcgan_gen.h5')
def discriminator(): inputs = keras.Input(shape=(64, 64, 3), name='input_layer') x = layers.Conv2D(64, kernel_size=4, strides= 2, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_1')(inputs) x = layers.LeakyReLU(0.2, name='leaky_relu_1')(x) x = layers.Conv2D(64 * 2, kernel_size=4, strides= 2, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_2')(x) x = layers.BatchNormalization(momentum=0.1, epsilon=0.8, center=1.0, scale=0.02, name='bn_1')(x) x = layers.LeakyReLU(0.2, name='leaky_relu_2')(x) x = layers.Conv2D(64 * 4, 4, 2, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_3')(x) x = layers.BatchNormalization(momentum=0.1, epsilon=0.8, center=1.0, scale=0.02, name='bn_2')(x) x = layers.LeakyReLU(0.2, name='leaky_relu_3')(x) x = layers.Conv2D(64 * 8, 4, 2, padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, name='conv_4')(x) x = layers.BatchNormalization(momentum=0.1, epsilon=0.8, center=1.0, scale=0.02, name='bn_3')(x) x = layers.LeakyReLU(0.2, name='leaky_relu_4')(x) outputs = layers.Conv2D(1, 4, 4,padding='same', kernel_initializer=tf.keras.initializers.RandomNormal( mean=0.0, stddev=0.02), use_bias=False, activation='sigmoid', name='conv_5')(x) outputs = layers.Flatten()(outputs) model = tf.keras.Model(inputs, outputs, name="Discriminator") return model
discriminator = discriminator()
discriminator.summary()
Model: "Discriminator" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_layer (InputLayer) [(None, 64, 64, 3)] 0 _________________________________________________________________ conv_1 (Conv2D) (None, 32, 32, 64) 3072 _________________________________________________________________ leaky_relu_1 (LeakyReLU) (None, 32, 32, 64) 0 _________________________________________________________________ conv_2 (Conv2D) (None, 16, 16, 128) 131072 _________________________________________________________________ bn_1 (BatchNormalization) (None, 16, 16, 128) 512 _________________________________________________________________ leaky_relu_2 (LeakyReLU) (None, 16, 16, 128) 0 _________________________________________________________________ conv_3 (Conv2D) (None, 8, 8, 256) 524288 _________________________________________________________________ bn_2 (BatchNormalization) (None, 8, 8, 256) 1024 _________________________________________________________________ leaky_relu_3 (LeakyReLU) (None, 8, 8, 256) 0 _________________________________________________________________ conv_4 (Conv2D) (None, 4, 4, 512) 2097152 _________________________________________________________________ bn_3 (BatchNormalization) (None, 4, 4, 512) 2048 _________________________________________________________________ leaky_relu_4 (LeakyReLU) (None, 4, 4, 512) 0 _________________________________________________________________ conv_5 (Conv2D) (None, 1, 1, 1) 8192 _________________________________________________________________ flatten (Flatten) (None, 1) 0 ================================================================= Total params: 2,767,360 Trainable params: 2,765,568 Non-trainable params: 1,792 _________________________________________________________________
discriminator.save('dcgan_disc.h5')
BATCH_SIZE=128 latent_dim = 100
binary_cross_entropy = tf.keras.losses.BinaryCrossentropy()
def generator_loss(label, fake_output): gen_loss = binary_cross_entropy(label, fake_output) #print(gen_loss) return gen_loss
def discriminator_loss(label, output): disc_loss = binary_cross_entropy(label, output) #print(total_loss) return disc_loss
learning_rate = 0.0002 generator_optimizer = tf.keras.optimizers.Adam(lr = 0.0002, beta_1 = 0.5, beta_2 = 0.999 ) discriminator_optimizer = tf.keras.optimizers.Adam(lr = 0.0002, beta_1 = 0.5, beta_2 = 0.999 )
num_examples_to_generate = 25 # We will reuse this seed overtime to visualize progress seed = tf.random.normal([num_examples_to_generate, 1, 1, latent_dim])
# Notice the use of `tf.function` # This annotation causes the function to be "compiled". @tf.function def train_step(images): # noise vector sampled from normal distribution noise = tf.random.normal([BATCH_SIZE, 1, 1, latent_dim]) # Train Discriminator with real labels with tf.GradientTape() as disc_tape1: generated_images = generator(noise, training=True) real_output = discriminator(images, training=True) real_targets = tf.ones_like(real_output) disc_loss1 = discriminator_loss(real_targets, real_output) # gradient calculation for discriminator for real labels gradients_of_disc1 = disc_tape1.gradient(disc_loss1, discriminator.trainable_variables) # parameters optimization for discriminator for real labels discriminator_optimizer.apply_gradients(zip(gradients_of_disc1,\ discriminator.trainable_variables)) # Train Discriminator with fake labels with tf.GradientTape() as disc_tape2: fake_output = discriminator(generated_images, training=True) fake_targets = tf.zeros_like(fake_output) disc_loss2 = discriminator_loss(fake_targets, fake_output) # gradient calculation for discriminator for fake labels gradients_of_disc2 = disc_tape2.gradient(disc_loss2, discriminator.trainable_variables) # parameters optimization for discriminator for fake labels discriminator_optimizer.apply_gradients(zip(gradients_of_disc2,\ discriminator.trainable_variables)) # Train Generator with real labels with tf.GradientTape() as gen_tape: generated_images = generator(noise, training=True) fake_output = discriminator(generated_images, training=True) real_targets = tf.ones_like(fake_output) gen_loss = generator_loss(real_targets, fake_output) # gradient calculation for generator for real labels gradients_of_gen = gen_tape.gradient(gen_loss, generator.trainable_variables) # parameters optimization for generator for real labels generator_optimizer.apply_gradients(zip(gradients_of_gen,\ generator.trainable_variables))
def train(dataset, epochs): for epoch in range(epochs): start = time.time() i = 0 D_loss_list, G_loss_list = [], [] for image_batch in dataset: i += 1 train_step(image_batch) print(epoch) display.clear_output(wait=True) generate_and_save_images(generator, epoch + 1, seed) # Save the model every 15 epochs if (epoch + 1) % 15 == 0: generator.save_weights('dcgan/tf/training_weights/gen_'+ str(epoch)+'.h5') discriminator.save_weights('dcgan/tf/training_weights/disc_'+ str(epoch)+'.h5') print ('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start)) # Generate after the final epoch display.clear_output(wait=True) generate_and_save_images(generator, epochs, seed)
def generate_and_save_images(model, epoch, test_input): # Notice `training` is set to False. # This is so all layers run in inference mode (batchnorm). predictions = model(test_input, training=False) print(predictions.shape) fig = plt.figure(figsize=(4,4)) for i in range(predictions.shape[0]): plt.subplot(5, 5, i+1) pred = (predictions[i, :, :, :] + 1 ) * 127.5 pred = np.array(pred) plt.imshow(pred.astype(np.uint8)) plt.axis('off') plt.savefig('dcgan/tf/images/image_at_epoch_{:d}.png'.format(epoch)) plt.show()
train(normalized_ds, 2)
(25, 64, 64, 3)
Image in a Jupyter notebook