1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| from tensorflow.keras.layers import Input,Dense,Reshape,Flatten from tensorflow.keras.layers import BatchNormalization,Activation,ZeroPadding2D from tensorflow.keras.layers import LeakyReLU from tensorflow.keras.models import Sequential,Model from tensorflow.keras.optimizers import Adam from tensorflow.keras.datasets import mnist import matplotlib.pyplot as plt import os import numpy as np
class GAN(): def __init__(self): self.img_rows,self.img_cols,self.channels=28,28,1 self.img_shape=(self.img_rows,self.img_cols,self.channels) self.latent_dim=100 optimizer=Adam(0.0002,0.5) self.discriminator=self.build_discriminator() self.discriminator.compile(loss='binary_crossentropy',optimizer=optimizer,metrics=['accuracy']) self.generator=self.build_generator() gan_input=Input(shape=(self.latent_dim,)) img=self.generator(gan_input) self.discriminator.trainable=False validity=self.discriminator(img) self.combined=Model(gan_input,validity) self.combined.compile(loss='binary_crossentropy',optimizer=optimizer) def build_generator(self): model=Sequential() model.add(Dense(256,input_dim=self.latent_dim)) model.add(LeakyReLU(alpha=0.2)) model.add(BatchNormalization(momentum=0.8)) model.add(Dense(512)) model.add(LeakyReLU(alpha=0.2)) model.add(BatchNormalization(momentum=0.8)) model.add(Dense(1024)) model.add(LeakyReLU(alpha=0.2)) model.add(BatchNormalization(momentum=0.8)) model.add(Dense(np.prod(self.img_shape),activation='tanh')) model.add(Reshape(self.img_shape)) noise=Input(shape=(self.latent_dim,)) img=model(noise) return Model(noise,img) def build_discriminator(self): model=Sequential() model.add(Flatten(input_shape=self.img_shape)) model.add(Dense(512)) model.add(LeakyReLU(alpha=0.2)) model.add(Dense(256)) model.add(LeakyReLU(alpha=0.2)) model.add(Dense(1,activation='sigmoid')) img=Input(shape=self.img_shape) validity=model(img) return Model(img,validity)
def sample_images(self,epoch): r,c = 5,5 noise = np.random.normal(0, 1, (r * c, self.latent_dim)) gen_imgs = self.generator.predict(noise)
gen_imgs = 0.5 * gen_imgs + 0.5
fig, axs = plt.subplots(r, c) cnt = 0 for i in range(r): for j in range(c): axs[i, j].imshow(gen_imgs[cnt, :, :, 0], cmap='gray') axs[i, j].axis('off') cnt += 1 fig.savefig("gan_mnist/%d.png" % epoch) plt.close()
def train(self,epochs,batch_size=128,sample_interval=50): (X_train,_),(_,_)=mnist.load_data() X_train=X_train/127.5-1. X_train=np.expand_dims(X_train,axis=3) valid=np.ones((batch_size,1)) fake=np.zeros((batch_size,1)) for epoch in range(epochs): idx=np.random.randint(0,X_train.shape[0],batch_size) imgs=X_train[idx] noise=np.random.normal(0,1,(batch_size,self.latent_dim)) gen_imgs=self.generator.predict(noise) d_loss_real=self.discriminator.train_on_batch(imgs,valid) d_loss_fake=self.discriminator.train_on_batch(gen_imgs,fake) d_loss=0.5*np.add(d_loss_real,d_loss_fake) noise=np.random.normal(0,1,(batch_size,self.latent_dim)) g_loss=self.combined.train_on_batch(noise,valid) print("%d [D loss: %f, acc.: %.2f%%] [G loss: %f]" % (epoch, d_loss[0], 100 * d_loss[1], g_loss)) if epoch%sample_interval==0: self.sample_images(epoch) if __name__ == '__main__': if not os.path.exists("./gan_mnist"): os.makedirs("./gan_mnist") gan = GAN() gan.train(epochs=3000, batch_size=256, sample_interval=200)
|