怎樣用GAN生成各種胖吉貓?谷歌大腦程序猿教你好用的撩妹技巧

怎樣用GAN生成各種胖吉貓?谷歌大腦程序猿教你好用的撩妹技巧

來自專欄 量子位

圓栗子 編譯整理

量子位 報道 | 公眾號 QbitAI

?如果,AI可以幫你生成一些貓,很萌的那種,但是不能吸,你會做何感想?

Facebook聊天框里出道的灰色短毛貓Pusheen,是柔軟的微胖界寵兒,中文名字叫胖吉。

一個來自谷歌大腦的程序猿說,他和他妹子都很喜歡這隻胖子。於是,他有了用AI幫妹子生出很多很多小吉 (的圖片) 的想法。 ?

△ 「其實就是有了眼睛和耳朵的水滴」

當然,並不只是想想而已。

一切從這裡BEGAN

生成對抗網路 (GAN) 是精分的AI,由兩個神經網路組成,一是生成模型 (Generator) ,即畫師,二是判別模型 (Discriminator) ,即鑒賞家。縮略為G和D。

人類要用大量的圖像來餵養GAN,培養兩個神經網路的藝術細菌。

△ 先把食物對成山?

然後,G可以在熏陶之下,模仿著畫出自己的作品,讓D以為那就是人類投喂的畫;而D漸漸了解自己吃過的畫是什麼味道,就能辨別哪些圖是G畫的。

相愛相殺的日子裡,兩者技能都會得到有效提升。G的畫功越來越像人類,D也越來越難騙。

不過,技術宅支配的不是普通的GAN,而是名為BEGAN的新朋友。

△ 結構和EBGAN差不多

它的判別模型是自編碼器 (AutoEncoder) 結構,即D的輸入是圖像,輸出是編碼解碼後的圖像;生成模型則借鑒了WGAN的損失函數。

不過,GAN的一生閱片無數,通常需要餵食幾萬乃至幾百萬張圖像,才能茁壯成長。

可惜的是,雖然貴為表情包,胖吉也沒有很多照片的。

△ 尊貴的座駕

於是,機智的少年加了一個 (並不厲害的) 小特技,一幅圖翻過來掉過去,或放大或縮小,或背景變白,就變出了很多訓練素材。不過,畢竟原始圖庫幾百張,擴充之後可能還是有些乾癟。

我有特別的模仿技巧

既然胖吉的姿勢不多,場景也不多,技術宅當時就沒有太大的幻想。他抱著養死也沒事的一顆寬廣的心,開始訓練BEGAN。

訓練過程中,D的目標是讓判別錯誤越少越好;G的目標,是讓D錯得越多越好。具體來說——

一張圖片相當於一個數據x,D對它編碼解碼後得到圖像D(x)。

z是一串隨機數組成的向量 (Latent Vector) ,G根據它來生成的圖可表示為g(z),D對它編碼解碼後得到圖像D(g(z))。

我說的模仿,不是cosplay

隨著訓練的進行,G的模仿能力越來越強,D(g(z))會越來越接近D(x)的分布。

不過,BEGAN在對比D(g(z))和D(x)之間差異的時候,用的損失函數 (Loss Function) 有些不一樣。

讓G作品的重構誤差 (Reconstruction Error) 分布,去逼近人類作品的重構誤差分布——BEGAN的損失函數使用的是這兩者之間的差異。Wasserstein距離,可以把這個差異轉換為真實的差異。

可能有驚喜的play

△ 賣家秀之Model 1

技術宅用3個數字組成的向量,來表示圖片。他還給吃瓜黨提供了自己調整向量的play——

每個角上的圖像都可以自行設定,作為起點。從四角出發,生成的其他圖,便是灰貓的漸變修養。

這個過程里,多多少少會有可愛的新胖吉出現。當然,生成效果並沒有那麼完美,畸形貓和看不出喵型的圖像也理直氣壯地存在。

△ 三隻耳朵怎麼樣

程序猿友情提示,如果想少看一些畸形貓,就盡量把數字調小一些。數大了之後,容易有斑斕的色彩傾瀉出來,讓你忘了畫貓的初衷。

不過那樣的話,貓的樣子也很難有豐富的變化,可能會比較單調

△ 有種聽天由命的感覺

