天天看點

谷歌開源的 GAN 庫--TFGAN

如果你玩過波斯王子,那你應該知道你需要保護自己不被”影子“所殺掉,但這也是一個沖突:如果你殺死“影子”,那遊戲就結束了;但你不做任何事情,那麼遊戲也會輸掉。

盡管生成對抗網絡(gan)有不少優點,但它也面臨着相似的區分問題。大部分支援 gan 的深度學習專業也是非常謹慎的支援它,并指出它确實存在穩定性的問題。

gan 的這個問題也可以稱做整體收斂性問題。盡管判别器 d 和 生成器 d 互相競争博弈,但同時也互相依賴對方來達到有效的訓練。如果其中一方訓練得很差,那整個系統也會很差(這也是之前提到的梯度消失或者模式奔潰問題)。并且你也需要確定他們不會訓練太過度,造成另一方無法訓練了。是以,波斯王子是一個很有趣的概念。

首先,神經網絡的提出就是為了模仿人類的大腦(盡管是人為的)。它們也已經在物體識别和自然語言處理方面取得成功。但是,想要在思考和行為上與人類一緻,這還有非常大的差距。

那麼是什麼讓 gans 成為機器學習領域一個熱門話題呢?因為它不僅隻是一個相對新的結構,它更加是一個比之前其他模型都能更加準确的對真實資料模組化,可以說是深度學習的一個革命性的變化。

最後,它是一個同時訓練兩個獨立的網絡的新模型,這兩個網絡分别是判别器和生成器。這樣一個非監督神經網絡卻能比其他傳統網絡得到更好性能的結果。

但目前事實是我們對 gans 的研究還隻是非常淺層,仍然有着很多挑戰需要解決。gans 目前也存在不少問題,比如無法區分在某個位置應該有多少特定的物體,不能應用到 3d 物體,以及也不能了解真實世界的整體結構。當然現在有大量研究正在研究如何解決上述問題,新的模型也取得更好的性能。

而最近谷歌為了讓 gans 更容易實作,設計開發并開源了一個基于 tensorflow 的輕量級庫–tfgan。

根據谷歌的介紹,tfgan 提供了一個基礎結構來減少訓練一個 gan 模型的難度,同時提供非常好測試的損失函數和評估标準,以及給出容易上手的例子,這些例子強調了 tfgan 的靈活性和易于表現的優點。

此外,還提供了一個教程,包含一個進階的 api 可以快速使用自己的資料集訓練一個模型。

谷歌開源的 GAN 庫--TFGAN

上圖是展示了對抗損失在圖像壓縮方面的效果。最上方第一行圖檔是來自 imagenet 資料集的圖檔,也是原始輸入圖檔,中間第二行展示了采用傳統損失函數訓練得到的圖像壓縮神經網絡的壓縮和解壓縮效果,最底下一行則是結合傳統損失函數和對抗損失函數訓練的網絡的結果,可以看到盡管基于對抗損失的圖檔并不像原始圖檔,但是它比第二行的網絡得到更加清晰和細節更好的圖檔。

tfgan 既提供了幾行代碼就可以實作的簡答函數來調用大部分 gan 的使用例子,也是建立在包含複雜 gan 設計的模式化方式。這就是說,我們可以采用自己需要的子產品,比如損失函數、評估政策、特征以及訓練等等,這些都是獨立的子產品。tfgan 這樣的設計方式其實就滿足了不同使用者的需求,對于入門新手可以快速訓練一個模型來看看效果,對于需要修改其中任何一個子產品的使用者也能修改對應子產品,而不會牽一發而動全身。

最重要的是,谷歌也保證了這個代碼是經過測試的,不需要擔心一般的 gan 庫造成的數字或者統計失誤。

首先添加以下代碼來導入 tensorflow 和 聲明一個 tfgan 的執行個體:

采用良好測試并且很靈活的調用接口實作快速訓練生成器和判别器網絡,此外,還可以混合 tfgan、原生 tensorflow以及其他自定義架構代碼;

使用實作好的gan 的損失函數和懲罰政策 (比如 wasserstein loss、梯度懲罰等)

訓練階段對 gan 進行監控和可視化操作,以及評估生成結果

