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以及一些基於近鄰,降維,最大化圖像塊以及遮擋圖像的激活法以使在激活值的基礎上理解這些特徵在尋找什麼;也討論了一些基於梯度飛方法,可以使用梯度來合成新圖像來理解特徵的意義。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章