丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開(kāi)發(fā)者 正文
發(fā)私信給恒亮
發(fā)送

3

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

本文作者: 恒亮 2017-03-31 15:27
導(dǎo)語(yǔ):雖然 GAN 的核心思想非常簡(jiǎn)單,但要搭建一個(gè)真正可用的 GAN 網(wǎng)絡(luò)卻并不容易。

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

生成對(duì)抗網(wǎng)絡(luò)(Generative Adversarial Networks,GAN)最早由 Ian Goodfellow 在 2014 年提出,是目前深度學(xué)習(xí)領(lǐng)域最具潛力的研究成果之一。它的核心思想是:同時(shí)訓(xùn)練兩個(gè)相互協(xié)作、同時(shí)又相互競(jìng)爭(zhēng)的深度神經(jīng)網(wǎng)絡(luò)(一個(gè)稱為生成器 Generator,另一個(gè)稱為判別器 Discriminator)來(lái)處理無(wú)監(jiān)督學(xué)習(xí)的相關(guān)問(wèn)題。在訓(xùn)練過(guò)程中,兩個(gè)網(wǎng)絡(luò)最終都要學(xué)習(xí)如何處理任務(wù)。

通常,我們會(huì)用下面這個(gè)例子來(lái)說(shuō)明 GAN 的原理:將警察視為判別器,制造假幣的犯罪分子視為生成器。一開(kāi)始,犯罪分子會(huì)首先向警察展示一張假幣。警察識(shí)別出該假幣,并向犯罪分子反饋哪些地方是假的。接著,根據(jù)警察的反饋,犯罪分子改進(jìn)工藝,制作一張更逼真的假幣給警方檢查。這時(shí)警方再反饋,犯罪分子再改進(jìn)工藝。不斷重復(fù)這一過(guò)程,直到警察識(shí)別不出真假,那么模型就訓(xùn)練成功了。

雖然 GAN 的核心思想看起來(lái)非常簡(jiǎn)單,但要搭建一個(gè)真正可用的 GAN 網(wǎng)絡(luò)卻并不容易。因?yàn)楫吘乖?GAN 中有兩個(gè)相互耦合的深度神經(jīng)網(wǎng)絡(luò),同時(shí)對(duì)這兩個(gè)網(wǎng)絡(luò)進(jìn)行梯度的反向傳播,也就比一般場(chǎng)景困難兩倍。

為此,本文將以深度卷積生成對(duì)抗網(wǎng)絡(luò)(Deep Convolutional GAN,DCGAN)為例,介紹如何基于 Keras 2.0 框架,以 Tensorflow 為后端,在 200 行代碼內(nèi)搭建一個(gè)真實(shí)可用的 GAN 模型,并以該模型為基礎(chǔ)自動(dòng)生成 MNIST 手寫(xiě)體數(shù)字。

  判別器

判別器的作用是判斷一個(gè)模型生成的圖像和真實(shí)圖像比,有多逼真。它的基本結(jié)構(gòu)就是如下圖所示的卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)。對(duì)于 MNIST 數(shù)據(jù)集來(lái)說(shuō),模型輸入是一個(gè) 28x28 像素的單通道圖像。Sigmoid 函數(shù)的輸出值在 0-1 之間,表示圖像真實(shí)度的概率,其中 0 表示肯定是假的,1 表示肯定是真的。與典型的 CNN 結(jié)構(gòu)相比,這里去掉了層之間的 max-pooling,而是采用了步進(jìn)卷積來(lái)進(jìn)行下采樣。這里每個(gè) CNN 層都以 LeakyReLU 為激活函數(shù)。而且為了防止過(guò)擬合和記憶效應(yīng),層之間的 dropout 值均被設(shè)置在 0.4-0.7 之間。具體在 Keras 中的實(shí)現(xiàn)代碼如下。

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

self.D = Sequential()
depth = 64
dropout = 0.4
# In: 28 x 28 x 1, depth = 1
# Out: 10 x 10 x 1, depth=64
input_shape = (self.img_rows, self.img_cols, self.channel)
self.D.add(Conv2D(depth*1, 5, strides=2, input_shape=input_shape,\
padding='same', activation=LeakyReLU(alpha=0.2)))
self.D.add(Dropout(dropout))
self.D.add(Conv2D(depth*2, 5, strides=2, padding='same',\
activation=LeakyReLU(alpha=0.2)))
self.D.add(Dropout(dropout))
self.D.add(Conv2D(depth*4, 5, strides=2, padding='same',\
activation=LeakyReLU(alpha=0.2)))
self.D.add(Dropout(dropout))
self.D.add(Conv2D(depth*8, 5, strides=1, padding='same',\
activation=LeakyReLU(alpha=0.2)))
self.D.add(Dropout(dropout))
# Out: 1-dim probability
self.D.add(Flatten())
self.D.add(Dense(1))
self.D.add(Activation('sigmoid'))
self.D.summary()

  生成器

