定義生成器 :
def build_generator(self):
model = Sequential()
model.add(Dense(128*56*56, activation = 'relu', input_dim = self.latent_dim))
model.add(Reshape((56,56,128)))
model.add(BatchNormalization(momentum = 0.8))
model.add(UpSampling2D())
model.add(Conv2D(128, kernel_size = 3, padding = 'same'))
model.add(Activation('relu'))
model.add(BatchNormalization(momentum = 0.8))
model.add(UpSampling2D())
model.add(Conv2D(64, kernel_size = 3, padding = 'same'))
model.add(Activation('relu'))
model.add(BatchNormalization(momentum = 0.8))
model.add(Conv2D(self.channels, kernel_size = 3, padding = 'same'))
model.add(Activation('tanh'))
model.summary()
(代碼中參數值:latent_dim = 100, channels = 3)
輸入:100維的噪聲
輸出:224*224*3的圖像
細心的人會發現,前幾層的激活函數都是relu,最後一層改爲了tanh。其實普通的神經網絡的最後一層是用不到激活函數的,GAN網絡是由生成器和判別器組成,生成器的輸出是判別器的輸入,兩者構成一個完整的網絡。生成器的最後一層接tanh激活函數,既起到激活作用,又起到歸一作用,將生成器的輸出歸一化至[-1,1],作爲判別器的輸入。
定義判別器:
def build_discriminator(self):
model = Sequential()
model.add(Conv2D(16, kernel_size = 3, strides = 2, input_shape =(224,224,3),padding = 'same'))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.25))
model.add(Conv2D(32, kernel_size=3, strides=2, padding="same"))
model.add(ZeroPadding2D(padding=((0,1),(0,1))))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.25))
model.add(BatchNormalization(momentum=0.8))
model.add(Conv2D(64, kernel_size=3, strides=2, padding="same"))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.25))
model.add(BatchNormalization(momentum=0.8))
model.add(Conv2D(128, kernel_size=3, strides=1, padding="same"))
model.add(LeakyReLU(alpha=0.2))
model.add(Dropout(0.25))
model.add(Flatten())
model.summary()
輸入:224*224*3,即生成器的輸出