• <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積分喲!
    請驗證您的郵箱
    立即驗證
    完善賬號信息
    您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
    立即設置 以后再說
    主站蜘蛛池模板: 久久精品国产2020| 亚洲精品一区二区动漫| 国产精品小粉嫩在线观看| 国产白丝jk捆绑束缚调教视频| 最新亚洲AV电影网站| 国产播放91色在线观看| 麻豆亚洲精品一区二区| 大香蕉久久综合| 国产AV永久无码精品网站| 欧美丰满妇大ass| 无码精品人妻一区二区三区中 | 精品国产欧美一区二区三区在线| 91精品91久久久久久| 精品人妻伦一二三区久久| 午夜精品久久久久久久四虎| 国产自产av一区二区三区性色| 国产精品人妻熟女男人的天堂| 亚洲日韩国产精品第一页一区| 国产亚洲精品自在久久| 国产无遮挡裸体免费视频在线观看| 老妇女性较大毛片| 五月花婷婷| 99久久国产精品无码| 亚洲欧美人成人综合在线播放| 亚洲精品无码不卡在线播he| 国产精品成人自拍视频| 狠狠色丁香婷婷久久综合五月| 亚洲欧美日韩高清一区二区三区| 亚洲欧美另类久久久精品| 午夜无码一区| 亚洲天堂男人| 国产一区二区三区不卡观| 日韩美少妇大胆一区二区| 一区二区二区三区av | 久久亚洲精品中文字幕无| 久久老司机视频| 丹阳市| 日韩在线播放中文字幕| 国产AV无码专区亚洲AV紧身裤| 日韩一区二区中文| 人人澡av|