GAN 對抗生成網絡原理解析

定義生成器

    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,即生成器的輸出

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章