不想費力調向量的話,就點下一鍵生成按鈕 (如上圖) ,看到比漸變過程更隨機的貓陣。

為了能讓瀏覽器對面的大家感受到貓陣的厲害,程序猿還特意用TensorFlow.js重寫了程序 (怕不是想增加撒狗糧的力度吧) 。

△ 單身使我快樂

在少年提供的三個模型里,我喜歡Model 2的效果,筆觸比較圓潤,配色似乎也可愛一些。

技術要領探討一下

從WGAN那裡借來的損失函數,幫BEGAN保證了兩個模型的勢均力敵,D和G想要贏對方都不那麼容易。

△ 來亞,負相桑害亞

程序猿說,不久以後就會公布自己生成胖吉用的代碼,但在那之前他想先給大家劃個重點。此次實驗過程中發揮最好的結構和超參數如下——

· 激活函數用了帶泄露整流函數 (leaky ReLU) ,alpha=2

· 批量歸一化

· G,步長為1的卷積層之後,近鄰 (Nearest Neighbor) 演算法縮放圖像兩次

· D,步長為1的卷積層之後,2 x 2窗口的平均池化 (Average Pooling)

· D,每層32或64個過濾器

· G,開始每層32或64個過濾器,後面依次翻倍 (e.g, 32,32,32,64,64,64,128,128,128…)

· 100維的潛在空間

· 學習率e-4或5e-4或e-3

https://www.zhihu.com/video/980841898902208512

視頻是訓練過程,可以看到AI一開始畫的圖很簡單,灰疙瘩而已。後面元素就慢慢多起來了,耳朵、尾巴、五官,甚至還有吃的和玩的。

不過,少年也說了,有些模型mode collapse的跡象比較明顯,作品沒什麼新意。他覺得一部分原因可能是,用略顯稚嫩的方法擴充的數據集,掩飾不住匱乏的本質。BEGAN從小就沒吃飽吧。

△ 明明今天上午,吃了五碗面

再有,在模型取捨上,是選單調但能生產完整胖吉的模型,還是選天馬行空多姿多彩但日常畫出畸形貓的模型?當事人還是傾向於後者。

如果這都不算愛

少年果然有雙發現美的眼睛,給自家AI的作品 (強行) 劃歸了多個不同的系列。

比如,戲水吉。

比如,玩火吉。

比如,綠林吉。

比如,飛天吉。

比如,連體吉。

另外,程序猿還做了加減play,他說雖然效果不太明顯,但結果還是合理的。你看——

友好解讀是,吃taco的左歪貓 - 左歪貓 + 被繩牽著的右歪貓 = 吃小taco且被繩牽著的右歪貓。

好吧,我信了。

比起BEGAN論文里生成人臉的整容技能,胖吉的舉一反三可能只是小打小鬧。

但不管怎麼看,這也是表情包和TensorFlow.js的正確打開方式了,至少可以讓妹子開心啊。

回頭想想那個要舉著手機、在辦公室里到處尋覓表情包本體的遊戲,不被當成 (hen) (tai) 也很難啊。

△ 警察叔叔,就是他

沒有對比就沒有傷害。所以,傳送門也要放在一起。

這是胖吉變變變試玩地址:

zna.do/pusheen

這是尋找表情包試玩地址:

emojiscavengerhunt.withgoogle.com

P.S. 程序猿的名字叫Zachary Nado,進入谷歌大腦之前,他還在發射成癮的SpaceX工作過。那麼,為什麼要在結尾多介紹一次呢?因為小捲毛還是有點可愛。

歡迎大家關注我們的專欄:量子位 - 知乎專欄

誠摯招聘

量子位正在招募編輯/記者,工作地點在北京中關村。期待有才氣、有熱情的同學加入我們!相關細節,請在量子位公眾號(QbitAI)對話界面,回復「招聘」兩個字。

量子位 QbitAI · 頭條號簽約作者

?? ? 追蹤AI技術和產品新動態


推薦閱讀:

[CVPR2018筆記]Deep Layer Aggregation
GAN階段性小結(損失函數、收斂性分析、訓練技巧、應用「高解析度、domain2domain」、研究方向)
CS231n 2017 Lecture 3: Loss Functions and Optimization 隨堂筆記
用深度學習給黑白照片著色

TAG:生成對抗網路GAN | 機器學習 | 計算機視覺 |