翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

前言

神奇寶貝已經是一個家喻戶曉的動畫了,我們今天來確認是否可以使用深度學習為他自動建立新的Pokemon。

我最終成功地使用了生成對抗網路(GAN)生成了類似Pokemon的影象,但是這個影象看起來並不像神奇寶貝。

雖然這個嘗試失敗了,但是我認為其他人可能會喜歡這個過程,現在把他分享出來。

翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

GAN生成對抗網路

翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

這裡不想花很多時間討論GAN是什麼,但是上面的圖片只是一個非常簡單的解釋過程。

訓練了兩個網路-鑑別器和生成器。 生成器學習如何吸收隨機噪聲並從訓練資料生成看起來像影象的影象。 它透過將其生成的影象傳送到鑑別器網路,鑑別器網路經過訓練可以辨別真實影象和生成的影象。

生成器經過最佳化,可以更好地欺騙鑑別器,鑑別器經過最佳化,可以更好地檢測生成的影象。因此,他們倆一起進步。

資料

因此,我的假設是,我可以使用真實的神奇寶貝影象作為訓練集來訓練GAN。 結果將是一個生成器,然後將能夠建立新穎的神奇寶貝!

我的第一個挑戰是找到神奇寶貝的影象。 幸運的是,Kaggle資料集得以搶救!

有人已經想過類似的想法,儘管聽起來他在生成新的Pokemon影象方面沒有很大的成功,但是由於他花了時間收集800幅影象,因此決定將它們上傳到Kaggle資料集。這節省我很多時間。

我們看一下這個資料集:

這是一張 蒜頭王八,不對 是妙蛙種子 的圖片,大小是256*256

翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

現在,有了資料,下一步就是選擇要使用的GAN型別。 可能存在數百種GAN的變體,但過去使用DCGAN可以看到良好的效果。

DCGAN從神經網路中消除了所有完全連線的層,使用轉置卷積進行上取樣,並用卷積跨度(除其他外)代替了最大池化。

我喜歡DCGAN,因為與其他我嘗試過的GAN相比,它們似乎更健壯,因此無需進行超引數的重大調整即可更容易訓練。

實際上,DCGAN非常受歡迎,以至於PyTorch的示例就很好地實現了。 同樣重要的是,他們的示例可以直接從資料夾讀取輸入。 因此,使用以下命令,我能夠開始訓練我的GAN:

python main.py --dataset folder --dataroot /pokemon/ --cuda --niter 10000 --workers 8

該命令從資料夾中讀取影象,在具有8個工作程式的GPU上執行以載入資料,並執行10,000次迭代。

事實證明,此問題需要進行10,000次迭代,但我想看看我能推多遠。 讓我們來看看!

結果

第一步始於一個一無所知的網路,因此產生的只是噪聲:

翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

每個box都是一個64 x 64畫素的影象,它是嘗試從我們的生成器中生成神奇寶貝。 由於我們的網格為8 x 8,因此我們嘗試生成64種不同的神奇寶貝。 我將影象縮小到64 x 64,因為在嘗試生成更大的影象時這種演算法會變得不穩定。

50次迭代以後,有點意思了

翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

150次迭代,影象變得清晰了

翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

3,700點之後,會有一些不錯的圖片出現了。 此後,它開始趨向於產生更差的結果:

翻車現場:我用pytorch和GAN做了一個生成神奇寶貝的失敗模型

這些看起來根本都不像神奇寶貝!

但是請將瀏覽器縮小到25%左右,然後再次檢視。 在遠處,它們看起來驚人地類似於真正的神奇寶貝。

為什麼呢?由於我們正在對64 x 64的影象進行訓練,因此辨別器很容易被形狀和顏色類似於口袋妖怪的影象所迷惑,因此生成器不需要改進。

下一步?

在我看來,顯而易見的下一步就是訓練更高解析度的GAN。 實際上,我已經對此進行了一些嘗試。

我的第一個嘗試是重新編寫PyTorch程式碼以縮放到256 x 256影象。 該程式碼有效,但是DCGAN崩潰了,我無法穩定新聯。 我相信主要原因是因為我只有大約800張影象。 而且,儘管我進行了一些資料擴充,但還不足以訓練更高解析度的DCGAN。

然後,我嘗試使用相對論的GAN,該GAN已成功針對具有較小資料集的高解析度資料進行了成功的訓練,但也無法使其正常工作。

目前來看,問題應該出現在資料上,資料量太小,還是滿足不了訓練的需求。但是我將繼續嘗試其他一些想法,以產生更高解析度的Pokemon,如果我有工作的必要,我將釋出我使用的技術。

想了解更多精彩內容,快來關注deephub