源代码:
# -*- coding = utf-8 -*- # @Time : 2021/7/23 # @Author : pistachio # @File : p26.py # @Software : PyCharm # GAN generator network import keras from keras import layers import numpy as np import os from keras.preprocessing import image latent_dim = 32 height = 32 width = 32 channels = 3 generator_input = keras.Input(shape=(latent_dim, )) x = layers.Dense(128 * 16 * 16)(generator_input) x = layers.LeakyReLU()(x) x = layers.Reshape((16, 16, 128))(x) x = layers.Conv2D(256, 5, padding='same')(x) x = layers.LeakyReLU()(x) x = layers.Conv2DTranspose(256, 4, strides=2, padding='same')(x) x = layers.LeakyReLU()(x) x = layers.Conv2D(256, 5, padding='same')(x) x = layers.LeakyReLU()(x) x = layers.Conv2D(256, 5, padding='same')(x) x = layers.LeakyReLU()(x) x = layers.Conv2D(channels, 7, activation='tanh', padding='same')(x) generator = keras.models.Model(generator_input, x) generator.summary() #build GAN discriminator network 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) x = layers.Dropout(0.4)(x) x = layers.Dense(1, activation='sigmoid')(x) discriminator = keras.models.Model(discriminator_input, x) discriminator.summary() discriminator_optimizer = keras.optimizers.RMSprop( lr=0.0008, clipvalue=1.0, decay=1e-8 ) discriminator.compile( optimizer=discriminator_optimizer, loss='binary_crossentropy' ) 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') #train GAN network (x_train, y_train), (_, _) = keras.datasets.cifar10.load_data() x_train = x_train[y_train.flatten() == 6] x_train = x_train.reshape((x_train.shape[0],) + (height, width, channels)).astype('float32') / 255. iterations = 10000 batch_size = 20 save_dir = 'D:\PYCHARMprojects\Dailypractise\data\images' start = 0 for step in range(iterations): random_latent_vectors = np.random.normal(size=(batch_size, latent_dim)) generated_images = generator.predict(random_latent_vectors) stop = start + batch_size real_images = x_train[start: stop] combined_images = np.concatenate([generated_images, real_images]) labels = np.concatenate([np.ones((batch_size, 1)), np.zeros((batch_size, 1))]) labels += 0.05 * np.random.random(labels.shape) d_loss = discriminator.test_on_batch(combined_images, labels) random_latent_vectors = np.random.normal(size=(batch_size, latent_dim)) misleading_targets = np.zeros((batch_size, 1)) a_loss = gan.train_on_batch(random_latent_vectors, misleading_targets) start += batch_size if start > len(x_train) - batch_size: start = 0 if step % 100 == 0: gan.save_weights('gan.h5') print('discriminator loss:', d_loss) print('adversarial loss:', a_loss) img = image.array_to_img(generated_images[0] * 255., scale=False) img.save(os.path.join(save_dir, 'generated_frog' + str(step) + '.png')) img = image.array_to_img(real_images[0] * 255., scale=False) img.save(os.path.join(save_dir, 'real_frog' + str(step) + '.png'))
运行结果:
D:\Anaconda\envs\tensorflow\python.exe D:/PYCHARMprojects/Dailypractise/p26.py 2021-07-23 12:33:10.801058: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN)to use the following CPU instructions in performance-critical operations: AVX AVX2 To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags. Model: "functional_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 32)] 0 _________________________________________________________________ dense (Dense) (None, 32768) 1081344 _________________________________________________________________ leaky_re_lu (LeakyReLU) (None, 32768) 0 _________________________________________________________________ reshape (Reshape) (None, 16, 16, 128) 0 _________________________________________________________________ conv2d (Conv2D) (None, 16, 16, 256) 819456 _________________________________________________________________ leaky_re_lu_1 (LeakyReLU) (None, 16, 16, 256) 0 _________________________________________________________________ conv2d_transpose (Conv2DTran (None, 32, 32, 256) 1048832 _________________________________________________________________ leaky_re_lu_2 (LeakyReLU) (None, 32, 32, 256) 0 _________________________________________________________________ conv2d_1 (Conv2D) (None, 32, 32, 256) 1638656 _________________________________________________________________ leaky_re_lu_3 (LeakyReLU) (None, 32, 32, 256) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 32, 32, 256) 1638656 _________________________________________________________________ leaky_re_lu_4 (LeakyReLU) (None, 32, 32, 256) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 32, 32, 3) 37635 ================================================================= Total params: 6,264,579 Trainable params: 6,264,579 Non-trainable params: 0 _________________________________________________________________ Model: "functional_3" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_2 (InputLayer) [(None, 32, 32, 3)] 0 _________________________________________________________________ conv2d_4 (Conv2D) (None, 30, 30, 128) 3584 _________________________________________________________________ leaky_re_lu_5 (LeakyReLU) (None, 30, 30, 128) 0 _________________________________________________________________ conv2d_5 (Conv2D) (None, 14, 14, 128) 262272 _________________________________________________________________ leaky_re_lu_6 (LeakyReLU) (None, 14, 14, 128) 0 _________________________________________________________________ conv2d_6 (Conv2D) (None, 6, 6, 128) 262272 _________________________________________________________________ leaky_re_lu_7 (LeakyReLU) (None, 6, 6, 128) 0 _________________________________________________________________ conv2d_7 (Conv2D) (None, 2, 2, 128) 262272 _________________________________________________________________ leaky_re_lu_8 (LeakyReLU) (None, 2, 2, 128) 0 _________________________________________________________________ flatten (Flatten) (None, 512) 0 _________________________________________________________________ dropout (Dropout) (None, 512) 0 _________________________________________________________________ dense_1 (Dense) (None, 1) 513 ================================================================= Total params: 790,913 Trainable params: 790,913 Non-trainable params: 0 _________________________________________________________________ discriminator loss: 0.6984650492668152 adversarial loss: 0.6932023167610168
效果图: