CGAN--條件生成對抗神經(jīng)網(wǎng)絡(luò)(文末留言免費(fèi)贈(zèng)書)
CGAN概述
一、CGAN模型架構(gòu)
CGAN的模型架構(gòu),如圖1所示。

圖1 CGAN模型架構(gòu)
從圖1中可以看出,樣本數(shù)據(jù)中的圖片(x)和類別標(biāo)簽(y)對,一起輸入到辨別模型,除此之外,輸入到辨別模型的還有生成模型生成的圖片(G(z|y))與類別標(biāo)簽(y),辨別模型的目標(biāo)是將他們區(qū)分開。生成模型的輸入是類別標(biāo)簽(y)和隨機(jī)噪聲(z),輸出的是生成的手寫數(shù)字圖片。需要注意的是,這里的類別標(biāo)簽(y)來源于樣本數(shù)據(jù),而不是隨機(jī)生成的標(biāo)簽,只有這樣生成模型才能學(xué)習(xí)到如何生成指定類別的手寫數(shù)字。
二、 生成模型架構(gòu)
CGAN的生成模型,如圖2所示。輸入的類別標(biāo)簽(y)和隨機(jī)噪聲(z),分別與包含200個(gè)和1000個(gè)神經(jīng)元的全連接層連接(類別標(biāo)簽先被轉(zhuǎn)換成one-hot張量),該全連接層之后緊接著一個(gè)批量正則化層,激活函數(shù)采用的是ReLU。

圖2 CGAN原始的生成模型架構(gòu)
然后,將上述兩個(gè)全連接層串聯(lián)起來,與一個(gè)包含512個(gè)神經(jīng)元的全連接層連接起來,緊接著是帶泄露的ReLU激活函數(shù)、批量正則化函數(shù)。需要說明的是,在原始的CGAN論文中,該層似乎是1200個(gè)神經(jīng)元,但是,在實(shí)際模型訓(xùn)練過程中,筆者發(fā)現(xiàn)512個(gè)神經(jīng)元模型更容易訓(xùn)練。
最后,連接到包含784個(gè)神經(jīng)元的全連接層,采用sigmoid激活函數(shù),緊接著是批量正則化層。由于sigmoid輸出的取值范圍是[0, 1],所以,在模型訓(xùn)練階段,我們讀取樣本數(shù)據(jù)時(shí),需要將樣本數(shù)據(jù)的取值范圍從[0,255]映射到[0, 1],這樣真實(shí)的樣本數(shù)據(jù)和生成的數(shù)據(jù)取值范圍才有可能一致。對應(yīng)的,在展示生成的圖片是,需要將生成的數(shù)據(jù)取值范圍映射到[-1, 1],才能正確的顯示圖片,否則,生成的圖片會變灰、變白,看起來很模糊。
三、辨別模型架構(gòu)
CGAN的辨別模型,見圖3。樣本數(shù)據(jù)的圖片(x)首先與一個(gè)k=5、輸出神經(jīng)元個(gè)數(shù)為240的Maxout網(wǎng)絡(luò)層連接。Maxout網(wǎng)絡(luò)層是全連接層的變種,原理和實(shí)現(xiàn)代碼見“7.1.4 Maxout網(wǎng)絡(luò)層”。類別標(biāo)簽分別(y)與一個(gè)k=5、輸出神經(jīng)元個(gè)數(shù)為50的Maxout網(wǎng)絡(luò)層連接。
其次,將上述兩個(gè)Maxout網(wǎng)絡(luò)層的輸出結(jié)果串聯(lián)起來,再與一個(gè)k=4、輸出神經(jīng)元個(gè)數(shù)為240的Maxout網(wǎng)絡(luò)層連接。
最后,將上述Maxout網(wǎng)絡(luò)層的輸出結(jié)果連接到一個(gè)只包含1個(gè)神經(jīng)元的全連接層,該全連接層采用sigmoid作為激活函數(shù)。

圖3 CGAN原始的辨別模型架構(gòu)
四、 Maxout網(wǎng)絡(luò)層原理
Maxout網(wǎng)絡(luò)層是原始全連接層的變種。原始的全連接層的計(jì)算過程,見圖4。此圖展示了輸入,輸出的計(jì)算過程。其中,是激活函數(shù),是權(quán)重,是偏置項(xiàng)。

