掌握可視化卷積神經網絡模型,帶你暢游圖像識別技術領域
在走進深度學習的過程中,最吸引作者的是一些用于給對象分類的模型。***的科研結果表示,這類模型已經可以在實時視頻中對多個對象進行檢測。而這就要歸功于計算機視覺領域***的技術革新。
眾所周知,在過去的幾年里,卷積神經網絡(CNN或ConvNet)在深度學習領域取得了許多重大突破,但對于大多數人而言,這個描述是相當不直觀的。因此,要了解模型取得了怎樣大的突破,我們應該先了解卷積神經網絡是怎樣工作的。
卷積神經網絡可以做些什么?
卷積神經網絡用于在圖像中尋找特征。在CNN的前幾層中,神經網絡可以進行簡單的"線條"和"角"的識別。我們也可以通過神經網絡向下傳遞進而識別更復雜的特征。這個屬性使得CNN能夠很好地識別圖像中的對象。
卷積神經網絡
CNN是一個包含各種層的神經網絡,其中一些層是卷積層、池化層、激活函數。
卷積層是如何工作的?
要了解CNN如何工作,你需要了解卷積。卷積涉及瀏覽圖像和應用濾波器等具體內容。
上圖是一個5x5的矩陣。現在,你另外選取一個3x3矩陣,然后移動到圖像上,將3x3矩陣與被覆蓋的圖像部分相乘以生成單個值。緊接著,3x3矩陣向右和向下移動以"覆蓋"整個圖像。***,我們將獲得如上所示的內容。
卷積層的目標是過濾。濾波器是由矢量的權重堆疊乘以卷積輸出的值來表示的。當訓練圖像時,這些權重會發生變化,也就是說當進行圖像評估時,它會通過它捕捉到的一些特征來預測出圖像的內容。
池化層
卷積層之后的層主要是CNN架構中的池化層。它將輸入的圖像分割為一組不重疊的矩形,并且對于每個子區域都輸出一個值。
兩個主要的池化層是***池和平均池。
***池 - 輸出子區域的***值。
平均池 - 輸出子區域的平均值。
池化層用于減少空間維度而不是深度。
減少空間維度的主要優點是:
- 通過減少空間信息,可以優化計算性能。
- 通過減少空間信息意味著你可以使用較少的參數來訓練模型,從而減少過度擬合的可能性。
- 獲得一些固定的值。
激活函數
激活函數的工作方式與其他神經網絡完全相同,該函數的主要左右是將值壓縮到一個特定的范圍內。一些常用的激活函數是:
最常用的激活函數是ReLu激活函數。它需要輸入'x'并判斷'x'是否為正,如果不為正則返回0。使用ReLu函數的原因是因為它的執行成本很低。
上圖是卷積層的一般表示。我們通過池化層進行了卷積和ReLu函數。這些層彼此堆疊。
雖然定義和訓練深度神經網絡(DNN)比以往任何時候都容易,但大多數人還是會陷入誤區。
為此目的,我們使用可視化來理解CNN模型中的各種層。
使用Keras實現可視化
在這部分我們將嘗試使用Keras實現可視化。我們將使用Keras可視化輸入,***限度地激活VGG16體系結構的不同層中的濾波器,并對ImageNet進行訓練。
首先,讓我們從在Keras中定義VGG16模型開始:
請注意,我們只進入***一個卷積層。原因是添加完全連接的層會強制你使用模型的固定輸入大小(224x224,原始ImageNet格式)。 通過保留卷積模塊,我們的模型可以適應任意輸入大小。
該模型加載了一組預先在ImageNet上訓練過的權重。
現在讓我們定義一個損失函數,它將促進特定層(layer_name)中的特定濾波器(filter_index)的激活。我們通過Keras后端函數執行此操作,該函數支持我們的代碼在TensorFlow和Theano之上運行。
一切都很簡單。這里唯一的技巧是規范輸入圖像的像素梯度,以確保梯度上升足夠平滑。
現在我們可以使用我們定義的Keras函數在輸入空間中進行梯度上升:
使用TensorFlow在CPU上執行此操作需要幾秒鐘。
然后我們可以提取并顯示生成的輸入:
結果:
***層基本上只是編碼方向和顏色。然后將這些方向和濾波器組合成基本網格和斑點紋理。這些紋理逐漸組合成越來越復雜的圖案。
你可以將每層中的濾波器視為矢量的基礎,它通常是完整的,可用于以緊湊的方式將輸入層進行編碼。當濾波器開始整合來自越來越大的空間范圍的信息時,濾波器會變得更加復雜。
以下是從不同層生成的要素圖的圖片:
第1層主要生成水平、垂直和對角線。主要用于檢測圖像中的邊緣。 第2層將嘗試提供更多的信息。它主要檢測角落。第3層我們開始可以檢測到一些復雜的圖案,如眼睛、臉等。我們可以假設這個特征圖是從訓練過的人臉檢測模型中獲得的。在第4層,它可以在面部的更復雜部分(例如眼睛)。
在第5層中,你可以使用要素圖生成人的具體面孔、汽車輪胎、動物的面孔等。此要素圖包含有關圖像中的大多數信息。
結論
一般而言,CNN和其他圖像識別模型并沒有太大區別。我們可以通過閱讀相關書籍加深對這方面的了解。