卷積神經網絡介紹
卷積神經網絡是一種多層神經網絡,擅長處理圖像特別是大圖像的相關機器學習問題。
最典型的卷積網絡,由卷積層、池化層、全連接層組成。其中卷積層與池化層配合,組成多個卷積組,逐層提取特征,最終通過若干個全連接層完成分類。
卷積層完成的操作,可以認為是受局部感受野概念的啟發,而池化層,主要是為了降低數據維度。
綜合起來說,CNN通過卷積來模擬特征區分,並且通過卷積的權值共享及池化,來降低網絡參數的數量級,最后通過傳統神經網絡完成分類等任務。
經典卷積神經網絡
卷積神經網絡是一個多層的神經網絡,每層由多個二維平面組成,而每個平面由多個獨立神經元組成。
圖:卷積神經網絡的概念示范:輸入圖像通過和三個可訓練的濾波器和可加偏置進行卷積,濾波過程如圖一,卷積后在C1層產生三個特征映射圖,然后特征映射圖中每組的四個像素再進行求和,加權值,加偏置,通過一個Sigmoid函數得到三個S2層的特征映射圖。這些映射圖再進過濾波得到C3層。這個層級結構再和S2一樣產生S4。最終,這些像素值被光柵化,並連接成一個向量輸入到傳統的神經網絡,得到輸出。
一般地,C層為特征提取層,每個神經元的輸入與前一層的局部感受野相連,並提取該局部的特征,一旦該局部特征被提取后,它與其他特征間的位置關系也隨之確定下來;S層是特征映射層,網絡的每個計算層由多個特征映射組成,每個特征映射為一個平面,平面上所有神經元的權值相等。特征映射結構采用影響函數核小的sigmoid函數作為卷積網絡的激活函數,使得特征映射具有位移不變性。
層級介紹
- 數據輸入層/ Input layer
- 卷積計算層/ CONV layer
- ReLU激勵層 / ReLU layer
- 池化層 / Pooling layer
- 全連接層 / FC layer
- 損失層
數據輸入層
該層要做的處理主要是對原始圖像數據進行預處理,其中包括:
• 去均值:把輸入數據各個維度都中心化為0,如下圖所示,其目的就是把樣本的中心拉回到坐標系原點上。
• 歸一化:幅度歸一化到同樣的范圍,如下所示,即減少各維度數據取值范圍的差異而帶來的干擾,比如,我們有兩個維度的特征A和B,A范圍是0到10,而B范圍是0到10000,如果直接使用這兩個特征是有問題的,好的做法就是歸一化,即A和B的數據都變為0到1的范圍。
• PCA/白化:用PCA降維;白化是對數據各個特征軸上的幅度歸一化
卷積計算層
這個過程我們可以理解為我們使用一個過濾器(卷積核)來過濾圖像的各個小區域,從而得到這些小區域的特征值。
在實際訓練過程中,卷積核的值是在學習過程中學到的。
在具體應用中,往往有多個卷積核,可以認為,每個卷積核代表了一種圖像模式,如果某個圖像塊與此卷積核卷積出的值大,則認為此圖像塊十分接近於此卷積核。
參數減少與權值共享,降低參數量級
如果我們使用傳統神經網絡方式,對一張圖片進行分類,那么,我們把圖片的每個像素都連接到隱藏層節點上,那么對於一張1000x1000像素的圖片,如果我們有1M隱藏層單元,那么一共有10^12個參數,這顯然是不能接受的。(如下圖所示)
但是我們在CNN里,可以大大減少參數個數,我們基於以下兩個假設:
1)最底層特征都是局部性的,也就是說,我們用10x10這樣大小的過濾器就能表示邊緣等底層特征
2)圖像上不同小片段,以及不同圖像上的小片段的特征是類似的,也就是說,我們能用同樣的一組分類器來描述各種各樣不同的圖像
激勵層
把卷積層輸出結果做非線性映射。
CNN采用的激勵函數一般為ReLU(The Rectified Linear Unit/修正線性單元),它的特點是收斂快,求梯度簡單,但較脆弱。
激勵層的實踐經驗:
①不要用sigmoid!不要用sigmoid!不要用sigmoid!
② 首先試RELU,因為快,但要小心點
③ 如果2失效,請用Leaky ReLU或者Maxout
④ 某些情況下tanh倒是有不錯的結果,但是很少
池化層(Pooling)
池化聽起來很高深,其實簡單的說就是下采樣。池化的過程如下圖所示:
上圖中,我們可以看到,原始圖片是20x20的,我們對其進行下采樣,采樣窗口為10x10,最終將其下采樣成為一個2x2大小的特征圖。
之所以這么做的原因,是因為即使做完了卷積,圖像仍然很大(因為卷積核比較小),所以為了降低數據維度,就進行下采樣。
之所以能這么做,是因為即使減少了許多數據,特征的統計屬性仍能夠描述圖像,而且由於降低了數據維度,有效地避免了過擬合。
在實際應用中,池化根據下采樣的方法,分為最大值下采樣(Max-Pooling)與平均值下采樣(Mean-Pooling)。
這里就說一下Max pooling,其實思想非常簡單。
對於每個2*2的窗口選出最大的數作為輸出矩陣的相應元素的值,比如輸入矩陣第一個2*2窗口中最大的數是6,那么輸出矩陣的第一個元素就是6,如此類推。
全連接層
對池化層的輸出進行處理,輸出一個T*1的向量。這個向量也是損失層的輸入
損失層
有幾個重要的模型:softmax,softmax loss,cross entropy
輸入是T*1的向量,輸出也是T*1的向量(這個向量的每個值表示這個樣本屬於每個類的概率),只不過輸出的向量的每個值的大小范圍為0到1。
公式非常簡單,前面說過softmax的輸入是WX,假設模型的輸入樣本是I,討論一個3分類問題(類別用1,2,3表示),樣本I的真實類別是2,那么這個樣本I經過網絡所有層到達softmax層之前就得到了WX,也就是說WX是一個3*1的向量,那么上面公式中的aj就表示這個3*1的向量中的第j個值(最后會得到S1,S2,S3);而分母中的ak則表示3*1的向量中的3個值,所以會有個求和符號(這里求和是k從1到T,T和上面圖中的T是對應相等的,也就是類別數的意思,j的范圍也是1到T)。因為e^x恆大於0,所以分子永遠是正數,分母又是多個正數的和,所以分母也肯定是正數,因此Sj是正數,而且范圍是(0,1)。如果現在不是在訓練模型,而是在測試模型,那么當一個樣本經過softmax層並輸出一個T*1的向量時,就會取這個向量中值最大的那個數的index作為這個樣本的預測標簽。
2、softmax loss
首先L是損失。Sj是softmax的輸出向量S的第j個值,前面已經介紹過了,表示的是這個樣本屬於第j個類別的概率。yj前面有個求和符號,j的范圍也是1到類別數T,因此y是一個1*T的向量,里面的T個值,而且只有1個值是1,其他T-1個值都是0。那么哪個位置的值是1呢?答案是真實標簽對應的位置的那個值是1,其他都是0。所以這個公式其實有一個更簡單的形式:
當然此時要限定j是指向當前樣本的真實標簽。
來舉個例子吧。假設一個5分類問題,然后一個樣本I的標簽y=[0,0,0,1,0],也就是說樣本I的真實標簽是4,假設模型預測的結果概率(softmax的輸出)p=[0.1,0.15,0.05,0.6,0.1],可以看出這個預測是對的,那么對應的損失L=-log(0.6),也就是當這個樣本經過這樣的網絡參數產生這樣的預測p時,它的損失是-log(0.6)。那么假設p=[0.15,0.2,0.4,0.1,0.15],這個預測結果就很離譜了,因為真實標簽是4,而你覺得這個樣本是4的概率只有0.1(遠不如其他概率高,如果是在測試階段,那么模型就會預測該樣本屬於類別3),對應損失L=-log(0.1)。那么假設p=[0.05,0.15,0.4,0.3,0.1],這個預測結果雖然也錯了,但是沒有前面那個那么離譜,對應的損失L=-log(0.3)。我們知道log函數在輸入小於1的時候是個負數,而且log函數是遞增函數,所以-log(0.6) < -log(0.3) < -log(0.1)。簡單講就是你預測錯比預測對的損失要大,預測錯得離譜比預測錯得輕微的損失要大。
卷積神經網絡之訓練算法
1. 同一般機器學習算法,先定義Loss function,衡量和實際結果之間差距。
2. 找到最小化損失函數的W和b, CNN中用的算法是SGD(隨機梯度下降)。
卷積神經網絡之優缺點
優點
• 共享卷積核,對高維數據處理無壓力
• 無需手動選取特征,訓練好權重,即得特征分類效果好
缺點
• 需要調參,需要大樣本量,訓練最好要GPU
• 物理含義不明確(也就說,我們並不知道沒個卷積層到底提取到的是什么特征,而且神經網絡本身就是一種難以解釋的“黑箱模型”)
卷積神經網絡之典型CNN
- LeNet,這是最早用於數字識別的CNN
- AlexNet, 2012 ILSVRC比賽遠超第2名的CNN,比LeNet更深,用多層小卷積層疊加替換單大卷積層。
- ZF Net, 2013 ILSVRC比賽冠軍
- GoogLeNet, 2014 ILSVRC比賽冠軍
- VGGNet, 2014 ILSVRC比賽中的模型,圖像識別略差於GoogLeNet,但是在很多圖像轉化學習問題(比如object detection)上效果奇好
卷積神經網絡之 fine-tuning
何謂fine-tuning?
fine-tuning就是使用已用於其他目標、預訓練好模型的權重或者部分權重,作為初始值開始訓練。
那為什么我們不用隨機選取選幾個數作為權重初始值?原因很簡單,第一,自己從頭訓練卷積神經網絡容易出現問題;第二,fine-tuning能很快收斂到一個較理想的狀態,省時又省心。
那fine-tuning的具體做法是?
• 復用相同層的權重,新定義層取隨機權重初始值
• 調大新定義層的的學習率,調小復用層學習率
卷積神經網絡的常用框架
Caffe
• 源於Berkeley的主流CV工具包,支持C++,python,matlab
• Model Zoo中有大量預訓練好的模型供使用
Torch
• Facebook用的卷積神經網絡工具包
• 通過時域卷積的本地接口,使用非常直觀
• 定義新網絡層簡單
TensorFlow
• Google的深度學習框架
• TensorBoard可視化很方便
• 數據和模型並行化好,速度快
參考:
https://www.cnblogs.com/alexcai/p/5506806.html
https://blog.csdn.net/zouxy09/article/details/8781543
https://www.cnblogs.com/skyfsm/p/6790245.html
https://blog.csdn.net/u014380165/article/details/77284921