如果說最經常被用來處理影像的網路模型,那麼毋庸置疑,應該是CNN了,而本次入土教程的最終目的是做一個動漫頭像生成的網路模型,因此我們可以將CNN與GAN結合,也就是組成了傳說中的DCGAN網路。
DCGAN簡介
DCGAN全稱Deep Convolutional Generative Adversarial Networks,中文名曰深度卷積對抗網路。論文地址在這裡。
因為DCGAN是不僅與GAN有關還與CNN有關,因此,如果不是很瞭解的CNN的話,建議先去看一看CNN相關的知識,也可以參考一下我以前的部落格。
這裡我們可以在複述一下CNN的相關知識和特點。
CNN我們可以理解為如下的行為,逐層深入"抽絲剝繭”地“理解”一張圖片或其他事物。圖片經過CNN網路中的一系列layer,逐漸的對影像進行細化,最終將影像從一個大的維度變成一個小的維度。在DCGAN中,判別器實際上就是一個CNN網路。輸入一張圖片,然後輸出yes or no的概率。
而在DCGAN中,\(G\)網路的模型是怎麼樣的?\(G\)網路剛好和CNN相反,它是由noise通過\(G\)網路生成一張圖片,因為圖片通過layer逐漸變大,與卷積作用剛好相反——因此我們可以稱之為反摺積。
DCGAN的特點
當然,DCGAN除了\(G\)網路與CNN不同之外,它還有以下的不同:
- 取消所有pooling層。G網路中使用轉置卷積(transposed convolutional layer)進行上取樣,D網路中用加入stride的卷積代替pooling。
- 除了生成器模型的輸出層和判別器模型的輸入層,在網路其它層上都使用了Batch Normalization,使用BN可以穩定學習,有助於處理初始化不良導致的訓練問題。
- G網路中使用ReLU作為啟用函式,最後一層使用tanh
- D網路中使用LeakyReLU作為啟用函式
幾個重要概念
為了能夠繼續瞭解DCGAN,我們還是得需要準備一下幾個重要概念。
下采樣(subsampled)
下采樣實際上就是縮小影像,主要目的是為了使得影像符合顯示區域的大小,生成對應影像的縮圖。比如說在CNN中得池化層或卷積層就是下采樣。不過卷積過程導致的影像變小是為了提取特徵,而池化下采樣是為了降低特徵的維度。
上取樣(upsampling)
有下采樣也就必然有上取樣,上取樣實際上就是放大影像,指的是任何可以讓影像變成更高解析度的技術,這個時候我們也就能理解為什麼在\(G\)網路中能夠由噪聲生成一張圖片了。
它有反摺積(Deconvolution)、上池化(UnPooling)方法。這裡我們只介紹反摺積,因為這是是我們需要用到的。
反摺積(Deconvolution)
反摺積(Deconvolution)也稱為分數步長的卷積和轉置卷積(transposed convolution)。在下圖中,左邊的為卷積,右邊的為反摺積。convolution過程是將4×4的影像對映為2×2的影像,而反摺積過程則是將2×2的影像對映為4×4的影像,兩者的kernel size均為3。不過顯而易見,反摺積只能恢復圖片的尺寸大小,而不能準確的恢復圖片的畫素值(此時我們想一想,在CNN中,卷積層的kernel我們可以學習,那麼在反摺積中的kernel我們是不是也可以學習呢?)。
關於更多的我就不做更多的講解了,大家可以參考別人的部落格進行學習。
批標準化(Batch Normalization)
推薦大家去看看什麼是批標準化 (Batch Normalization),通俗易懂。在下圖中,我們可以看到,當\(x_2 = 20\)的時候,\(tanh(wx_2) = 0.96\),已經比較接近於1,如果繼續增大\(x\),\(tanh(wx)\)也不會變化太多。也就是說此時增大\(x\),已經不對\(x\)敏感了,而這種問題即出現在輸入層也出現在隱藏層。因此,我們需要將資料進行標準化(Normalization),且不僅需要在輸入層進行這種操作,且在隱藏層也需要這種操作。Batch normalization 的 batch 是批資料, 把資料分成小批小批進行隨機梯度下降。
BN演算法如下:
當然BN演算法看起來容易,實際上還是有很多複雜的東西,不過我們不做深入的探究。我們暫時只需要知道他的作用即可。
啟用函式
下面是幾種常用的函式的示意圖:
啟用函式 | ReLU啟用函式 | tanh啟用函式 | LeakyReLU啟用函式 | Sigmoid函式 |
---|---|---|---|---|
影像 |
G模型
下圖是GCGAN的大體框架圖,在生成器中,使用反摺積生成影像,在判別器中使用卷積進行判別。
下圖是在Deep Convolutional Generative Adversarial Networks論文中介紹的DCGAN生成器。該網路接收一個表示為z的100x1噪聲向量,通過一系列layer,最終將noise對映到64x64x3的影像中。
上述的過程實際上就是將一個\(1 \times 100\)的向量變成$64 \times 64 \times 3 $的圖片。
- Project and reshape:將\(1 \times 100\)通過騷操作變成\(4 \times 4 \times 1024\)的向量。這裡我們可以使用全連線層加摺積的方法。
- CONV:反摺積
總結
以上便是DCGAN的基本原理,在下篇部落格中,將基於Keras使用DCGAN來做一個動漫頭像生成的東東。
訓練50輪過程中的gif示意圖如下: