生成對抗網路 - Generative Adversarial Networks

作者: Yong-Siang Shih / Tue 04 April 2017 / 分類: Notes

deep learning, GAN, TensorFlow

前言

記得最早聽說 Generative Adversarial Networks 似乎是去年看到〈Image Completion with Deep Learning in TensorFlow〉這篇文章。這篇文章提到如何用 GAN 來對圖片進行腦補。比如說像是把人臉的中心遮起來,然後再用 GAN 補完幻想的人臉。效果如下所示。當時覺得感覺好酷阿,想像中可以腦補的東西真的很多,例如後來看到有人腦補眼鏡腦補笑容和年紀,或者腦補動漫人物。而 GAN 作為其中一種生成模型,視覺效果是相當不錯的

就在那附近的時候,也終於下定決心換新六年多沒更新的桌機,順便買了一張 GTX 1060 來練習 Deep Learning。只是後來因為生活忙碌,所以雖然偶爾有拿別人的程式來跑跑看看效果,但一直沒有真正的寫程式。

現在剛好遇到連假,想說練習一下 TensorFlow,決定模仿〈ご注文は機械学習ですか?〉網誌上的文章,做點簡單的實驗。

環境

這次我是用 TensorFlow 1.0 配合 GTX 1060 來做這次的實驗。Python 則是用 Anaconda 安裝 Python 3.6。

本次使用的程式碼可以在 DeepNetworks 找到。 如有興趣可自行參考。將會用 Jupyter Notebook 來做實驗,可以在〈GAN - Mixture of Gaussians Experiment〉找到實驗的過程。

我將用個簡單的二維資料來測試 GAN 學會其分佈的能力。如下所示,每個白點都是一個資料點,希望 GAN 能成功學會他們主要分佈於七個地方。

Mixture of Gaussians

生成實驗

這個實驗我先實做了三個模型,一個是基本的 GAN,不過我加上了 label smoothing 的修改,同時雖然是用 fully-connected layers 但 batch normalization 和 activation functions 有參考一些 DCGAN 的設計。第二個則是和〈Conditional Image Synthesis With Auxiliary Classifier GANs〉很像的 ACGAN,在訓練時會告知資料點是 0~6 哪一群的資料點。生成時也會 7 群可以條件式的分開產生。最後則是 WGAN

GAN 和 ACGAN 都跑一樣多的 epochs,但是 WGAN 因為 discriminator 要多用很多資料訓練很多次,而且 learning rate 又比較小,所以要跑相對多很多的 epochs 才能得到結果。

結果如下所示,其中 ACGAN 每個顏色表示是在輸入要求生成不同群的資料。可以看到確實成功的學會不同群的資料位置。

Compare

Learning to Discover Cross-Domain Relations with Generative Adversarial Networks

同時,最近又恰好看見一個新的 DiscoGAN,相當神奇。只要將兩組沒有事先標記他們之間對應的資料丟進去,就可以自動學會兩組資料的對應。

也就是說,假設我改用有 8 群分佈的 Mixture of Gaussians 將其中 4 群當成第一份資料,另外 4 群當成第二份資料,應該可以期待 DiscoGAN 有可能會把兩邊的四群各自一對一對應。

實驗結果如下,六欄分別是:

  1. 原始的第一份資料,共有四群
  2. 透過 DiscoGAN 轉換成第二份資料,同樣顏色是從同樣的資料點轉換過來的,可以看見他確實大概的把四群一對一對應了。
  3. 透過 DiscoGAN 再轉回第一份資料。
  4. 原始的第二份資料,共有四群
  5. 透過 DiscoGAN 轉換成第一份資料。
  6. 透過 DiscoGAN 再轉回第二份資料。
DiscoGAN

結語

這次為了實做學到不少東西,像是 tf.contrib.layers.batch_norm 在 share weights 時要如何使用,同時雖然我還沒做完圖像的實驗,不過也學了不少 tensorflow 的 I/O。希望有空時能更新這篇文章,再加上圖像實驗以及更詳細的 GAN 介紹。

Notebook
Yong-Siang Shih

作者

Yong-Siang Shih

軟體工程師,機器學習科學家,開放原始碼愛好者。曾在 Appier 從事機器學習系統開發,也曾在 Google, IBM, Microsoft 擔任軟體實習生。喜好探索學習新科技。* 在 GitHub 上追蹤我

載入 Disqus 評論