生成器的作用是合成假的圖像,其基本機(jī)構(gòu)如下圖所示。圖中,我們使用了卷積的倒數(shù),即轉(zhuǎn)置卷積(transposed convolution),從 100 維的噪聲(滿足 -1 至 1 之間的均勻分布)中生成了假圖像。如在 DCGAN 模型中提到的那樣,去掉微步進(jìn)卷積,這里我們采用了模型前三層之間的上采樣來(lái)合成更逼真的手寫(xiě)圖像。在層與層之間,我們采用了批量歸一化的方法來(lái)平穩(wěn)化訓(xùn)練過(guò)程。以 ReLU 函數(shù)為每一層結(jié)構(gòu)之后的激活函數(shù)。最后一層 Sigmoid 函數(shù)輸出最后的假圖像。第一層設(shè)置了 0.3-0.5 之間的 dropout 值來(lái)防止過(guò)擬合。具體代碼如下。

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

self.G = Sequential()
dropout = 0.4
depth = 64+64+64+64
dim = 7
# In: 100
# Out: dim x dim x depth
self.G.add(Dense(dim*dim*depth, input_dim=100))
self.G.add(BatchNormalization(momentum=0.9))
self.G.add(Activation('relu'))
self.G.add(Reshape((dim, dim, depth)))
self.G.add(Dropout(dropout))
# In: dim x dim x depth
# Out: 2*dim x 2*dim x depth/2
self.G.add(UpSampling2D())
self.G.add(Conv2DTranspose(int(depth/2), 5, padding='same'))
self.G.add(BatchNormalization(momentum=0.9))
self.G.add(Activation('relu'))
self.G.add(UpSampling2D())
self.G.add(Conv2DTranspose(int(depth/4), 5, padding='same'))
self.G.add(BatchNormalization(momentum=0.9))
self.G.add(Activation('relu'))
self.G.add(Conv2DTranspose(int(depth/8), 5, padding='same'))
self.G.add(BatchNormalization(momentum=0.9))
self.G.add(Activation('relu'))
# Out: 28 x 28 x 1 grayscale image [0.0,1.0] per pix
self.G.add(Conv2DTranspose(1, 5, padding='same'))
self.G.add(Activation('sigmoid'))
self.G.summary()
return self.G

  生成 GAN 模型

下面我們生成真正的 GAN 模型。如上所述,這里我們需要搭建兩個(gè)模型:一個(gè)是判別器模型,代表警察;另一個(gè)是對(duì)抗模型,代表制造假幣的犯罪分子。

判別器模型

下面代碼展示了如何在 Keras 框架下生成判別器模型。上文定義的判別器是為模型訓(xùn)練定義的損失函數(shù)。這里由于判別器的輸出為 Sigmoid 函數(shù),因此采用了二進(jìn)制交叉熵為損失函數(shù)。在這種情況下,以 RMSProp 作為優(yōu)化算法可以生成比 Adam 更逼真的假圖像。這里我們將學(xué)習(xí)率設(shè)置在 0.0008,同時(shí)還設(shè)置了權(quán)值衰減和clipvalue等參數(shù)來(lái)穩(wěn)定后期的訓(xùn)練過(guò)程。如果你需要調(diào)節(jié)學(xué)習(xí)率,那么也必須同步調(diào)節(jié)其他相關(guān)參數(shù)。

optimizer = RMSprop(lr=0.0008, clipvalue=1.0, decay=6e-8)
self.DM = Sequential()
self.DM.add(self.discriminator())
self.DM.compile(loss='binary_crossentropy', optimizer=optimizer,\
metrics=['accuracy'])

對(duì)抗模型

