cs231n---卷積網絡可視化,deepdream和風格遷移


本課介紹了近年來人們對理解卷積網絡這個“黑盒子”所做的一些可視化工作,以及deepdream和風格遷移。

 

1 卷積網絡可視化

 

1.1 可視化第一層的濾波器

 我們把卷積網絡的第一層濾波器權重進行可視化(權重值縮放到0~255之間)可以發現:

第一層的濾波器可以看做模版匹配,那么它尋找的模式就是一些邊和線。也就是說,當濾波器滑動到邊和線的時候,會有較大的激活值。這跟人腦的功能幾乎是一致的。

然而,我們只能可視化第一層濾波器得到如此有意義的結論,可視化后面的濾波器,我們將無法看到什么有用的東西。

 

1.2 研究最后一層

這里的最后一層指的是在輸入到最后的得分之前的那一層。

最近鄰

左圖是我們在像素空間上求最近鄰的結果,右圖是我們在最后一層產生的特征向量空間上求最近鄰的結果。可以看到右邊的有些結果,雖然在像素上大有不同,但是卻有相同的語義含義。說明卷積網絡處理后的特征向量確實包含着語義信息。

t-SNE降維后可視化

還有一種方法是對最后一層產生的特征向量做t-SNE降維(一種非線性降維方法),降到兩維。然后在二維坐標系中將這些圖片的位置標識出來。具體結果可以看這里:

http://cs.stanford.edu/people/karpathy/cnnembed/  

 

1.3 可視化激活層

有一些研究可視化了中間的激活層(featureMap):

大部分的激活好像都不能看到什么東西,有一個激活很明顯的與人臉對應。

 

1.4 產生最大激活值的圖片碎片

我們從每層當中選擇一個深度切片,然后在CNN上前向傳播大量的圖片,觀察這些深度切片上的神經元的激活值。對每一張圖片來說,選取深度切面上激活值最大的那個神經元,並截取這個神經元所能看到的圖片區域。然后按照激活值的大小對這些圖片區域進行排序。

 

上圖中,每一行表示每一個深度切面的排序結果,可以看到一個深度切面確實是在尋找一種相同的模式。並且,高層所尋找的是一種更大的圖片結構,這是因為高層的神經元具有更大的感受野。

 

 1.5 “排除”實驗

有一項研究通過遮擋圖像的某一部分,將這部分替換為平均像素值,然后查看對輸出分數的影響,繪制熱力圖。

可以看到船的主體部分,大象的身體,卡丁車以及賽道都對其具體的分類有較大影響。

 

1.6 Saliency Maps 

我們可以查看輸出分數關於輸入像素的梯度(也就是哪些像素的改變對於輸出分數影響最大)。將梯度取絕對值並縮放到0~255之間,進行可視化:

這也被稱為Saliency Maps。 Saliency Maps可以用來做無監督的語義分割(注意,這里事實上還是有監督的,因為產生Saliency Maps的肯定是一個訓練好的CNN,只不過我們不需要那些對每個像素都打好標簽的圖片)。這方面內容可以看看這篇文章:Rother et al, “Grabcut: Interactive foreground extraction using iterated graph cuts”, ACM TOG 2004 

 

1.7 guided backprop

與 Saliency Maps類似,只不過我們這里是看某個特定神經元的激活值關於圖片像素的梯度。對梯度可視化的結果如下:

上圖我們看到的是(4)中的神經元關於對應的輸入圖片的梯度。顯然,每一個神經元的激活都對圖像的一種特定模式特別敏感,印證了我們在(4)中的結論。

 

 1.8 Gradient Ascent 

Saliency Maps 和guided backprop都是前向傳播一張特定的圖片,然后看輸出分數或中間激活值關於輸入像素的梯度。

Gradient Ascent則是要找到使得某個激活值最大的輸入是長什么樣子,即生成一張圖片。我們使用的方法是輸入一張空白圖片,前向傳播得到激活值(或得分值),然后反向傳播計算激活(得分)關於輸入的梯度,然后輸入使用梯度下降更新,不斷迭代,直到生成一張滿意的圖片。

這里我們添加了正則項,是為了使得生成的圖片更自然。

這里是一些生成的結果:

另外還有一些方法能夠使得生成的圖片更漂亮,具體可以看CS231n課件。

 

我們可以用Gradient Ascent 的方法來生成對抗樣本,步驟為:

生成的對抗樣本在人眼上看不出什么差別,但在神經網絡看來卻會將其錯誤分類。這確實有點顛覆我們的認知。

更多對抗樣本的知識見Ian Goodfellow的講座。

 

2 DeepDream

deepdream其實就是利用Gradient Ascent來最大化某一層激活的范數,相當於放大這一層學到的特征。具體步驟為:

最后會生成一些很crazy的圖片,這里不貼圖了。可以看看deepdream的官方博客:

http://googleresearch.blogspot.ch/2015/06/inceptionism-going-deeper-into-neural.html

 

3 風格遷移

在介紹風格遷移之前,先介紹特征反演和紋理生成。

 

3.1 特征反演 Feature Inversion

特征反演是為了查看不同層的特征向量能保留多少原始的圖片信息。

任選一張圖片,前向傳播到已經訓練好的CNN。然后選取CNN當中某一層產生的特征向量,記住這個向量。現在,我們要生成一張圖片,盡量讓它在該層產生一樣的特征向量。這個任務仍然是用Gradient Ascent來做,目標函數定義為最小化生成圖片的特征向量與給定特征向量的L2距離,並且加一些正則化項保證生成圖片的平滑:

用這種方法,我們可以看到不同層的特征向量所包含的信息完整度:

可以看到,在relu2_2層,可以根據特征向量幾乎無損地恢復出原圖片。但是隨着層的深入,神經網絡記住的只是圖片的線條結構,顏色這些低階信息開始丟失。

 

3.2 紋理生成 Texture Synthesis 

本節主要介紹目前效果最好的基於深度學習的神經紋理生成方法。注意在這之前有一些傳統的方法(最近鄰法),這些方法在簡單紋理上表現效果可以,但無法處理更復雜的紋理生成。

格萊姆矩陣 Gram Matrix 

將一張圖片傳入一個已經訓練好的CNN,選定其中一層激活,其大小是C*H*W,可以看做是H x W 個C維向量。從這個激活圖中任意選取兩個C維向量,做矩陣乘法可以得到一個矩陣。然后對激活圖中任意兩個C維向量的組合,都可以求出這樣一個矩陣。把這些矩陣求和並平均,就是Gram Matrix。

Gram Matrix其實是feature之間的偏心協方差矩陣(即沒有減去均值的協方差矩陣)。其計算了每個通道特征之間的相關性,考察哪些特征是此消彼長的,哪些特征是同時出現的。我們認為Gram Matrix度量了圖片中的紋理特性,並且不包含圖像的結構信息。事實上,使用協方差矩陣代替Gram Matrix也能取得很好的效果,但是Gram Matrix有更高效的計算方法:將激活圖張量C*H*W展開成C*HW的形式,然后將其乘以其轉置,即得到gram矩陣。

神經紋理生成

當我們有了Gram矩陣這一度量圖像紋理特性的神器后,就可以使用類似於Gradient Ascent的算法來產生特定紋理的圖像。算法流程為:

該算法旨在生成與目標圖像具有相同gram矩陣的圖像。這里計算的損失是生成圖像與目標圖像各層gram矩陣的加權L2距離。

效果 

這張圖表示,如果以更高層gram矩陣的L2距離作為損失函數,那么生成圖像就會更完全地重建圖像的空間結構。這是由於更高層的神經元具有更大的感受野導致的。

 

3.3 風格遷移

如果我們結合特征反演和紋理生成,就可以實現所謂的風格遷移。我們需要兩張圖像,一張圖像稱為Content image,生成圖像需要重建它的空間結構;另一張圖像稱為Style image,生成圖像需要重建它的紋理結構。使用下面的框架完成這個任務:

在這個框架中,我們同時優化特征反演和紋理生成的損失函數(與gram矩陣的距離以及與激活圖的距離的加權和),使得生成圖既具有Content image的空間結構,又具有Style image的紋理結構。

 

這里有一些超參數,使得我們可以控制生成的圖像:

此外,我們可以使用不同風格的gram矩陣的加權和,來生成多風格圖:

 

Fast Style Transfer 

上面的風格遷移框架,每生成一張新的圖像都需要迭代數次。因此有研究提出了下面的Fast style Transfer的框架:

同樣使用特征反演和紋理生成的聯合損失函數,更新前饋網絡中的參數值。這樣,訓練好一個前饋網絡后,每次生成一個新圖像只需要進行一次前向傳播即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM