1. 程式人生 > >DL04-卷積神經網路CNN圖解[轉]

DL04-卷積神經網路CNN圖解[轉]

卷積神經網路CNN圖解

0 背景

之前在網上搜索了好多好多關於CNN的文章,由於網路上的文章很多斷章取義或者描述不清晰,看了很多youtobe上面的教學視訊還是沒有弄懂,最後經過痛苦漫長的煎熬之後對於神經網路和卷積有了粗淺的瞭解。

於是在這裡記錄下所學到的知識,關於CNN 卷積神經網路,需要總結深入的知識有很多:
人工神經網路 ANN
卷積神經網路 CNN
卷積神經網路 CNN - BP演算法
卷積神經網路 CNN - LetNet分析
卷積神經網路 CNN - caffe應用
全卷積神經網 FCN
如果對於人工神經網路或者神經元模型不是太瞭解,建議先去了解《人工神經網路ANN》。

1 卷積神經網路

卷積神經網路說白了就是神經網路的一種分支,因此看懂神經元尤為重要:
這裡寫圖片描述
卷積神經網路沿用了普通的神經元網路即多層感知器的結構,是一個前饋網路。以應用於影象領域的CNN為例,大體結構如圖。
這裡寫圖片描述
根據上圖 卷積神經網路 ConvNet 可以分為4大層:

  1. 影象輸入Image Input:為了減小後續BP演算法處理的複雜度,一般建議使用灰度影象。也可以使用RGB彩色影象,此時輸入影象原始影象的RGB三通道。對於輸入的影象畫素分量為 [0, 255],為了計算方便一般需要歸一化,如果使用sigmoid啟用函式,則歸一化到[0, 1],如果使用tanh啟用函式,則歸一化到[-1, 1]。

  2. 卷積層(Convolution Layer):特徵提取層(C層) - 特徵對映層(S層)。將上一層的輸出影象與本層卷積核(權重引數w)加權值,加偏置,通過一個Sigmoid函式得到各個C層,然後下采樣subsampling得到各個S層。C層和S層的輸出稱為Feature Map(特徵圖)。

  3. 光柵化(Rasterization):為了與傳統的多層感知器MLP全連線,把上一層的所有Feature Map的每個畫素依次展開,排成一列。

  4. 多層感知器(MLP):最後一層為分類器,一般使用Softmax,如果是二分類,當然也可以使用線性迴歸Logistic Regression,SVM,RBM。

詳細地展開2卷積層:

C層:特徵提取層。每個神經元的輸入與前一層的區域性接受域相連,並提取該區域性的特徵。一旦該區域性特徵被提取後,它與其它特徵間的位置關係也隨之確定下來。

S層:特徵對映層。網路的每個計算層由多個特徵對映組成,每個特徵對映為一個平面,平面上所有神經元的權值相等。特徵對映結構採用影響函式核小的sigmoid函式作為卷積網路的啟用函式,使得特徵對映具有位移不變性。特徵對映結構採用影響函式核小的sigmoid函式作為卷積網路的啟用函式,使得特徵對映具有位移不變性。此外,由於一個對映面上的神經元共享權值,因而減少了網路自由引數的個數。卷積神經網路中的每一個卷積層都緊跟著一個用來求區域性平均與二次提取的計算層,這種特有的兩次特徵提取結構減小了特徵解析度。

此外,由於一個對映面上的神經元共享權值,因而減少了網路自由引數的個數,降低了網路引數選擇的複雜度。卷積神經網路中的每一個特徵提取層(C層)都緊跟著一個用來求區域性平均與二次提取的計算層(S層),這種特有的兩次特徵提取結構使網路在識別時對輸入樣本有較高的畸變容忍能力。
這裡寫圖片描述

2 卷積

卷積層是卷積核在上一級輸入層上通過逐一滑動視窗計算而得,卷積核中的每一個引數都相當於傳統神經網路中的權值引數,與對應的區域性畫素相連線,將卷積核的各個引數與對應的區域性畫素值相乘之和,(通常還要再加上一個偏置引數),得到卷積層上的結果。如下圖所示。
這裡寫圖片描述
今天公司學通訊的同事跟我討論到底卷積是個什麼東西,給我說通過卷積後,訊號當中特別是時域會放大,https://en.wikipedia.org/wiki/Convolution。因此在FCN當中會通過卷積越變越大,但是這明明違背了影象卷積的概念。