使用實作好的技巧來穩定和提高性能

基于正常的 gan 訓練例子來開發

采用ganestimator接口裡快速訓練一個 gan 模型

tfgan 的結構改進也會自動提升你的 tfgan 項目的性能

tfgan 會不斷添加最新研究的算法成果

tfgan 是由多個設計為獨立的部件組成的,分别是:

core:提供了一個主要的訓練 gan 模型的結構。訓練過程分為四個階段,每個階段都可以采用自定義代碼或者 調用 tfgan 庫接口來完成;

features:包含許多常見的 gan 運算和正則化技術,比如執行個體正則化(instance normalization)

losses:包含常見的 gan 的損失函數和懲罰機制,比如 wasserstein loss、梯度懲罰、互相資訊懲罰等

evaulation:使用一個預訓練好的 inception 網絡來利用​<code>​inception score​</code>​或者​<code>​frechet distance​</code>​評估标準來評估非條件生成模型。當然也支援利用自己訓練的分類器或者其他方法對有條件生成模型的評估

examples and tutorial:使用 tfgan 訓練 gan 模型的例子和教程。包含了使用非條件和條件式的 gans 模型,比如 infogans 等。

典型的 gan 模型訓練步驟如下:

為你的網絡指定輸入,比如随機噪聲,或者是輸入圖檔(一般是應用在圖檔轉換的應用,比如 pix2pixgan 模型)

采用​<code>​ganmodel​</code>​接口定義生成器和判别器網絡

采用​<code>​ganloss​</code>​指定使用的損失函數

采用​<code>​gantrainops​</code>​設定訓練運算操作,即優化器

開始訓練

當然,gan 的設定有多種形式。比如,你可以在非條件下訓練生成器生成圖檔,或者可以給定一些條件,比如類别标簽等輸入到生成器中來訓練。無論是哪種設定,tfgan 都有相應的實作。下面将結合代碼例子來進一步介紹。

第一個例子是訓練一個生成器來生成手寫數字圖檔,即 mnist 資料集。生成器的輸入是從多變量均勻分布采樣得到的随機噪聲,目标輸出是 mnist 的數字圖檔。具體檢視論文“generative adversarial networks”。代碼如下:

第二個例子同樣還是生成 mnist 圖檔,但是這次輸入到生成器的不僅僅是随機噪聲,還會給類别标簽,這種 gan 模型也被稱作條件 gan,其目的也是為了讓 gan 訓練不會太過自由。具體可以看論文“conditional generative adversarial nets”。

代碼方面,僅僅需要修改輸入和建立生成器與判别器模型部分,如下所示:

第三個例子結合了 l1 pixel loss 和對抗損失來學習自動編碼圖檔。瓶頸層可以用來傳輸圖檔的壓縮表示。如果僅僅使用 pixel-wise loss,網絡隻回傾向于生成模糊的圖檔,但 gan 可以用來讓這個圖檔重建過程更加逼真。具體可以看論文“full resolution image compression with recurrent neural networks”來了解如何用 gan 來實作圖像壓縮,以及論文“photo-realistic single image super-resolution using a generative adversarial network”了解如何用 gans 來增強生成的圖檔品質。

代碼如下:

第四個例子是圖像轉換,它是将一個領域的圖檔轉變成另一個領域的同樣大小的圖檔。比如将語義分割圖變成街景圖,或者是灰階圖變成彩色圖。具體細節看論文“image-to-image translation with conditional adversarial networks”。

最後一個例子是采用 infogan 模型來生成 mnist 圖檔,但是可以不需要任何标簽來控制生成的數字類型。具體細節可以看論文“infogan: interpretable representation learning by information maximizing generative adversarial nets”。

最後同樣是非條件 gan 生成 mnist 圖檔,但利用​<code>​ganmodel​</code>​函數來配置更多參數進而更加精确控制模型的建立。

如果有翻譯不當的地方或者有任何建議和看法,歡迎留言交流;也歡迎關注我的微信公衆号–機器學習與計算機視覺或者掃描下方的二維碼,和我分享你的建議和看法,指正文章中可能存在的錯誤,大家一起交流,學習和進步!

谷歌開源的 GAN 庫--TFGAN

繼續閱讀