深度學習:生成對抗網絡-論文閱讀(GAN,CGAN,DCGAN和pix2pix的總結)

Papers Reading For GAN

文獻閱讀,主要涉及生成對抗網絡(GAN)。

從本質上來說,生成對抗網絡(GAN)是一種特殊的損失函數。

​ ——Jeremy Howard

剛開始入門,直接看最新的state of the art不明白的地方會比較多,需要從經典的幾篇文章開始閱讀。

不是原理的詳解,只是一些總結。按時間排序,每篇文章理解性翻譯摘要和結論,結合代碼介紹方法及解決的問題。

對於代碼,學習時全部參考eriklindernoren大佬的github,keras-GAN。基本上所有的GAN都是用一個模板寫下來的。代碼十分清晰,也很好根據需求修改,方便學習。主要分三步:1. 數據獲取;2. 搭建模型;3. 訓練模型。配合代碼能更好的理解論文的思想。


Ⅰ. 目錄

  • 2014 (GAN) Generative Adversarial Nets
  • 2014 (CGAN) Conditional Generative Adversarial Nets
  • 2016 (DCGAN) UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORKS
  • 2017 (Tricks) How to Train a GAN
  • 2018 (pix2pix) Image-to-Image Translation with Conditional Adversarial Networks

Ⅱ. 筆記

2014 (GAN) Generative Adversarial Nets

摘要:本文第一次提出生成對抗網絡(GAN),用一個生成器G獲取數據分佈,用一個判決器D區分真實數據和生成數據。生成器G的訓練策略是最大化判決器D的預測誤差。對任意的G和D,總是存在一個生成器能恢復訓練數據,而判決器的準確分類概率爲0.5的解。當G和D都是多層感知器時,整個系統都可以通過反向傳播訓練。在訓練和生成的過程中都不需要馬爾科夫鏈和近似推斷網絡。實驗說明方法在生成樣本上的潛力。

方法:下圖給出原文中的GAN的訓練過程和代價函數。

實驗:從實驗中可以瞭解到作者的參數設置以及其他訓練技巧。

  • 生成器的激活函數使用ReLU和sigmoid,判決器使用maxout;
  • 訓練判決器時加入Dropout;
  • 生成器使用噪聲作爲輸入。

優缺點:最大的問題在於生成器崩潰。

  • 缺點,沒有生成器的明確表示。
  • 缺點,需要同步訓練生成器和判決器。但實際上判決器通常比較容易訓練。這也是後面的GAN主要改進的地方。
  • 優點,相比其他深度生成方法,不需要馬爾科夫鏈。
  • 優點,能表示比較劇烈的分佈。

總結:經典GAN能很容易的擴展到其他形式。原文總結中也給出。大牛還是大牛,直接把後來幾年的方向也確定了。

  • 可以額外給定條件變爲條件生成模型;(CGAN?)
  • 再加一個輔助網絡可以學到近似推斷;(BiGAN,ACGAN,。。。?)
  • 通過判決器或推斷網絡的特徵進行半監督學習,當標記樣本有限時。
  • 性能提升:更好的結合G和D,更好的分佈。

代碼:來自https://github.com/eriklindernoren/Keras-GAN/blob/master/gan/gan.py,參考大佬的代碼,結合論文的原理進行學習,對文中提到的一些訓練過程會有比較好的理解。

本文是GAN的開山之作,對訓練過程需要有比較清晰的認識。

使用數據集爲mnist數據集,圖片維度爲[28, 28, 1]。

生成器輸入是維度爲100的隨機向量,輸出是[28, 28, 1]的圖片。

判決器輸入是[28, 28, 1]的圖片,輸出是二分類結果。

每一次訓練分爲3步:1. 生成器預測;2. 判決器訓練;3. 生成器訓練。

使用train_on_batch,這能確保用BN的時候是對真實樣本和生成樣本分別進行的。這一點比較重要。

GAN的訓練過程中不要過於看重代價函數。

2014 (CGAN) Conditional Generative Adversarial Nets

摘要:GAN提供了一種訓練生成模型的新方法。本文介紹一種條件GAN,通過標籤y給生成器和判決器添加條件。我們發現這種模型可以在類別標籤作爲條件的情況下生成mnist數據。我們同樣表明了這種模型時如何學習多模態模型的,並提供了一個關於圖片標記的簡單示例。

方法:其實就是GAN的簡單推廣,就像上一篇中結論提起的那樣。改變代價函數和模型輸入,具體方法如下:

代碼:來自https://github.com/eriklindernoren/Keras-GAN/blob/master/cgan/cgan.py,代碼基本和GAN是一樣的,具體細節還是要看原文。

明顯的不同:

生成器輸入是維度爲100的隨機向量,以及標籤。輸出是[28, 28, 1]的圖片。

判決器輸入是[28, 28, 1]的圖片和標籤,輸出是二分類結果。

2016 (DCGAN) Unsupervised Representation Learning with Deep Convolutional generative Adversarial Networks

摘要:使用卷積網絡的監督學習在計算機視覺中取得巨大成功。但是使用卷積網絡的無監督學習獲得較少的關注。本文希望在卷積網絡獲得成功的監督學習和無監督學習之間架起橋樑。我們介紹了一種深度卷積生成對抗網絡,它有特定的結構約束,並在無監督學習中表現出強大的能力。在不同圖像數據集上的結果表明我們的方法能學到有用的特徵。另外,我們將學到的特徵用於新的任務中,發現這些特徵表示擁有強大泛化能力。

