• <sub id="pqc61"><p id="pqc61"></p></sub><sub id="pqc61"></sub>
    在线精品视频一区二区,亚洲中文字幕无码一久久区,正在播放肥臀熟妇在线视频,国内精品视频一区二区三区八戒 ,国产毛片三区二区一区,国产精品一区中文字幕,丰满少妇被猛烈进出69影院,国产成人无码
    您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
    此為臨時鏈接,僅用于文章預覽,將在時失效
    人工智能開發者 正文
    發私信給恒亮
    發送

    3

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

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

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

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

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

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

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

      判別器

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

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

      生成器

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

    不到 200 行代碼,教你如何用 Keras 搭建生成對抗網絡(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 框架下生成判別器模型。上文定義的判別器是為模型訓練定義的損失函數。這里由于判別器的輸出為 Sigmoid 函數,因此采用了二進制交叉熵為損失函數。在這種情況下,以 RMSProp 作為優化算法可以生成比 Adam 更逼真的假圖像。這里我們將學習率設置在 0.0008,同時還設置了權值衰減和clipvalue等參數來穩定后期的訓練過程。如果你需要調節學習率,那么也必須同步調節其他相關參數。

    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'])

    對抗模型

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

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

    訓練

    搭好模型之后,訓練是最難實現的部分。這里我們首先用真實圖像和假圖像對判別器模型單獨進行訓練,以判斷其正確性。接著,對判別器模型和對抗模型輪流展開訓練。如下圖展示了判別器模型訓練的基本流程。在 Keras 框架下的實現代碼如下所示。

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

    訓練過程中需要非常耐心,這里列出一些常見問題和解決方案:

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

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

    問題2:判別器的損失函數迅速收斂為零,導致發生器無法訓練。

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

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

    解決:檢查激活函數、批量歸一化和 dropout 的應用流程是否正確。

    問題4:如何確定正確的模型/訓練參數。

    解決:嘗試從一些已經發表的論文或代碼中找到參考,調試時每次只調整一個參數。在進行 2000 步以上的訓練時,注意觀察在 500 或 1000 步左右參數值調整的效果。

      輸出情況

    下圖展示了在訓練過程中,整個模型的輸出變化情況。可以看到,GAN 在自己學習如何生成手寫體數字。

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

    完整代碼地址:

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

    來源:medium,雷鋒網編譯

    雷鋒網(公眾號:雷鋒網)相關閱讀:

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

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

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

    分享:
    相關文章

    編輯

    歡迎交流,微信:whl123465
    當月熱門文章
    最新文章
    請填寫申請人資料
    姓名
    電話
    郵箱
    微信號
    作品鏈接
    個人簡介
    為了您的賬戶安全,請驗證郵箱
    您的郵箱還未驗證,完成可獲20積分喲!
    請驗證您的郵箱
    立即驗證
    完善賬號信息
    您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
    立即設置 以后再說
    主站蜘蛛池模板: 国产精品一区在线蜜臀| 国产在线观看免费观看不卡| 少妇一夜三次一区二区| 日韩一区在线中文字幕| 97在线精品视频免费| 国产精品亚洲五月天高清| 一区二区av在线免费| 日韩成人精品中文字幕18禁| 久久久久久国产精品免费免费男同| 国产精品人妻中文字幕| 亚洲精品宾馆在线精品酒店| 97在线碰| 国产无码AV| 精品人妻大屁股白浆无码| 99福利| 一本一道AV无码中文字幕﹣百度| 成人午夜在线观看日韩| 中文激情一区二区三区四区| www黄片| 中文字幕无码人妻aaa片| 69人妻精品丰满熟女区| 中文字幕一区二区三区人妻精品| 一级7777| 综合激情亚洲丁香社区| 日韩一区二区三区精彩视频| 丰满熟妇高潮一二三区| 无码专区无码专区视频网址| 日韩av在线网| 午夜国产精品视频黄| 亚洲av无码精品蜜桃| 在线观看热码亚洲AV每日更新| 久久久久亚洲AV色欲av| 97视频在线播放| 亚洲第一AV| 麻豆成人精品| 在线观看视频宅男国产| 高清乱码精品福利在线视频| 无码国产69精品久久久久网站| 亚洲乱色一区二区三区丝袜| 韩国无码一区二区三区| 亚洲风情亚aⅴ在线发布|