1. 程式人生 > >2017CS231n李飛飛深度視覺識別筆記(十二)——視覺化和理解卷積神經網路

2017CS231n李飛飛深度視覺識別筆記(十二)——視覺化和理解卷積神經網路

第十二講 視覺化和理解卷積神經網路

課時1 特徵視覺化、倒置、對抗樣本

    上一章中計算機視覺中一些內容,包括影象分割、檢測以及識別;這一章中將討論卷積神經網路的內部真正的工作原理是什麼。

    第一層:由許多卷積核組成,每個卷積核是11*11*3,這些卷積核在輸入影象上來回滑動,取影象塊和卷積核權重的內積,這就是第一層的輸出;可以把這個卷積核看成有3個通道的形狀為11*11的影象,並且給定紅色、綠色、藍色的值,如圖所示的第一層的視覺化:

    可以看到卷積核正在尋找什麼,它們都在尋找有向邊,比如明暗線條,從不同的角度和位置來觀察輸入影象,可以看到完全相反的顏色。

    中間層:如果對中間的層進行相同的視覺化,但是實際上它的解釋性會差很多,第二層的權重經過卷積之後,這裡有一些ReLU啟用函式和一些其他的非線性啟用函式,但不能從卷積核權重裡面得到太多的資訊,這裡的做法是可以把卷積核平面展開成灰度影象;這些灰度影象顯示了第二層某個卷積核的權重。

    對於視覺化中間層的特徵,可以做一件每場有用的事情是視覺化輸入影象中什麼型別的影象塊可以最大限度地啟用不同的特徵、不同的神經元;這裡的做法是選取AlexNet的卷積層,記住每一個啟用量提供了128*13*13的三維資料,然後選擇128個通道其中的一個,通過神經網路執行很多影象,對於每個影象記錄它們的卷積特徵,可以觀察到那個特徵對映圖的部分已經被影象的資料集最大地啟用,然後對這些最大化啟用的影象塊進行視覺化。

    最後一層:神經網路的最後一層通過大概1000個類的得分來得到資料集中每個類的得分,而在最後一層之前通常有一些完全連線的層,以AlexNet為例,用4096維的特徵向量來表示影象,將其輸入到最後一層來預測最終類的得分;可以用近鄰演算法視覺化最後的結果。

    從另一個角度來看最後一層到底發生了什麼,通過降維的方法,比如PCA可以讓你把像4096維的特徵向量的高維表示壓縮到二維空間,以便能更加直觀地視覺化這個特徵空間;還有一種強大的演算法叫t-SNE,即t-分佈領域嵌入,它是人們經常在深度學習裡面視覺化特徵的非線性降維方法,如下圖的例項:

    這裡的視覺化顯示了mnist資料集上的t-SNE降維,(mnist是手寫的0-9之間的數字構成的資料集),每個影象都是28*28的灰度影象,使用t-SNE把28*28維的原始畫素特徵空間作為mnist,現在把它壓縮到2維,在這個壓縮的二維表示中視覺化每個mnist資料。

    所以可以在訓練影象網路分類器最後一層的特徵上應用t-SNE降維技術,記錄每個影象在最後一層的4096維的特徵向量,通過t-SNE降維方法把4096維的特徵空間壓縮到2維特徵空間,在壓縮後的2維特徵空間中佈局網格,觀察網格中的每個位置會出現什麼型別的影象,通過這種方法可以粗略感受到學習到的特徵空間的幾何結構是什麼樣子的。

    下面介紹有個有趣的實驗:排除實驗。

    我們想要做的是弄清楚究竟是輸入影象的哪個部分導致神經網路作為了分類的決定;如下所以遮擋某個區域的某個部分:

    然後把它替換成資料集的平均畫素值,通過神經網路執行被遮擋的影象,然後記錄遮擋影象的預測概率;現將這個遮擋影象塊劃過輸入影象的每個位置,重複相同過程,繪製圖像的熱力圖,作為影象遮擋部分的預測概率輸出。

    這個想法是如果遮擋影象的某個部分並且導致了神經網路分值的急劇變化,那麼這個遮擋的輸入影象部分可能對分類決策起到非常重要的作用。

    另一個相關的概念是顯著圖,即給出輸入影象以及預測類標籤,想要知道輸入影象中的哪部分畫素對於分類時重要的,遮擋是解決這個問題的一種方法,但是顯著圖從另一個角度解決這個問題。

    傳導式反向傳播的思想也可以告訴我們影象塊的哪個部分影響了神經元的分值。

    關於傳導式反向傳播或計算顯著圖的意見有趣的事情是總有一個固定輸入影象的函式,這個函式告訴我們對於一個固定輸入的影象,輸入影象的哪個畫素或者哪個部分影響了神經元的分值;那麼如果在一些輸入影象上移除這種依賴性,什麼型別的輸入會啟用這個神經元,這裡可以使用梯度上升法:

    總是在訓練卷積神經網路時使用梯度下降來使函式損失最小化,而現在想要修正訓練的卷積神經網路的權重,並且在影象的畫素上執行梯度上升來合成影象以嘗試最大化某些中間神經元和類的分值。在執行梯度上升的過程中,不再優化神經網路中保持不變的權重,相反試圖改變一些影象的畫素使這個神經元的值或這個類的分值最大化,會加入一些正則化項強制生成影象看起來像是自然影象的東西。

    一般的策略

   (1)把初始化影象為0或者通過新增高斯噪聲來進行影象去噪;

  (2)然後通過3D神經網路重複轉發影象並計算感興趣的神經元分值;

  (3)通過反向傳播來計算相對於影象畫素神經元分值的梯度,對影象畫素本身執行一個小的梯度下降或者梯度上升更新以使神經元分值最大化;

  (4)不斷重複上述步驟直到擁有一個漂亮的影象。

