論文:《UNSUPERVISED REPRESENTATION LEARNING WITH DEEP CONVOLUTIONAL
GENERATIVE ADVERSARIAL NETWORKS》發表日期:ICLR 2016
前言
這幾年CNNs在計算機視覺應用的監督學習方面的應用廣泛,而在非監督學習方向的應用就相對沒有受到關注。因此,提出的這一深度卷積生成對抗網絡(DCGANs)中使用了CNNs的內容,證明它也是可以進行非監督學習的。
通過各類的圖像數據訓練表明,DCGAN的生成器和鑒別器能夠學習從物體部分到場景的表示層次。並且能把學到的特征用於新的任務中,以證明他們可以作為一般圖像表征的適用性。
其次,GANs在訓練時是不穩定的,經常導致生成器輸出沒有意義的圖片。
架構設計規則
為了GAN能夠很好得適應於卷積神經網絡架構,DCGAN提出了四點架構設計規則:
- 使用卷積層替換池化層
- 去除全連接層
- 使用批歸一化
- 使用恰當的激活函數
卷積層替換池化層
傳統的CNN結構不僅包含卷積層,還包括了池化層。而在DCGAN結構中,采取把傳統卷積網絡中的池化層全部去除的操作,並使用卷積層來替換。
在判別器中,我們使用步長卷積(strided convolution)來代替池化層;在生成器中,我們使用分數步長卷積(fractional-strided convolutions)來代替池化層。
其中步長卷積的圖形化解釋如下:
實際上,卷積層在判別器中進行了空間下采樣(spatial downsampling),輸入數據為5x5的矩陣,使用了3x3的過濾器,步長為2x2,最終的輸出矩陣為3x3。
假設輸入的特征大小為i,卷積核尺寸k,步長s,padding為p,經過卷積后得到的結果為:
而分數步長卷積的圖形化解釋如下:
這表示的是卷積層在生成器中進行上采樣(spatial unsampling),輸入為3x3的矩陣,同樣使用了3x3的過濾器,反向步長為2x2,故在每個輸入矩陣的點之間填充一個0,最終輸出為5x5。
那么使用公式表示如下:
之所以叫分數步長卷積,是因為反向卷積的步長變成了1/s。因此,我們需要在原始特征中插入數字0,使得內核比單位步幅移動更慢,具體在於在輸入每兩個元素之間插入s-1個0,如果卷積的步長是2,在反卷積的時候就應在元素之間插入1個0。
原始的輸入特征經過數字0的插入后,輸入的尺寸大小變為
再對該結果進行卷積,此時的步長應為1,進行空洞卷積后的結果如下:
空洞卷積的好處是,在不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息,同時使得參數的個數不變。
去除全連接層
全連接層的缺點在於參數過多,當神經網絡層數深了以后運算速度變變得非常慢。此外它也會使得網絡變得容易過擬合。論文中提出了一種折中的方案,也就是將生成器的隨機輸入直接與卷積層特征輸入進行連接,同樣地對於判別器的輸出層也是與卷積層的輸出特征連接。
使用批歸一化
深度學習的神經網絡層數很多,每一層都會使得輸出數據的分布發生變化,隨着層數的增加網絡的整體偏差會越來越大。批歸一化(batch normalization)可以解決這一問題,通過對每一層的輸入都進行歸一化的處理,能夠有效使得數據服從某個固定的數據分布。
激活函數的設計
在DCGAN中,生成器和判別器使用不同的激活函數。生成器中使用ReLU函數,輸出層使用Tanh激活函數。另外,判別器中對所有層均使用LeakyReLU。
上面這四點,在原文中就是:
DCGAN的框架結構
前面提到的,DCGAN的兩個網絡都是用了卷積層。注意,CNN包含卷積層,其后是歸一化層或池化層,之后是激活函數。
DCGAN中,判別網絡接收圖像,使用卷積層和池化層對其進行下采樣,然后使用全連接分類層將圖像分類為真的或假的。生成網絡從潛在空間中獲取隨機噪聲向量,然后通過上采樣機制進行上采樣,最后生成一張圖像。隱藏層是用LeakyReLU作為激活函數,並且使用系數介於0.4-0.7的隨機失活來避免過擬合。
生成器架構圖
如圖所示,輸入z是100位的隨機數據,服從范圍在[-1, 1]的均勻分布。經過一系列的空洞卷積之后,形成一張分辨率為64x64x3的圖像的過程。
判別器架構圖
首先看判別網絡的架構:
上圖展示了判別網絡架構的頂層概況。
判別網絡是包含10層(可以添加更多層)的CNN。簡單說來,它接收維度為64×64×3的圖像,使用2D卷積層對其進行下采樣,然后傳遞給全連接層進行分類。判別網絡輸出估測,判斷給定圖像是真是假。輸出值為0或1,輸出1表示判別網絡接收的圖像為真,輸出0表示該圖像為假。
訓練細節
參數設置
- 訓練集:Large-scale Scene Understanding(LSUN)、Imagenet-1k and a newly assembled Faces dataset
- LeakyReLU斜率:0.2
- 優化器:Adam —— \(\beta_1 = 0.5\)
- 學習率:0.0001
- 初始輸入:以0為中心的正態分布,標准差為0.02
- 梯度下降:SGD
實驗結果
1. 漫游隱空間
通過使用插值微調噪音輸入z 的方式可以導致隱空間結構發生變化從而引導生成圖像發生語義上的平滑過度,比如說從有窗戶到沒窗戶,從有電視到沒電視等等。
2. 語義遮罩
通過標注窗口,並判斷激活神經元是否在窗口內的方式來找出影響窗戶形成的神經元,將這些神經元的權重設置為0,那么就可以導致生成的圖像中沒有窗戶。從下圖可以看到,上面一行圖片都是有窗戶的,下面一行通過語義遮罩的方式拿掉了窗戶,但是空缺的位置依然是平滑連續的,使整幅圖像的語義沒有發生太大的變化。
3. 矢量算法
在向量算法中有一個很經典的例子就是【vector("King") - vector("Man") + vector("Woman") = vector("Queue")】,作者將該思想引入到圖像生成當中並得到了以下實驗結果:【smiling woman - neutral woman + neutral man = smiling man】
代碼實現
(未完成)