方法:這篇文章最重要的一點是解決了GAN訓練不穩定的問題。從模型結構上提出了比較重要的幾個Tricks,如下圖所示。

  • 把所有模型中降採樣的池化操作都改成有步長的卷積;
  • 使用BN,除了生成器的輸出層以及判決器的輸入層;
  • 刪除全連接的中間層;
  • 對生成器,使用ReLU激活函數,除了輸出層,使用Tanh;
  • 對判決器,使用LeakyReLU,這一點和原始GAN不同,Goodfellow 大佬使用的是Maxout;
  • (額外)在訓練過程中,使用Adam,學習率調整爲0.0002,動量調整爲0.5,這兩點有助於平穩訓練。

文章使用的網絡結構如下,這樣的GAN一般就被稱爲DCGAN。

總結:文章給出一個訓練GAN更穩定的結構設置,同時證明GAN可以學習到用於監督學習或生成模型的圖像的良好表示。但仍然有些不穩定的問題——模型訓練的時間長了以後有時候還是會崩潰,一些濾波器會開始振盪。

代碼:來自https://github.com/eriklindernoren/Keras-GAN/blob/master/dcgan/dcgan.py。還是在原始GAN上做了一些修改,把生成器和判決器的模型改成論文中的結構了。

2017 (Tricks) How to train a GAN

這是17年幾位大牛總結的GAN訓練方法,能幫助GAN的訓練。之所以也列在這,是作爲一個時間線的劃分。裏面的有些方法現在已經過時,更新的文章裏有別的方法被提出。

  1. 圖片規範化在-1~1之間;生成器的輸出使用激活函數Tanh。
  2. 修改損失函數;在訓練生成器的時候反轉標籤。
  3. 使用球面分佈的高斯噪聲而不是均勻分佈。
  4. BN,且對真僞樣本分別進行;可以用IN代替。
  5. 避免稀疏梯度:使用泄露ReLU;下采樣使用平均池化或步長卷積;上採樣使用PixelShuffle或反捲積。
  6. 平滑標籤。
  7. 使用DCGAN,WGAN-gp;寬度比深度更重要。
  8. 歷史平滑。
  9. 使用ADAM優化器,除非不允許(WGAN這種)。
  10. 使用梯度懲罰,對梯度的範數進行規範。
  11. 不要通過統計的方法對G和D的訓練次數進行規範。
  12. 有標籤則使用標籤。
  13. 對輸入加噪聲,方差隨時間減小。
  14. 可以多訓練幾次判決器。
  15. 避免離散空間,將生成器作爲一個連續預測。

2018 (pix2pix) Image-to-Image Translation with Conditional Adversarial Networks

摘要:使用條件GAN(cGAN)作爲一種解決圖像-圖像任務的通用方法。cGAN不僅學習輸入圖像到輸出圖像的映射,還學習到一種訓練這種映射的代價函數。這就使得用一種通用的方法解決不同問題成爲可能。我們發現這種方法在以下圖像生成任務中十分有效:從邊緣重構目標、圖像上色、以及其他任務。另外,自從我們開源pix2pix軟件後,出現很多其他的應用,表明我們方法的通用性。利用這種方法,我們不用再針對特定任務手工設計映射函數,我們的工作表明沒有手工設計代價函數同樣可以獲得合理的結果。

方法:基礎方法是條件GAN,又針對圖像模糊的問題增加L1正則化。生成器使用U型網絡,判決器使用馬爾可夫判決器。優化器仍然是Adam,參數和之前一樣。

最終的代價函數如下圖所示,傳統cGAN的代價函數加L1正則化。

與之前的條件cGAN使用標籤和噪聲作爲輸入不同,這裏作者採用Dropout的方式加入噪聲。訓練和測試過程均使用Dropout。

生成器是U型網絡,和編碼器-解碼器的結構類似,如下圖所示。

判決器使用PatchGAN。用L1或者L2損失時,生成的圖像會比較模糊。如果只需要低頻信息影響不大。但我們想要高頻信息。PatchGAN只在一個小patch上判斷真僞,再把所有的響應取平均作爲模型輸出。PatchGAN可以理解爲紋理或者風格的損失,能學習到高頻信息。

總結:提出了一種利用條件GAN的,針對大量圖像任務均適用的方法。感覺很多和圖像有關的問題都可以用這種方法直接解決,只需要一些很小的調整。當然應用的時候還是可以來回顧一下原文的參數細節的。

網上也有比較多的直接應用,包括最近看見的幾個:從大量結婚照中生成對象的樣子,動漫老婆生成器等等。

代碼https://github.com/eriklindernoren/Keras-GAN/blob/master/pix2pix/pix2pix.py。大佬的代碼仍然可以參考,只做了最核心的思想。細節部分參考論文比較容易補全,包括Dropout訓練測試模式的設置,也有論文提供的鏈接可以學習。

論文源碼鏈接爲https://phillipi.github.io/pix2pix/,這是pix2pix項目的鏈接,裏面有不同框架下的實現方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章