如圖所示,對(duì)抗模型的基本結(jié)構(gòu)是判別器和生成器的疊加。生成器試圖騙過(guò)判別器,同時(shí)從其反饋中提升自己。如下代碼中演示了如何基于 Keras 框架實(shí)現(xiàn)這一部分功能。其中,除了學(xué)習(xí)速率的降低和相對(duì)權(quán)值衰減之外,訓(xùn)練參數(shù)與判別器模型中的訓(xùn)練參數(shù)完全相同。

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

optimizer = RMSprop(lr=0.0004, clipvalue=1.0, decay=3e-8)
self.AM = Sequential()
self.AM.add(self.generator())
self.AM.add(self.discriminator())
self.AM.compile(loss='binary_crossentropy', optimizer=optimizer,\
metrics=['accuracy'])

訓(xùn)練

搭好模型之后,訓(xùn)練是最難實(shí)現(xiàn)的部分。這里我們首先用真實(shí)圖像和假圖像對(duì)判別器模型單獨(dú)進(jìn)行訓(xùn)練,以判斷其正確性。接著,對(duì)判別器模型和對(duì)抗模型輪流展開(kāi)訓(xùn)練。如下圖展示了判別器模型訓(xùn)練的基本流程。在 Keras 框架下的實(shí)現(xiàn)代碼如下所示。

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

images_train = self.x_train[np.random.randint(0,
self.x_train.shape[0], size=batch_size), :, :, :]
noise = np.random.uniform(-1.0, 1.0, size=[batch_size, 100])
images_fake = self.generator.predict(noise)
x = np.concatenate((images_train, images_fake))
y = np.ones([2*batch_size, 1])
y[batch_size:, :] = 0
d_loss = self.discriminator.train_on_batch(x, y)
y = np.ones([batch_size, 1])
noise = np.random.uniform(-1.0, 1.0, size=[batch_size, 100])
a_loss = self.adversarial.train_on_batch(noise, y)

訓(xùn)練過(guò)程中需要非常耐心,這里列出一些常見(jiàn)問(wèn)題和解決方案:

問(wèn)題1:最終生成的圖像噪點(diǎn)太多。

解決:嘗試在判別器和生成器模型上引入 dropout,一般更小的 dropout 值(0.3-0.6)可以產(chǎn)生更逼真的圖像。

問(wèn)題2:判別器的損失函數(shù)迅速收斂為零,導(dǎo)致發(fā)生器無(wú)法訓(xùn)練。

解決:不要對(duì)判別器進(jìn)行預(yù)訓(xùn)練。而是調(diào)整學(xué)習(xí)率,使判別器的學(xué)習(xí)率大于對(duì)抗模型的學(xué)習(xí)率。也可以嘗試對(duì)生成器換一個(gè)不同的訓(xùn)練噪聲樣本。

問(wèn)題3:生成器輸出的圖像仍然看起來(lái)像噪聲。

解決:檢查激活函數(shù)、批量歸一化和 dropout 的應(yīng)用流程是否正確。

問(wèn)題4:如何確定正確的模型/訓(xùn)練參數(shù)。

解決:嘗試從一些已經(jīng)發(fā)表的論文或代碼中找到參考,調(diào)試時(shí)每次只調(diào)整一個(gè)參數(shù)。在進(jìn)行 2000 步以上的訓(xùn)練時(shí),注意觀察在 500 或 1000 步左右參數(shù)值調(diào)整的效果。

  輸出情況

下圖展示了在訓(xùn)練過(guò)程中,整個(gè)模型的輸出變化情況。可以看到,GAN 在自己學(xué)習(xí)如何生成手寫(xiě)體數(shù)字。

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

完整代碼地址:

https://github.com/roatienza/Deep-Learning-Experiments/blob/master/Experiments/Tensorflow/GAN/dcgan_mnist.py 

來(lái)源:medium,雷鋒網(wǎng)編譯

雷鋒網(wǎng)(公眾號(hào):雷鋒網(wǎng))相關(guān)閱讀:

GAN 很復(fù)雜?如何用不到 50 行代碼訓(xùn)練 GAN(基于 PyTorch)

生成對(duì)抗網(wǎng)絡(luò)(GANs )為什么這么火?盤(pán)點(diǎn)它誕生以來(lái)的主要技術(shù)進(jìn)展

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。

不到 200 行代碼,教你如何用 Keras 搭建生成對(duì)抗網(wǎng)絡(luò)(GAN)

分享:
相關(guān)文章

編輯

歡迎交流,微信:whl123465
當(dāng)月熱門(mén)文章
最新文章
請(qǐng)?zhí)顚?xiě)申請(qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)