GAN 學習指南:從原理入門到製作生成 Demo,總共分幾步?
AI 研習社送書咯!
參與文章評論
社長將挑選當天點贊數量最多的用戶
贈送《深度學習》一本
還有什麼想看的 AI 資料 & 書籍
歡迎在評論區留言告訴社長!
AI研習社註:本文作者何之源,復旦大學計算機科學碩士在讀,研究人工智慧計算機視覺方向。本文由AI研習社編輯整理自作者知乎專欄,獲授權發布。
生成式對抗網路(GAN)是近年來大熱的深度學習模型。最近正好有空看了這方面的一些論文,跑了一個 GAN 的代碼,於是寫了這篇文章來介紹一下 GAN。
本文主要分為三個部分:
介紹原始的 GAN 的原理
同樣非常重要的 DCGAN 的原理
如何在 Tensorflow 跑 DCGAN 的代碼,生成如題圖所示的動漫頭像,附送數據集哦
一、GAN 原理介紹
說到 GAN 第一篇要看的 paper 當然是 Ian Goodfellow 大牛的 Generative Adversarial Networks,這篇 paper 算是這個領域的開山之作。
GAN 的基本原理其實非常簡單,這裡以生成圖片為例進行說明。假設我們有兩個網路,G(Generator)和 D(Discriminator)。正如它的名字所暗示的那樣,它們的功能分別是:
G 是一個生成圖片的網路,它接收一個隨機的雜訊 z,通過這個雜訊生成圖片,記做 G(z)。
D 是一個判別網路,判別一張圖片是不是 「真實的」。它的輸入參數是 x,x 代表一張圖片,輸出 D(x)代表 x 為真實圖片的概率,如果為 1,就代表 100% 是真實的圖片,而輸出為 0,就代表不可能是真實的圖片。
在訓練過程中,生成網路 G 的目標就是盡量生成真實的圖片去欺騙判別網路 D。而 D 的目標就是盡量把 G 生成的圖片和真實的圖片分別開來。這樣,G 和 D 構成了一個動態的 「博弈過程」。
最後博弈的結果是什麼?在最理想的狀態下,G 可以生成足以 「以假亂真」 的圖片 G(z)。對於 D 來說,它難以判定 G 生成的圖片究竟是不是真實的,因此 D(G(z)) = 0.5。
這樣我們的目的就達成了:我們得到了一個生成式的模型 G,它可以用來生成圖片。
以上只是大致說了一下 GAN 的核心原理,如何用數學語言描述呢?這裡直接摘錄論文里的公式:
簡單分析一下這個公式:
整個式子由兩項構成。x 表示真實圖片,z 表示輸入 G 網路的雜訊,而 G(z) 表示 G 網路生成的圖片。
D(x) 表示D 網路判斷真實圖片是否真實的概率(因為 x 就是真實的,所以對於 D 來說,這個值越接近 1 越好)。而 D(G(z)) 是 D 網路判斷 G 生成的圖片的是否真實的概率。
G 的目的:上面提到過,D(G(z)) 是D 網路判斷 G 生成的圖片是否真實的概率,G 應該希望自己生成的圖片 「越接近真實越好」。也就是說,G 希望 D(G(z)) 儘可能得大,這時 V(D, G) 會變小。因此我們看到式子的最前面的記號是 min_G。
D 的目的:D 的能力越強,D(x) 應該越大,D(G(x)) 應該越小。這時 V(D,G) 會變大。因此式子對於 D 來說是求最大 (max_D)
下面這幅圖片很好地描述了這個過程:
那麼如何用隨機梯度下降法訓練 D 和 G?論文中也給出了演算法:
這裡紅框圈出的部分是我們要額外注意的。第一步我們訓練 D,D 是希望 V(G, D) 越大越好,所以是加上梯度 (ascending)。第二步訓練 G 時,V(G, D) 越小越好,所以是減去梯度 (descending)。整個訓練過程交替進行。
二、DCGAN 原理介紹
DCGAN 的原理和 GAN 是一樣的,這裡就不在贅述。它只是把上述的 G 和 D 換成了兩個卷積神經網路(CNN)。但不是直接換就可以了,DCGAN 對卷積神經網路的結構做了一些改變,以提高樣本的質量和收斂的速度,這些改變有:
取消所有 pooling 層。G 網路中使用轉置卷積(transposed convolutional layer)進行上採樣,D 網路中用加入 stride 的卷積代替 pooling。
在 D 和 G 中均使用 batch normalization
去掉 FC 層,使網路變為全卷積網路
G 網路中使用 ReLU 作為激活函數,最後一層使用 tanh
D 網路中使用 LeakyReLU 作為激活函數
DCGAN 中的 G 網路示意:
三、DCGAN in Tensorflow
好了,上面說了一通原理,下面說點有意思的實踐部分的內容。
DCGAN 的原作者用 DCGAN 生成 LSUN 的卧室圖片,這並不是特別有意思。之前在網上看到一篇文章 Chainer で顔イラストの自動生成 - Qiita ,是用 DCGAN 生成動漫人物頭像的,效果如下:
這是個很有趣的實踐內容。可惜原文是用 Chainer 做的,這個框架使用的人不多。下面我們就在 Tensorflow 中復現這個結果。
1. 原始數據集的搜集
爬蟲代碼如下:
這個爬蟲大概跑了一天,爬下來 12 萬張圖片,大概是這樣的:
可以看到這裡面的圖片大多數比較雜亂,還不能直接作為數據訓練,我們需要用合適的工具,截取人物的頭像進行訓練。
2. 頭像截取
截取頭像和原文一樣,直接使用 github 上一個基於 opencv 的工具:nagadomi。
簡單包裝下代碼:
截取頭像後的人物數據:
這樣就可以用來訓練了!
如果你不想從頭開始爬圖片,可以直接使用我爬好的頭像數據(275M,約 5 萬多張圖片):百度雲盤 提取碼:g5qa
3. 訓練
DCGAN 在 Tensorflow 中已經有人造好了輪子:carpedm20/DCGAN,我們直接使用這個代碼就可以了。
不過原始代碼中只提供了有限的幾個資料庫,如何訓練自己的數據?在 model.py 中我們找到讀數據的幾行代碼:
這樣讀數據的邏輯就很清楚了,我們在 data 文件夾中再新建一個 anime 文件夾,把圖片直接放到這個文件夾里,運行時指定 --dataset anime 即可。
運行指令(參數含義:指定生成的圖片的尺寸為 48x48,我們圖片的大小是 96x96,跑 300 個 epoch):
python main.py --image_size 96 --output_size 48 --dataset anime --is_crop True --is_train True --epoch 300
4. 結果
第 1 個 epoch 跑完(只有一點點輪廓):
第 5 個 epoch 之後的結果:
第 10 個 epoch:
200 個 epoch,仔細看有些圖片確實是足以以假亂真的:
題圖是我從第 300 個 epoch 生成的。
四、總結和後續
簡單介紹了一下 GAN 和 DCGAN 的原理。以及如何使用 Tensorflow 做一個簡單的生成圖片的 demo。
一些後續閱讀:
Ian Goodfellow 對 GAN 一系列工作總結的 ppt,確實精彩,推薦:GAN 之父 NIPS 2016 演講現場直擊:全方位解讀生成對抗網路的原理及未來(http://it.sohu.com/20161210/n475485860.shtml)
GAN 論文匯總,包含 code:zhangqianhui/AdversarialNetsPapers(https://github.com/zhangqianhui/AdversarialNetsPapers)
新人福利
【超過 1000G 神經網路/AI/大數據、教程、論文!】
福利二:截止至本公眾號下次推送時
在本文留言區評論,獲得最多贊的社友,
社長將送出花書(《深度學習》Ian Goodfellow)1 本
昨天的獲獎同學是魯鯤
周一社長就會把獎品寄出!
話題討論
你有動手實現過GAN么?
有什麼感想和感受?
歡迎在評論區交流討論
AI 研習社
點這個,CVPR 2017 精彩論文解讀!
點擊展開全文
※CVPR 2017 精彩論文解讀:顯著降低模型訓練成本的主動增量學習
※七步即可學會R語言,從此數據分析不再怕!
※讓深度學習幫你創作爵士樂
※DCU博士講解蘋果第一篇獲獎論文,不容錯過!
※看完立刻理解 GAN!初學者也沒關係
TAG:唯物 |
※eFPGA入門指南
※Python入門學習指南
※Python入門指南
※Portal+MAC 速成指南
※ChinaJoy最全VR/AR跑會指南
※土著指南-Venice Beach,LA
※Python Web入坑指南一
※Python 機器學習 Scikit-learn 完全入門指南
※紐約造型的終極指南:A-Z of New York Style
※SHOPBOP × Sugar&Spice | 開年第一單怎麼買?SS 種草最強指南
※著名的五分鐘 Case VPN 使用指南
※Jordan Brand × PSG入手指南(球場篇)
※帶E-Marker晶元的USB Type-C公頭PCB設計指南
※Katherine-NT-AU 生活指南
※從入門到熟練:KeePass全網最詳使用指南
※IOS 11 Human Interface Guidelines-視覺設計指南
※搭配指南請收藏!西山徹上腳DESCENDANT x adidas Originals聯乘款!
※Golang指南:頂級Golang框架、IDE和工具列表
※Linux系統管理員的Bash指南,11條Bash實踐經驗!
※NVIDIA GeForce 20系列Vs 10系列的比較指南