近年來,卷積神經網路(CNN)在海量資料的物體分類、識別取得了巨大的成功,但是我們對CNN為什麼能夠取得這麼好的效果以及其中間層所計算得到的特徵的理解卻是遠遠落後與CNN的應用。更多的時候CNN對於我們來說就像個黑盒子,輸入資料和便籤進行訓練,然後就可以擬合出我們想要的結果。
如果不能弄明白CNN為什麼能夠工作的這麼好,構建一個好的CNN模型就只能靠試錯。為了對CNN有個直觀的瞭解,近年來有許多工作圍繞著CNN視覺化來展開。
目前CNN的視覺化方法主要分為兩種:
(1) 前向計算視覺化
透過前向計算直接視覺化深度卷積網路每層的feature map,然後觀察feature map的數值變化。一個訓練成功的CNN網路,其feature map的值伴隨網路深度的增加,會越來越稀疏。
(2)反向計算視覺化
反向訊號向後傳播將低維的feature maps 還原到原影像空間,視覺化該feature map被原圖哪部分特徵啟用,從而理解該feature map從原影像學習了何種特徵。
本文後面的內容也主要圍繞這兩方面展開。
模型介紹
在介紹一些具體的視覺化方法之前,我們先介紹一下我們使用的模型,我們使用的網路是經過CaffeNet微調,用來分類21類光學遙感影像的模型,具體內容可參考CNN在光學遙感影像上的應用。
CaffeNet其實就是AlexNet在Caffe上的實現,為了適應我們具體的分類任務,輸出層改為21個節點。
其中要分類的21類光學遙感影像如下圖所示:
前向計算視覺化
特徵視覺化
透過視覺化CNN計算得到的特徵通常是大家都能想到的事情,通常第一層能提取到的特徵能夠和影像對應上,但是到了CNN的更高層,提取到的特徵就變的更加抽象,不容易解釋。
如下圖所示,Input為輸入影像,Filter為CNN第一層卷積層所學
習到的引數,視覺化後其實就是一個個抽取邊緣的濾波器,然後Output為CNN第一層卷積層所提取到的特徵,從圖中可以看出來輸入影像經過CNN第一層卷積層之後得到了邊緣特徵。
但是CNN高層濾波器對前面輸入特徵的組合,提取得到的高維特徵就不怎麼好解釋了,如下圖所示,順著箭頭方向依次為上述輸入圖片透過CNN高層卷積層所提取到的特徵,可以發現特徵隨著網路的加深,會越來越抽象、越來越稀疏。
t-SNE visualization
有時為了體現CNN提取到特徵的相關性,我們可以把提取到的特徵經行t-SNE降維,然後在二維平面顯示出來,如下圖所示。從下圖可以看出,視覺上看上去相似的圖片,在降維後在平面上也很靠近。我們提取的是fc7層的特徵(也稱為CNN-Code),t-SNE降維為2維向量顯示如下。
遮擋實驗
如下圖,左邊的圖為輸入影像,注意上邊的黑色遮擋區域,我們在輸入影像上逐漸移動遮擋區域,然後記錄對應輸入影像所對應的正確類別的輸出機率。很容易理解,當我們遮擋住輸入影像的關鍵區域時,對應的正確輸出機率會很低,從下圖也可以看出來,當遮擋住飛機的關鍵部位時,CNN判別為飛機場的機率下降到0.2以下。說明CNN模型確實學習到了物體的關鍵部分,而不是隻依靠一些上下文環境,遮擋實驗的程式碼可參考:occlusion_experiments。
反向計算視覺化
前面介紹的幾種前向計算視覺化的方法都比較好理解,但是還是不能解釋CNN深層提取到的特徵究竟是什麼,究竟對應了輸入影像的哪一部分。
反向求導視覺化
在探討對影像反向求導視覺化之前,我們先看看那一個線性分類器,公式如下:
W為線性分類器權值、x_i表示一幅輸入影像,b為偏置。如下圖所示,W為線性分類器的權值維度為[3×4],3表示要分類的數目,4表示為圖片的每一個畫素值打分;其中x_i為一幅影像展成的列向量,維度為[4×1];b的維度為[3×1],所以Wx_i+b得到一個[3×1]的向量表示當前輸入影像x_i在每個類別上的打分,其中最高分預判為輸入影像的類別。透過上述分析
可知W值決定了影像中的對應畫素的重要性,某一類中某個畫素越重要,則其對應的權值越大。
對於CNN來說因為有很多層非線性函式,f(x_i)為一個高度非線性話的分類器,不過我們可以把它看做一個整體,近似的等於一個線性分類器。
然後我們可以對某個輸入圖片x_0上對上式求導,得打權值W,也就得到了對應輸入圖片的重要性大小。
產生的影像如下圖所示,不是很明顯,仔細看能看出飛機的輪廓。
欺騙CNN網路
上面討論了透過對圖片求導來得到對應圖片畫素的重要性,我們可以利用上面求到的影像導數來欺騙CNN網路,如下圖所示坐上圖為輸入圖片類別為airplane,然後給定一個目標類別denseresidential,我們透過對輸入影像求梯度上升來最大化目標類別的輸出,求得的梯度累加到輸入影像上,知道CNN判別為目標類別。下圖中我們可以看出,上面的兩個圖人眼看起來都是airplane類別,差別看起來也不大,但是CNN判別第二張圖為denseresidential類比,從某種意義上說我們欺騙了CNN。
Class Model Visualisation
對於一個訓練好的CNN模型,我們可以透過隨機產生一張帶噪聲的圖片然後在我們感興趣的類別上透過梯度上升逐漸最佳化輸入圖片可以產生對應類別的圖片。
產生的圖片如下所示,可以看出產生的影像對目標的分類又一定的旋轉不變形和尺度不變性。
Feature Inversion
為了CNN怎麼去學習和理解特徵,最近也有文章提出透過提取到的特徵重建原影像的方法。我們在訓練好的CNN模型的基礎上,可以透過對影像的求導來實現。
下圖展示了從不同層提取的特徵重建原圖的結果,可以看出層數越深,重建出的結果和原圖差異越大,因為CNN在特取特徵的過程中,還有一個壓縮學習圖片最本質特徵的作用,所以越往後層,重建得到圖片越是代表原圖片的本質。
DeepDream
2015年夏天,google釋出了一種從神經網路產生圖片的新方法,原理其實很簡單,就是從神經網路中的某一層提取特徵,然後讓這一層的反向梯度等於這一層提取到的特徵,然後在反向傳導回影像,通常會選擇在卷積層進行操作,所以可以產生任意解析度的影像。
過程如下,我們先對CNN輸入一張原圖:
然後選擇啟用某一層的特徵,如果選擇的是高層特徵,反向傳遞得到的結果如下,高層特徵反向傳遞得到了一些複雜的模式;
如果是低層的特徵,則得到的是一些線條,紋理特徵。
如果我們把上述輸出的結果當成輸入再次傳入,經過一定次數的迴圈,一些模式會得到增強,輸出結果看起來有點驚悚:
反摺積視覺化
反摺積顧名思義是和卷積相反的操作,使用反摺積進行特徵的視覺化,可以理解為把得到的特徵對映回原影像的輸入空間。反摺積網路如下圖所示,其中下圖左邊為反摺積網路、右邊為卷積網路。其中反摺積網路中的反摺積層和卷積網路中卷積層對應,Unpooling層和pooling層對應。卷積網路是輸入影像提取特徵,而反摺積網路是從特徵對映到輸入影像。
流程如上圖所示。
正常卷積過程convnet:
如圖右側黑框流程圖部分,上一層pooled的特徵圖,透過本層的filter卷積後,形成本層的卷積特徵,然後經過ReLU函式進行非線性變換的到Recitifed特徵圖,再經過本層的max-pooling操作,完成本層的卷積池化操作;之後傳入下一層。本層需要記錄在執行max-pooling操作時,每個pooing局域內最大值的位置
選擇啟用值:
為了理解某一個給定的pooling特徵啟用值,先把特徵中其他的啟用值設定為0;然後利用deconvnet把這個給定的啟用值對映到初始畫素層。
反摺積過程deconvnet:
Unpooling
顧名思義就是反pooling過程,由於pooling是不可逆的,所以unpooling只是正常pooling的一種近似;透過記錄正常pooling時的位置,把傳進來的特徵按照記錄的方式重新“擺放”,來近似pooling前的卷基層特徵。如圖中彩色部分
Filtering
利用卷積過程filter的轉置(實際上就是水平和數值翻轉filter)版本來計算卷積前的特徵圖;從而形成重構的特徵。從一個單獨的啟用值獲得的重構圖片類似原始圖片的一個部分。
反摺積反池化過程如下所示:
總結
透過CNN視覺化,我們可以看到底層卷積網路學習到的是一些邊緣、顏色塊等資訊;高層網路透過對底層網路抽取到的特徵經行組合,學習到了更加複雜以及具有不變性的特徵。特徵的視覺化都是透過對圖片方向求導來計算,透過設定不同的最佳化函式,梯度下降求導來達到視覺化的目的。