下面這個動圖更好地解釋:
這裡寫圖片描述

3 CNN三大核心思想

卷積神經網路CNN的出現是為了解決MLP多層感知器全連線和梯度發散的問題。其引入三個核心思想:1.區域性感知(local field),2.權值共享(Shared Weights),3.下采樣(subsampling)。極大地提升了計算速度,減少了連線數量。

3.1 區域性感知

形象地說,就是模仿你的眼睛,想想看,你在看東西的時候,目光是聚焦在一個相對很小的區域性的吧?嚴格一些說,普通的多層感知器中,隱層節點會全連線到一個影象的每個畫素點上,而在卷積神經網路中,每個隱層節點只連線到影象某個足夠小區域性的畫素點上,從而大大減少需要訓練的權值引數。

對於一個 1000∗1000 的輸入影象而言,如果下一個隱藏層的神經元數目為 106 個,採用全連線則有 1000∗1000∗106=1012 個權值引數,如此數目巨大的引數幾乎難以訓練;而採用區域性連線,隱藏層的每個神經元僅與影象中 10∗10的區域性影象相連線,那麼此時的權值引數數量為 10∗10∗106=108,將直接減少4個數量級。

如下圖所示,左邊是每個畫素的全連線,右邊是每行隔兩個畫素作為區域性連線,因此在數量上,少了很多權值引數數量(每一條連線每一條線需要有一個權值引數,具體忘記了的可以回顧單個[神經元模型]。因此 區域性感知就是:
通過卷積操作,把 全連線變成區域性連線 ,因為多層網路能夠抽取高階統計特性, 即使網路為區域性連線,由於格外的突觸連線和額外的神經互動作用,也可以使網路在不十分嚴格的意義下獲得一個全域性關係。
這裡寫圖片描述
下面我們來詳細看一下到底區域性感知如何使 全連線變成區域性連線,按照人工神經網路的方法,把輸入影象的畫素一字排開之後,每一個畫素值就是一個神經元輸入,需要對隱層或者輸出層做全連線,如上圖左側所示。卷積神經網路引入卷積概念後,卷積核通過原影象,然後卷積核對原影象上符合卷積核大小的畫素進行加權求和,每一次只是對符合卷積核的影象畫素做卷積,這就是區域性感知的概念,使全連線變成區域性連線。
這裡寫圖片描述

3.2 權值共享

儘管區域性感知使計算量減少了幾個數量級,但權重引數數量依然很多。能不能再進一步減少呢?方法就是權值共享。

權值共享:不同的影象或者同一張影象共用一個卷積核,減少重複的卷積核。同一張影象當中可能會出現相同的特徵,共享卷積核能夠進一步減少權值引數。

如下圖所示,為了找到鳥嘴,一個啟用函式A需要檢測影象左側有沒有鳥嘴,另外一個啟用函式B需要檢測另外一張影象中間有沒有類似的鳥嘴。其實,鳥嘴都可能具有同樣的特徵,只需要一個啟用函式C就可以了,這個時候,就可以共享同樣的權值引數(也就是卷積核)。
這裡寫圖片描述
如果使用了權值共享(共同使用一個卷積核),那麼將可以大大減少卷積核的數量,加快運算速度。天下武功,唯快不破。
這裡寫圖片描述
舉個栗子,在區域性連線中隱藏層的每一個神經元連線的是一個 10∗10 的區域性影象,因此有 10∗10 個權值引數,將這 10∗10 個權值引數共享給剩下的神經元,也就是說隱藏層中 106 個神經元的權值引數相同,那麼此時不管隱藏層神經元的數目是多少,需要訓練的引數就是這 10∗10 個權值引數(也就是卷積核(也稱濾波器)的大小。

儘管只有這麼少的引數,依舊有出色的效能。但是,這樣僅提取了影象的一種特徵,如果要多提取出一些特徵,需要增加多個卷積核,不同的卷積核能夠得到影象的不同對映下的特徵,稱之為 Feature Map。如果有100個卷積核,最終的權值引數也僅為 100∗100=104 個而已。另外,偏置引數b也是共享的,同一種濾波器共享一個。

2.3 池化

在卷積神經網路中,沒有必要一定就要對原影象做處理,而是可以使用某種“壓縮”方法,這就是池化,也就是每次將原影象卷積後,都通過一個下采樣的過程,來減小影象的規模。

pooling的好處有什麼?
1. 這些統計特徵能夠有更低的維度,減少計算量。
2. 不容易過擬合,當引數過多的時候很容易造成過度擬合。
3. 縮小影象的規模,提升計算速度。

如下圖所示,原圖是一張500∗500 的影象,經過subsampling之後哦,變成了一張 250∗250 的影象。這樣操作的好處非常明顯,雖然經過權值共享和區域性連線後的影象權值引數已經大大減少,但是對於計算量來說,還是非常巨大,需要消費很大的計算時間,於是為了進一步減少計算量,於是加入了subsampling這個概念,不僅僅使影象畫素減少了, 同時也減少計算時間。
這裡寫圖片描述
舉個栗子:以最大池化(Max Pooling)為例,1000×1000的影象經過10×10的卷積核卷積後,得到的是991×991的特徵圖,然後使用2×2的池化規模,即每4個點組成的小方塊中,取最大的一個作為輸出,最終得到的是496×496大小的特徵圖。

下采樣,即池化,目的是減小特徵圖,池化規模一般為2×2。常用的池化方法有:

Pooling演算法

最大池化(Max Pooling)。取4個點的最大值。這是最常用的池化方法。
均值池化(Mean Pooling)。取4個點的均值。
可訓練池化。訓練函式 f ,接受4個點為輸入,出入1個點。

由於特徵圖的變長不一定是2的倍數,所以在邊緣處理上也有兩種方案:

保留邊緣。將特徵圖的變長用0填充為2的倍數,然後再池化。
忽略邊緣。將多出來的邊緣直接省去。

4 CNN 物理意義

瞭解三個關於CNN的核心特性之後,來看看CNN的具體是怎麼運作的。

為了從原始影象得到C層,需要把原始影象中的每一個畫素值作為神經網路當中一個神經元,那麼這裡把原始輸入影象一字排開,作為輸入層。通過BP反向傳播演算法計算好的權值引數(卷積核)去計算C層對應的的每一個畫素的值。
這裡寫圖片描述
從上圖我們得到了C層,也就是提取特徵後得到特徵層,需要對特徵層處理減少特徵數量,進一步抽取高層特性,因此需要進步特徵對映層(S層)。下圖的pooling層(S層)使用了max pooling演算法,pooling核為2x2,沒有重疊部分,取每4個畫素中最大的一個畫素值作為新的畫素值。
這裡寫圖片描述
那麼在這個模型當中,我們已經確定了啟用函式φ(∗),輸入x1,x2,…,xn 是確定的,未知量就剩下神經元k的突觸權值wk1,wk2,…,wkn ,bk 偏置。反向傳播演算法(back propagation)就是為了求整個神經網路當中的兩種未知變數:權值 w 和偏置 b。在上圖這個模型當中,卷積核大小為3∗3,也就是有9個權值w組成,因此反向傳播的時候就是要求這兩個卷積核的權值w,使用大量的圖片作為輸入就是為了使用BP演算法求得卷積核的值,當求得卷積核的值之後,分類的時候輸入一張未知的圖片,然後通過整個網路,直接就可以得到最終的分類結果,因為權值和偏置已經通過訓練求出來了,整個網路沒有未知量。

5 卷積神經網路圖解

這裡寫圖片描述
回顧一下開篇的CNN網路結構,輸入影象通過和三個可訓練的濾波器和可加偏置進行卷積。

濾波過程如圖,卷積後在C1層產生三個特徵對映圖,然後特徵對映圖中每組的四個畫素再進行求和,加權值,加偏置,通過一個Sigmoid函式得到三個S2層的特徵對映圖。

這些對映圖再進過濾波得到C3層。這個層級結構再和S2一樣產生S4,特徵對映圖中每組的畫素再進行求和,加權值,加偏置,通過一個Sigmoid函式得到多個freture map(S4)的特徵對映圖。

最終,這些畫素值被光柵化,並連線成一個向量輸入到傳統的神經網路進行分類判別,得到輸出。

6 小結

卷積神經網路CNN的核心思想是:區域性感知(local field),權值共享(Shared Weights)以及下采樣(subsampling)這三種思想結合起來,獲得了某種程度的位移、尺度、形變不變性,提高了運算速度和精度。

多層網路可以根據其輸入引出高階統計特性, 即使網路為區域性連線,由於格外的突觸連線和額外的神經互動作用,也可以使網路在不十分嚴格的意義下獲得一個全域性關係。這也就是CNN使用區域性連線之後還獲得很好的效果的原因。