天天看點

深度卷積對抗生成網絡(DCGAN)實戰

建立一個GAN可能聽起來很困難,但,在本教程中,我們将使用TensorFlow來建構一個簡單的能夠生成人臉圖像的GAN。

<b>1.</b><b>深度卷積對抗生成網絡(</b><b>DCGAN</b><b>)的架構</b>

在本教程中,我們不是試圖模仿簡單的數字資料,而是我們試圖模仿一個圖像,甚至它可以去欺騙一個人。生成器将随機生成的噪聲向量作為輸入資料,然後使用稱為反卷積的技術将資料轉換為圖像。

鑒别器是經典的卷積神經網絡,其分類真實和假圖像。

深度卷積對抗生成網絡(DCGAN)實戰

<b>2.</b><b>建立</b>

<b>3.CelebA</b><b>資料集</b>

CelebFaces資料集包含超過20萬個名人圖像,每個圖像具有40個屬性注釋。由于我們隻是想生成随機面的圖像,是以我們将忽略注釋。而且資料集包括超過10,000個不同的身份,這對我們的需要來說是最佳的。

深度卷積對抗生成網絡(DCGAN)實戰

不過,盡管如此我們也要定義一個批量生成的函數。這個函數将加載我們的圖像,并根據我們稍後将要設定的批量大小給我們一個圖像陣列。為了獲得更好的效果,我們将裁剪圖像,以便隻顯示臉部。我們還将圖像歸一化,使得它們的像素值在-0.5到+0.5的範圍内。最後,我們打算将圖像縮小到28x28。這困難會使我們失去了一些圖像品質,但它大大減少了訓練時間。

<b>4.</b><b>定義網絡輸入</b>

在我們開始定義我們的兩個網絡之前,我們首先要定義我們的輸入。我們這樣做是為了不讓雜亂的訓練過程變得比現在更加混亂。在這裡,我們隻是簡單地定義TensorFlow占位符,用于我們真實和虛假的圖像輸入以及為了儲存我們的學習率的值。

TensorFlow配置設定變量占位符特别容易。在完成這些之後,我們可以通過稍後指定一個Feed字典來使用我們網絡中的占位符。

<b>5.</b><b>建立鑒别器網絡(</b><b>The discriminator network</b><b>)</b>

接着,我們來建立我們最重要的網絡。鑒别器是“藝術評論家”,試圖區分真實和虛假的圖像。簡單地說,這是一個用于圖像分類的卷積神經網絡。如果你已經有了一些深度學習的經驗,那麼你有可能已經建立了一個非常類似于這個網絡的網絡。

深度卷積對抗生成網絡(DCGAN)實戰

定義這個網絡時,我們要使用一個TensorFlow變量作用域。這有助于我們稍後的訓練過程,是以我們可以重複使用我們鑒别器和發生器的變量名。

<b>6.</b><b>發生器網絡(</b><b>The generator network</b><b>)</b>

發生器是以另一種方式存在于GAN中:試圖欺騙鑒别器的是“藝術家”。發生器利用去卷積層(deconvolutional),它們與卷積圖層完全相反:除了将圖像轉換為簡單的數值資料(如分類)之外,我們還将執行反卷積以将數字資料轉換為圖像,而不是執行卷積。正如我們在設定鑒别器網絡中所做的那樣,我們也将其設定在一個可變範圍内。

深度卷積對抗生成網絡(DCGAN)實戰

首先,我們接受我們的輸入,稱為Z,并将其輸入到我們的第一個解卷積層。每個解卷積層執行解卷積,然後執行批量歸一化和 Leaky ReLu。然後,我們傳回tanh激活函數。

<b>注意:先訓練!</b>

在我們真正開始訓練過程之前,我們需要做一些其他的事情。首先,我們需要定義所有幫助我們計算損失的變量。其次,我們需要定義我們的優化功能。最後,我們将建立一個小函數來輸出生成的圖像,然後訓練網絡。

<b>7.</b><b>損失函數</b>

我們需要定義三個損失函數,而不是僅具有單個損失函數:發生器的損失函數,使用真實圖像時鑒别器的損失函數,以及使用假圖像時鑒别器的損失函數。假圖像和真實圖像損失的總和理應是整體鑒别器損失。

首先,我們先定義我們對真實圖像的損失。為此,我們在處理真實圖像時要傳遞鑒别器的輸出,并将其與标簽全部進行比較。我們在這裡使用一種稱為标簽平滑的技術,通過将0.9乘以1來幫助我們的網絡更加準确。

然後,我們為我們的假圖像定義損失。這次我們在處理僞造的圖像時将鑒别器的輸出傳遞給我們的标簽,如果這些标簽都是0,這意味着它們是假的。

最後,對于發生器定義損失器。

<b>8.</b><b>優化和可視化</b>

在優化的步驟中,我們正在尋找所有可以通過使用tf.trainable_variables函數進行訓練的變量。既然我們之前使用了變量作用域,我們可以非常舒适地檢索這些變量。然後我們使用Adam優化器來幫助我們減少損失。

在我們準備的最後一步中,我們将編寫一個小段程式,使用matplotlib庫在筆記本上顯示生成的圖像。

<b>9.</b><b>訓練</b>

我們正在進行我們的最後一步!現在,我們隻擷取我們之前定義的輸入,損失和優化器,調用一個TensorFlow會話并運作批處理。每400一個批次,我們通過顯示生成的圖像和生成器以及鑒别器的損失來輸出目前的進度。現在向後看,看到臉部緩緩而穩定地出現。根據你的設定,此進度可能需要一個小時或更長時間。

深度卷積對抗生成網絡(DCGAN)實戰

<b>10.</b><b>結論</b>

恭喜你!你現在知道GAN做什麼,甚至知道如何使用它們生成人臉圖像。這隻是GAN的冰山一角,GAN還有很多其他的應用。

例如:密歇根大學和德國馬克斯普朗克研究所的研究人員使用GAN從文本中生成圖像。根據論文描述,他們能夠産生非常真實的花鳥。這可以擴充到一些其他領域,比如警察素描或者平面設計。伯克利的研究人員也設法建立了一個GAN,增強了模糊的圖像,甚至重建了損壞的圖像資料。

總之,GAN是非常強大的。

Dominic Monn目前是瑞士蘇黎世NVIDIA公司的深度實習生

文章原标題《Deep convolutional

generative adversarial networks with TensorFlow》,作者:Dominic Monn,譯者:虎說八道,審閱:

繼續閱讀