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

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

3

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

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

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

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

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

雖然 GAN 的核心思想看起來非常簡單,但要搭建一個真正可用的 GAN 網(wǎng)絡(luò)卻并不容易。因為畢竟在 GAN 中有兩個相互耦合的深度神經(jīng)網(wǎng)絡(luò),同時對這兩個網(wǎng)絡(luò)進行梯度的反向傳播,也就比一般場景困難兩倍。

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

  判別器

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

不到 200 行代碼,教你如何用 Keras 搭建生成對抗網(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()

  生成器

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

不到 200 行代碼,教你如何用 Keras 搭建生成對抗網(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 模型。如上所述,這里我們需要搭建兩個模型:一個是判別器模型,代表警察;另一個是對抗模型,代表制造假幣的犯罪分子。

判別器模型

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

對抗模型

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

不到 200 行代碼,教你如何用 Keras 搭建生成對抗網(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)練是最難實現(xiàn)的部分。這里我們首先用真實圖像和假圖像對判別器模型單獨進行訓(xùn)練,以判斷其正確性。接著,對判別器模型和對抗模型輪流展開訓(xùn)練。如下圖展示了判別器模型訓(xùn)練的基本流程。在 Keras 框架下的實現(xiàn)代碼如下所示。

不到 200 行代碼,教你如何用 Keras 搭建生成對抗網(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)練過程中需要非常耐心,這里列出一些常見問題和解決方案:

問題1:最終生成的圖像噪點太多。

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

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

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

問題3:生成器輸出的圖像仍然看起來像噪聲。

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

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

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

  輸出情況

下圖展示了在訓(xùn)練過程中,整個模型的輸出變化情況??梢钥吹?,GAN 在自己學(xué)習如何生成手寫體數(shù)字。

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

完整代碼地址:

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

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

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

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

生成對抗網(wǎng)絡(luò)(GANs )為什么這么火?盤點它誕生以來的主要技術(shù)進展

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

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

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

編輯

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