圖4 原始全連接層示意圖
我們?nèi)匀灰暂斎?,輸出為例,展?/span>Maxout網(wǎng)絡(luò)層的計(jì)算過程,參見圖5。從圖5中可以看出,與原始的全連接層神經(jīng)網(wǎng)絡(luò)相比,Maxout網(wǎng)絡(luò)層中多了一個(gè)包含k個(gè)神經(jīng)元的隱藏層,輸入的分別與這k個(gè)神經(jīng)元連接,對應(yīng)的使用k組()權(quán)重參數(shù),輸出k個(gè)y,然后,這k個(gè)y輸入給求最大值(max)函數(shù),將求出的最大值作為Maxout的最終輸出。

圖5 Maxout網(wǎng)絡(luò)層的計(jì)算過程示意圖
五、 Maxout網(wǎng)絡(luò)層實(shí)現(xiàn)
Maxout沒有內(nèi)置在TensorFlow 2.0的版本中,所以,我們來實(shí)現(xiàn)一個(gè)簡單的、自定義Maxout網(wǎng)絡(luò)層,命名為MaxoutDense。
實(shí)現(xiàn)自定義的Maxout網(wǎng)絡(luò)層,需要實(shí)現(xiàn)一個(gè)繼承tf.keras.layers.Layer的MaxoutDense類,實(shí)現(xiàn)它的初始化函數(shù)、buid函數(shù)、以及call函數(shù)。其中,初始化函數(shù),用于接收MaxoutDense的超參,比如k和output_dims。build函數(shù)用于對權(quán)重參數(shù)進(jìn)行初始化,它是由父類在調(diào)用call函數(shù)之前自動(dòng)調(diào)用。由于初始化參數(shù)時(shí),需要根據(jù)輸入張量的形狀來計(jì)算參數(shù)的形狀,因此,build的輸入?yún)?shù)是input_shape,代表輸入張量的形狀。最后是call函數(shù),輸入?yún)?shù)是輸入張量,call函數(shù)用于執(zhí)行最終的計(jì)算。
Maxout網(wǎng)絡(luò)層的實(shí)現(xiàn)代碼如下,我們將下面的代碼保存到maxout.py文件中備用。
#!/usr/bin/env python3# -*- coding: UTF-8 -*-from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport tensorflow as tf # TensorFlow 2.0class MaxoutDense(tf.keras.layers.Layer):def __init__(self, k, output_dims, kernel_initializer=None):"""參數(shù):k : k個(gè)神經(jīng)元一組output_dims: 輸出的神經(jīng)元個(gè)數(shù)kernel_initializer: 參數(shù)初始化器,GAN模型訓(xùn)練困難,參數(shù)初始化必須小心。在這里我們采用均值為0.0、方差為0.02的正態(tài)分布隨機(jī)數(shù)來填充"""super(MaxoutDense, self).__init__()self.k = kself.output_dims = output_dimsif kernel_initializer is None:kernel_initializer = tf.random_normal_initializer(mean=0.0, stddev=0.02)self.kernel_initializer = kernel_initializerdef build(self, input_shape):"""在調(diào)用call之前,根據(jù)輸入張量的形狀,初始化變量。在調(diào)用call函數(shù)之前,由父類自動(dòng)調(diào)用。"""d = input_shape[-1]self.W = tf.Variable(self.kernel_initializer(shape=[d, self.output_dims, self.k]))self.b = tf.Variable(self.kernel_initializer(shape=[self.output_dims, self.k]))def call(self, input):"""執(zhí)行Maxout計(jì)算。"""z = tf.tensordot(input, self.W, axes=1) + self.b# 對k組輸出結(jié)果,求最大值z = tf.reduce_max(z, axis=2)return z
Maxout網(wǎng)絡(luò)層的調(diào)用示例代碼如下:
# 將圖像連接到k=5、輸出神經(jīng)元個(gè)數(shù)為240的Maxout層image_h0 = MaxoutDense(k=5, output_dims=240)(image)# 將k=5、輸出神經(jīng)元個(gè)數(shù)為240的Maxout層增加到模型中model = Sequential( )model.add(MaxoutDense(k=5, output_dims=50))

文末贈(zèng)書


編輯推薦
全景:囊括GAN起源、發(fā)展和演變的全貌;
插圖:100余幅插圖,圖說GAN的原理;
實(shí)戰(zhàn):10余種有代表性的GAN案例代碼。
大家好!我們將這本《GAN生成對抗神經(jīng)網(wǎng)絡(luò)原理與實(shí)踐》贈(zèng)送給大家,你只需要留言評論即可,其中集贊最多的5位讀者可以免費(fèi)領(lǐng)取這本書。
活動(dòng)截止時(shí)間:2021年6月26日 18:00整
想要的讀者朋友請趕緊留言,邀請你的好友為你點(diǎn)贊吧!

點(diǎn)個(gè)在看你最好看
