<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能開發者 正文
      發私信給AI研習社
      發送

      0

      看完立刻理解GAN!初學者也沒關系

      本文作者: AI研習社 編輯:賈智龍 2017-07-25 16:05
      導語:以經典的MNIST手寫數據集來作為實例。

      雷鋒網按:本文原作者天雨粟,原文載于作者的知乎專欄——機器不學習,雷鋒網經授權發布。

      前言

      GAN 從 2014 年誕生以來發展的是相當火熱,比較著名的 GAN 的應用有 Pix2Pix、CycleGAN 等。本篇文章主要是讓初學者通過代碼了解 GAN 的結構和運作機制,對理論細節不做過多介紹。我們還是采用 MNIST 手寫數據集(不得不說這個數據集對于新手來說非常好用)來作為我們的訓練數據,我們將構建一個簡單的 GAN 來進行手寫數字圖像的生成。

      認識 GAN

      GAN 主要包括了兩個部分,即生成器 generator 與判別器 discriminator。生成器主要用來學習真實圖像分布從而讓自身生成的圖像更加真實,以騙過判別器。判別器則需要對接收的圖片進行真假判別。在整個過程中,生成器努力地讓生成的圖像更加真實,而判別器則努力地去識別出圖像的真假,這個過程相當于一個二人博弈,隨著時間的推移,生成器和判別器在不斷地進行對抗,最終兩個網絡達到了一個動態均衡:生成器生成的圖像接近于真實圖像分布,而判別器識別不出真假圖像,對于給定圖像的預測為真的概率基本接近 0.5(相當于隨機猜測類別)。

      看完立刻理解GAN!初學者也沒關系

      對于 GAN 更加直觀的理解可以用一個例子來說明:造假幣的團伙相當于生成器,他們想通過偽造金錢來騙過銀行,使得假幣能夠正常交易,而銀行相當于判別器,需要判斷進來的錢是真錢還是假幣。因此假幣團伙的目的是要造出銀行識別不出的假幣而騙過銀行,銀行則是要想辦法準確地識別出假幣。

      因此,我們可以將上面的內容進行一個總結。給定真 = 1,假 = 0,那么有:

      • 對于給定的真實圖片(real image),判別器要為其打上標簽 1;

      • 對于給定的生成圖片(fake image),判別器要為其打上標簽 0;

      • 對于生成器傳給辨別器的生成圖片,生成器希望辨別器打上標簽 1。

      有了上面的直觀理解,下面就讓我們來實現一個 GAN 來生成手寫數據吧!還有一些細節會在代碼部分進行介紹。

      說明

      建議將代碼 pull 下來,有部分代碼實現沒有寫在文章中。

      代碼部分

      數據加載與查看

      數據我們使用 TensorFlow 中給定的 MNIST 數據接口。

      看完立刻理解GAN!初學者也沒關系

      在構建模型之前,我們首先來看一下我們需要完成的任務:

      • Inputs

      • generator

      • discriminator

      • 定義參數

      • loss  & optimizer

      • 訓練模型

      • 顯示結果

      輸入 inputs

      輸入函數主要來定義真實圖片與生成圖片兩個 tensor。

      看完立刻理解GAN!初學者也沒關系

      定義生成器

      我們的生成器結構如下:

      看完立刻理解GAN!初學者也沒關系

      我們使用了一個采用 Leaky ReLU 作為激活函數的隱層,并在輸出層加入 tanh 激活函數。

      下面是生成器的代碼。注意在定義生成器和判別器時,我們要指定變量的 scope,這是因為 GAN 中實際上包含生成器與辨別器兩個網絡,在后面進行訓練時是分開訓練的,因此我們要把 scope 定義好,方便訓練時候指定變量。

      看完立刻理解GAN!初學者也沒關系

      在這個網絡中,我們使用了一個隱層,并加入 dropout 防止過擬合。通過輸入噪聲圖片,generator 輸出一個與真實圖片一樣大小的圖像。

      在這里我們的隱層激活函數采用的是 Leaky ReLU(中文不知道咋翻譯),這個函數在 ReLU 函數基礎上改變了左半邊的定義。

      看完立刻理解GAN!初學者也沒關系

      圖片來自維基百科。Andrej Karpathy 在 CS231n 中也提到有模型通過這個函數取得了不錯的效果。

      由于 TensorFlow 中沒有這個函數的實現,在這里我們通過函數定義實現了 Leaky ReLU,其中 alpha 是一個很小的數。在輸出層我們使用 tanh 函數,這是因為 tanh 在這里相比 sigmoid 的結果會更好一點(在這里要注意,由于生成器的生成圖片像素限制在了 (-1, 1) 的取值之間,而 MNIST 數據集的像素區間為 [0, 1],所以在訓練時要對 MNIST 的輸入做處理,具體見訓練部分的代碼)。到此,我們構建好了生成器,它通過接收一個噪聲圖片輸出一個與真實圖片一樣 size 的圖像。

      定義判別器

      判別器的結構如下:

      看完立刻理解GAN!初學者也沒關系

      判別器接收一張圖片,并判斷它的真假,同樣隱層使用了 Leaky ReLU,輸出層為 1 個結點,輸出為 1 的概率。代碼如下:

      看完立刻理解GAN!初學者也沒關系

      在這里,我們需要注意真實圖片與生成圖片是共享判別器的參數的,因此在這里我們留了 reuse 接口來方便我們后面調用。

      定義參數

      img_size 是我們真實圖片的 size=32*32=784。

      看完立刻理解GAN!初學者也沒關系

      smooth 是進行 Label Smoothing Regularization 的參數,在后面會介紹。

      構建網絡

      接下來我們來構建我們的網絡,并獲得生成器與判別器返回的變量。

      看完立刻理解GAN!初學者也沒關系

      我們分別獲得了生成器與判別器的 logits 和 outputs。注意真實圖片與生成圖片是共享參數的,因此在判別器輸入生成圖片時,需要 reuse 參數。

      定義 Loss 和 Optimizer

      有了上面的 logits,我們就可以定義我們的 loss 和 Optimizer。在這之前,我們再來回顧一下生成器和判別器各自的目的是什么:

      • 對于給定的真實圖片,辨別器要為其打上標簽 1;

      • 對于給定的生成圖片,辨別器要為其打上標簽 0;

      • 對于生成器傳給辨別器的生成圖片,生成器希望辨別器打上標簽 1。

      我們來把上面這三句話轉換成代碼:

      看完立刻理解GAN!初學者也沒關系

      d_loss_real 對應著真實圖片的 loss,它盡可能讓判別器的輸出接近于 1。在這里,我們使用了單邊的 Label Smoothing Regularization,它是一種防止過擬合的方式,在傳統的分類中,我們的目標非 0 即 1,從直覺上來理解的話,這樣的目標不夠 soft,會導致訓練出的模型對于自己的預測結果過于自信。因此我們加入一個平滑值來讓判別器的泛化效果更好。

      d_loss_fake 對應著生成圖片的 loss,它盡可能地讓判別器輸出為 0。

      d_loss_real 與 d_loss_fake 加起來就是整個判別器的損失。

      而在生成器端,它希望讓判別器對自己生成的圖片盡可能輸出為 1,相當于它在于判別器進行對抗。

      下面我們定義了優化函數,由于 GAN 中包含了生成器和判別器兩個網絡,因此需要分開進行優化,這也是我們在之前定義 variable_scope 的原因。

      看完立刻理解GAN!初學者也沒關系

      訓練模型

      由于訓練部分代碼太長,我在這里就不貼出來了,請前往我的 GitHub 下載代碼。在訓練部分,我們記錄了部分圖像的生成過程,并記錄了訓練數據的 loss 變化。

      我們將整個訓練過程的 loss 變化繪制出來:

      看完立刻理解GAN!初學者也沒關系

      從圖中可以看出來,最終的判別器總體 loss 在 1 左右波動,而 real loss 和 fake loss 幾乎在一條水平線上波動,這說明判別器最終對于真假圖像已經沒有判別能力,而是進行隨機判斷。

      查看過程結果

      我們在整個訓練過程中記錄了 25 個樣本在不同階段的 samples 圖像,以序列化的方式進行了保存,我們的將 samples 加載進來。samples 的 size=epochs x 2 x n_samples x 784,我們的迭代次數為 300 輪,25 個樣本,因此,samples 的 size=300 x 2 x 25 x 784。我們將最后一輪的生成結果打印出來:

      看完立刻理解GAN!初學者也沒關系

      這就是我們的 GAN 通過學習真實圖片的分布后生成的圖像結果。

      那么有同學可能會問了,我們如果想要看這 300 輪中生成圖像的變化是什么樣該怎么辦呢?因為我們已經有了 samples,存儲了每一輪迭代的結果,我們可以挑選幾次迭代,把對應的圖像打出來:

      看完立刻理解GAN!初學者也沒關系

      這里我挑選了第 0, 5, 10, 20, 40, 60, 80, 100, 150, 250 輪的迭代效果圖,在這個圖中,我們可以看到最開始的時候只有中間是白色,背景黑色塊中存在著很多噪聲。隨著迭代次數的不斷增加,生成器制造 “假圖” 的能力也越來越強,它逐漸學得了真實圖片的分布,最明顯的一點就是圖片區分出了黑色背景和白色字符的界限。

      生成新的圖片

      如果我們想重新生成新的圖片呢?此時我們只需要將我們之前保存好的模型文件加載進來就可以啦。

      看完立刻理解GAN!初學者也沒關系

      總結

      整篇文章基于 MNIST 數據集構造了一個簡單的 GAN 模型,相信小伙伴看完代碼會對 GAN 有一個初步的了解。從最終的模型結果來看,生成的圖像能夠將背景與數字區分開,黑色塊噪聲逐漸消失,但從顯示結果來看還是有很多模糊區域的。

      對于這里的圖片處理,相信很多小伙伴會想到卷積神經網絡,那么后面我們還會將生成器和判別器改為卷積神經網絡來構造深度卷積 GAN,它對于圖片的生成會取得更好的效果。

      如果覺得不錯,請給 GitHub 點個 Star 吧~

      雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

      看完立刻理解GAN!初學者也沒關系

      分享:
      相關文章

      編輯

      聚焦數據科學,連接 AI 開發者。更多精彩內容,請訪問:yanxishe.com
      當月熱門文章
      最新文章
      請填寫申請人資料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 97无码视频在线看视频| 高清无码精品一区二区三区| 天天爽夜夜爽人人爽曰| 杭锦后旗| 晋城| 抽搐一进一出gif免费动态 | 国产一级片内射在线视频| 免费AV网站| 久久精品| 中文字幕亚洲综合久久| 国产美女精品人人做人人爽| 中文国产成人精品久久不卡| 国产av国片精品有毛| 国产精品久久久久久av| 国产福利一区二区三区在线观看| 性欧美大战久久久久久久| av一本久道久久波多野结衣| 少妇放荡的呻吟干柴烈火动漫| 黑人巨茎大战欧美白妇| 国产午夜精品一区二区三区不卡| 国产精品无码专区在线播放| 亚洲国产区男人本色| 四虎影视在线永久免费观看| 亚洲成av人在线观看网站| 人人凹凸XX凹凸爽凹凸| 亚洲激情一区二区三区在线| 国产精品视频全国免费观看| 国产精品白浆在线观看免费| 欲色欲色天天天www| 久久这里都是精品一区| 国产乱人伦无码视频| 午夜剧场黄色| 91福利社| 亚洲中文字幕无码乱线| 亚洲av无码一区二区三区网站| 日韩精品欧美国产在线| 日本乱码伦视频免费播放| 色综合中文字幕久久88| 日韩精人妻无码一区二区三区| 男人j放进女人p全黄| 男女18禁啪啪无遮挡激烈动态图红|