課時2 DeepDream和風格遷移

    另一件可以做的基於梯度的影象優化是DeepDream,它的思想:提取輸入影象通過神經網路執行到某一層,接著進行反向傳播並且設定該層的梯度等於啟用值,然後反向傳播到影象並不斷更新影象,它的實現如下:

    Deepdream的展示:

    另一件可以做的非常有用的事情是特徵反演,這讓我們再次瞭解到神經網路的不同層可以捕獲影象的哪些型別的元素。

    我們需要做的是選取一張影象,通過神經網路執行該影象,記錄其中一個影象的特徵值,然後根據它的特徵表示重構那個影象,基於重建影象的樣子這將給我們一些關於在該特徵向量中捕獲的影象型別的資訊,可以通過梯度上升和正則化來做到這點,與其最大化某些分值,不如最小化捕獲到的特徵向量之間的距離,並且在生成影象的特徵之間嘗試合成一個新的與之前計算過的影象特徵相匹配的影象;這裡用到了全變差正則化將左右相鄰畫素之間的差異拼湊成上下相鄰以嘗試增加生成影象中特殊的平滑度。

    下面給出了特徵反演在不同的神經網路中的視覺化效果:

    這是一種非常酷的風格轉移,除了理解風格轉移以及特徵反演,還需討論一個相關的問題:紋理合成。

    紋理合成在計算機圖形學中是個老問題,比如給定一些紋理的輸入影象塊,想要構建某個模型以使其生成更大塊的相同的紋理影象。

    為了在神經網路上進行紋理合成,使用格拉姆矩陣,在如下的例項中,選取輸入的石頭紋理,把它傳遞給卷積神經網路,抽取它們在卷積網路某層的卷積特徵。

    假設卷積特徵體積H*W*C,可以把它看成H*W的空間網路,在網格上的每一點都有C維的特徵向量來描述影象在這點的外觀,然後用啟用對映圖來計算輸入紋理影象的對映符,選取輸入特徵的兩個不同列,每個特徵列都是C維的向量,通過這兩個向量得到C*C的矩陣,使用H*W網格中不同點所對應的特徵向量取它們的平均值,得到C*C的格拉姆矩陣;這最終是一個很好的紋理描述符。

    一旦有了神經網路上進行紋理合成,就可以通過梯度上升來合成與原始影象紋理相匹配的新的影象。

    實驗的效果圖:

    當把格拉姆矩陣匹配的紋理合成方法與特徵匹配的特徵反演法結合起來會產生非常棒的風格遷移演算法;在風格遷移中,把兩張影象作為輸入影象,第一步選取其中一張影象作為內容影象,它引導我們生成影象的主體,同樣的風格影象負責生成影象的紋理或風格,然後共同做特徵識別,通過最小化內容影象的特徵重構損失以及風格影象的格拉姆矩陣損失,就能得到非常棒的影象。

    但是風格轉移演算法有一個問題,即風格遷移演算法的效率非常低,為了生成新影象,需要通過訓練神經網路計算大量的正向傳播和反向傳播,特別是為了生成高解析度影象;解決方法是訓練另一個神經網路來進行風格遷移的工作。

    總結:

    提到了很多方法來理解CNN以及一些基於近鄰,降維,最大化影象塊以及遮擋影象的啟用法以使在啟用值的基礎上理解這些特徵在尋找什麼;也討論了一些基於梯度飛方法,可以使用梯度來合成新影象來理解特徵的意義。