當前位置:
首頁 > 知識 > 使用以 Tensorflow 為後端的 Keras 構建生成對抗網路的代碼示例

使用以 Tensorflow 為後端的 Keras 構建生成對抗網路的代碼示例

本文為 AI 研習社編譯的技術博客,原標題 :

GAN by Example using Keras on Tensorflow Backend

作者 |Rowel Atienza

翻譯 | GuardSkill、魯昂 編輯 | 王立魚

https://towardsdatascience.com/gan-by-example-using-keras-on-tensorflow-backend-1a6d515a60d0

生成式對抗網路(GAN)是近期深度學習領域中最有前景的發展之一。 GAN由Ian Goodfellow於2014年推出,它通過分別訓練兩個相互競爭和合作的深度網路(稱為生成器[Generator]和鑒別器[Discriminator])來進軍無監督學習的問題。 在訓練過程中,兩個網路最終都會學習到如何執行各自任務。

GAN就像是假幣偽造者(Generative)和警察(Discriminator)之間的故事。最開始時假幣團伙的假錢將被警方發現,警方發現假幣後,將向廣大人民群眾張貼假幣實例和辨偽方法。這相當於警察向偽造者提供了反饋,告訴了為什麼錢是假的。 假幣團伙試圖根據收到的反饋製作新的假錢。警方表示,這些錢仍然是假的,並向人民群眾提供了一套新的辨偽方法。 假幣團伙試圖根據最新反饋製作新的假錢。這個循環無限期地持續下去,直到警察被假幣愚弄,因為它現在看起來真的很真實。

雖然GAN的理念在理論上很簡單,但構建一個可以工作的模型卻非常困難。在GAN中,有兩個深度網路耦合在一起,使得梯度的反向傳播具有挑戰性,因為反向傳播需要進行兩次。 深度卷積生成式對抗網路(DCGAN)展示了如何構建實用GAN的模型,該GAN能夠自己學習如何合成新圖像。

在本文中,我們將討論如何在少於200行代碼中使用以Tensorflow 1.0為後端的Keras 2.0構建能夠工作的DCGAN。我們將使用MNIST訓練DCGAN學習如何生成手寫數圖片。

鑒別器

鑒別器用了辨別一個圖像的真實性,通常使用圖一所示的深度卷積神經網路。對於Mnist數據集,輸入是28*28*1的一幀圖像。輸出時一個標量,其大小用來表示圖像的真實性(0是假的,1是真的,其他值無法缺人)。和常規的CNN相比,它通過跨距卷積(strided convolution)替代了之前的層間最大池化操作用來降採樣。每個CNN層之間使用弱relu作為激活函數。使用0.4-0.7的dropout操作來避免過擬合和記憶化(memorization)。下面給出了keras中的實現。

圖1. DCGAN的鑒別器告訴我們數字的輸入圖像是多麼真實。 MNIST數據集用作真實圖像的基礎事實。 跨步卷積而不是最大化下採樣圖像。

代碼1.圖1中的Discriminator的Keras代碼

生成器

生成器用來合成加圖片。圖二中展示了從100維的雜訊(-1.0到1.0的均勻分布)中利用反向卷積(卷積的轉置)生成假圖片的過程。除了DCGAN中建議使用的反卷積fractionally-strided,對前三層的上採樣也被用來合成更加接近真實的手寫圖像。層與層之間的批量正則化(batch normalization)也被用來穩定學習過程。各層的激活函數使用relu。最後一層的輸出是假圖像。採用0.3-0.5 的dropout避免第一層的過擬合。下面給出了對應的keras實現:

圖2. Generator模型從雜訊中合成偽造的MNIST圖像。 使用上採樣而不是分數跨越的轉置卷積。

代碼2.圖2中生成器的Keras代碼

GAN 模型

到目前為止,還沒有對應的機器學習模型。已經是時間用來構建訓練用的模型了。我們使用兩個模型:1. 鑒別模型(警察)2. 反模型或生成器模型(從警察那邊學習知識的偽造者)。

鑒別器模型

下面的代碼3展示了利用keras實現鑒別器模型的代碼。他用來描述上面鑒別器用於訓練的損失函數。因為鑒別器的輸出是sigmoid,所以使用二元交叉熵來計算損失。對比Adam,這裡使用RMSProp(均方根反向傳播)來做為優化器生成更加接近真實的假圖片。學習率為0.0008。為了穩定後續的學習,這裡還添了權重衰減和輸出值的clip。如果需要調整學習率,也需要對衰減作出響應的調整。

代碼3. 鑒別模型的keras代碼

反模型

圖三中展示了生成-鑒別模型,生成器部分嘗試騙過鑒別器並同時讀取鑒別器的反饋。代碼4給出了keras的代碼實現。訓練參數除了減小的學習率和對應的權重衰減其他訓練參數都和鑒別模型一致。

圖3. 反模型是簡單的降他的輸出連接到鑒別模型上。嘗試去愚弄鑒別器使得輸出的結果是1

代碼4. 圖3所示的keras實現的反模型

訓練

訓練是最難的一部分。首先需要保證鑒別器能夠獨自正確地區分真假圖像。然後,鑒別器和反模型能夠依次被訓練。圖4展示了當圖3所示的反模型在訓練階段的鑒別模型。

代碼5. 序列的訓練鑒別器模型和反模型。訓練步驟超過1000次用以乘勝響應的輸出。

訓練GAN模型由於其深度需要極強的耐心,下面羅列了幾點:

產生的圖片看起來像雜訊:對鑒別器和生成器的網路層之間添加dropout。較低的dropout值(0.3-0.6)將產生更加真實的圖片

鑒別器的損失很快就收斂到0了,導致生成器無法學習:不要預先訓練鑒別器。而是對於鑒別器使用稍大的學習率。對於生成器使用另一種訓練雜訊樣本。

生成器的結果仍然像雜訊:檢查激活與否,batch normalization 和 dropout都被正確地應用在層序列上。

搞清楚正確的訓練/模型參數:採用一些已知的參數,如論文或源代碼,一次僅僅調整一個參數。在2000步或更多步的訓練之前,觀察參數值的效應並在500或1000步及時作出調整。

樣本輸出

圖5顯示了訓練期間輸出圖像的演化過程,你可以看得出圖5是十分的迷人,並且GAN在自己學習手寫數字。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

利用事件相機將模糊視頻還原成高速清晰視頻
多圖演示高效的神經架構搜索

TAG:AI研習社 |