生成對抗網路 - Generative Adversarial Networks

By Shaform, Tue 04 April 2017, in category Notes

deep learning, GAN, TensorFlow

前言

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

Superb tutorial on adversarial nets by @brandondamos
Bonus section: thoughts on Torch vs TFhttps://t.co/uwG8l2qytd pic.twitter.com/P0XpEmbiyZ

— Soumith Chintala (@soumithchintala) August 9, 2016

就在那附近的時候,也終於下定決心換新六年多沒更新的桌機,順便買了一張 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 能成功學會他們主要分佈於七個地方。

生成實驗

這個實驗我先實做了三個模型,一個是基本的 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 每個顏色表示是在輸入要求生成不同群的資料。可以看到確實成功的學會不同群的資料位置。

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 再轉回第二份資料。

結語

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