机器学习算法之——卷积神经网络(CNN)原理讲解
一、從神經網絡到卷積神經網絡
????????我們知道神經網絡的結構是這樣的:
那卷積神經網絡跟它是什么關系呢?
其實卷積神經網絡依舊是層級網絡,只是層的功能和形式做了變化,可以說是傳統神經網絡的一個改進。比如下圖中就多了許多傳統神經網絡沒有的層次。
1. 定義
簡而言之,卷積神經網絡(Convolutional Neural Networks)是一種深度學習模型或類似于人工神經網絡的多層感知器,常用來分析視覺圖像。卷積神經網絡的創始人是著名的計算機科學家Yann LeCun,目前在Facebook工作,他是第一個通過卷積神經網絡在MNIST數據集上解決手寫數字問題的人。
2. 卷積神經網絡的架構
如上圖所示,卷積神經網絡架構與常規人工神經網絡架構非常相似,特別是在網絡的最后一層,即全連接。此外,還注意到卷積神經網絡能夠接受多個特征圖作為輸入,而不是向量。
二、卷積網絡的層級結構
一個卷積神經網絡主要由以下5層組成:
- 數據輸入層/ Input layer
- 卷積計算層/ CONV layer
- ReLU激勵層 / ReLU layer
- 池化層 / Pooling layer
- 全連接層 / FC layer
1. 數據輸入層
該層要做的處理主要是對原始圖像數據進行預處理,其中包括:
- 去均值:把輸入數據各個維度都中心化為0,如下圖所示,其目的就是把樣本的中心拉回到坐標系原點上。
- 歸一化:幅度歸一化到同樣的范圍,如下所示,即減少各維度數據取值范圍的差異而帶來的干擾,比如,我們有兩個維度的特征A和B,A范圍是0到10,而B范圍是0到10000,如果直接使用這兩個特征是有問題的,好的做法就是歸一化,即A和B的數據都變為0到1的范圍。
- PCA/白化:用PCA降維;白化是對數據各個特征軸上的幅度歸一化
去均值與歸一化效果圖:
去相關與白化效果圖:
2. 卷積計算層
這一層就是卷積神經網絡最重要的一個層次,也是“卷積神經網絡”的名字來源。
在這個卷積層,有兩個關鍵操作:
- 局部關聯。每個神經元看做一個濾波器(filter)
- 窗口(receptive field)滑動, filter對局部數據計算
先介紹卷積層遇到的幾個名詞:
- 深度/depth(解釋見下圖)
- 步幅/stride?(窗口一次滑動的長度)
- 填充值/zero-padding
要改變每一層的行為,有兩個主要參數是我們可以調整的。選擇了過濾器的尺寸以后,我們還需要選擇步幅(stride)和填充(padding)。
步幅控制著過濾器圍繞輸入內容進行卷積計算的方式。在第一部分我們舉的例子中,過濾器通過每次移動一個單元的方式對輸入內容進行卷積。過濾器移動的距離就是步幅。在那個例子中,步幅被默認設置為1。步幅的設置通常要確保輸出內容是一個整數而非分數。讓我們看一個例子。想象一個 7 x 7 的輸入圖像,一個 3 x 3 過濾器(簡單起見不考慮第三個維度),步幅為 1。這是一種慣常的情況。
?
?如果步幅增加到 2,輸出內容會怎么樣。
所以,正如你能想到的,感受野移動了兩個單元,輸出內容同樣也會減小。注意,如果試圖把我們的步幅設置成 3,那我們就會難以調節間距并確保感受野與輸入圖像匹配。正常情況下,程序員如果想讓接受域重疊得更少并且想要更小的空間維度(spatial dimensions)時,他們會增加步幅。
填充值是什么呢?
在此之前,想象一個場景:當你把 5 x 5 x 3 的過濾器用在 32 x 32 x 3 的輸入上時,會發生什么?輸出的大小會是 28 x 28 x 3。注意,這里空間維度減小了。如果我們繼續用卷積層,尺寸減小的速度就會超過我們的期望。在網絡的早期層中,我們想要盡可能多地保留原始輸入內容的信息,這樣我們就能提取出那些低層的特征。比如說我們想要應用同樣的卷積層,但又想讓輸出量維持為 32 x 32 x 3 。為做到這點,我們可以對這個層應用大小為 2 的零填充(zero padding)。零填充在輸入內容的邊界周圍補充零。如果我們用兩個零填充,就會得到一個 36 x 36 x 3 的輸入卷。
如果我們在輸入內容的周圍應用兩次零填充,那么輸入量就為 32×32×3。然后,當我們應用帶有 3 個 5×5×3 的過濾器,以 1 的步幅進行處理時,我們也可以得到一個 32×32×3 的輸出
如果你的步幅為 1,而且把零填充設置為
?K 是過濾器尺寸,那么輸入和輸出內容就總能保持一致的空間維度。
計算任意給定卷積層的輸出的大小的公式是
?
?其中 O 是輸出尺寸,K 是過濾器尺寸,P 是填充,S 是步幅。
2.1 卷積的計算
注意,下面藍色矩陣周圍有一圈灰色的框,那些就是上面所說到的填充值)
?這里的藍色矩陣就是輸入的圖像,粉色矩陣就是卷積層的神經元,這里表示了有兩個神經元(w0,w1)。綠色矩陣就是經過卷積運算后的輸出矩陣,這里的步長設置為2。
?藍色的矩陣(輸入圖像)對粉色的矩陣(filter)進行矩陣內積計算并將三個內積運算的結果與偏置值b相加(比如上面圖的計算:2+(-2+1-2)+(1-2-2) + 1= 2 - 3 - 3 + 1 = -3),計算后的值就是綠框矩陣的一個元素。
?下面的圖形象地展示了卷積層的計算過程:
?2.2 參數共享機制
在卷積層中每個神經元連接數據窗的權重是固定的,每個神經元只關注一個特性。神經元就是圖像處理中的濾波器,比如邊緣檢測專用的Sobel濾波器,即卷積層的每個濾波器都會有自己所關注一個圖像特征,比如垂直邊緣,水平邊緣,顏色,紋理等等,這些所有神經元加起來就好比就是整張圖像的特征提取器集合。
需要估算的權重個數減少: AlexNet 1億 => 3.5w
一組固定的權重和不同窗口內數據做內積: 卷積
3. 非線性層(或激活層)
把卷積層輸出結果做非線性映射。
?CNN采用的激活函數一般為ReLU(The Rectified Linear Unit/修正線性單元),它的特點是收斂快,求梯度簡單,但較脆弱,圖像如下:
?
激勵層的實踐經驗:
①不要用sigmoid!不要用sigmoid!不要用sigmoid!
② 首先試RELU,因為快,但要小心點
③ 如果2失效,請用Leaky ReLU或者Maxout
④ 某些情況下tanh倒是有不錯的結果,但是很少
4.池化層
池化層夾在連續的卷積層中間, 用于壓縮數據和參數的量,減小過擬合。
簡而言之,如果輸入是圖像的話,那么池化層的最主要作用就是壓縮圖像。
這里再展開敘述池化層的具體作用:
?
池化層用的方法有Max pooling 和 average pooling,而實際用的較多的是Max pooling。這里就說一下Max pooling,其實思想非常簡單。
?對于每個2 * 2的窗口選出最大的數作為輸出矩陣的相應元素的值,比如輸入矩陣第一個2 * 2窗口中最大的數是6,那么輸出矩陣的第一個元素就是6,如此類推。對于每個2 * 2的窗口選出最大的數作為輸出矩陣的相應元素的值,比如輸入矩陣第一個2 * 2窗口中最大的數是6,那么輸出矩陣的第一個元素就是6,如此類推。
5.全連接層
兩層之間所有神經元都有權重連接,通常全連接層在卷積神經網絡尾部。也就是跟傳統的神經網絡神經元的連接方式是一樣的:
?一般CNN結構依次為
1. INPUT
2. [[CONV -> RELU]N -> POOL?]M
3. [FC -> RELU]*K
4. FC
三、卷積神經網絡的幾點說明
1. 訓練算法
1.同一般機器學習算法,先定義Loss function,衡量和實際結果之間差距。
2.找到最小化損失函數的W和b, CNN中用的算法是SGD(隨機梯度下降)。
2.優缺點
(1)優點
?共享卷積核,對高維數據處理無壓力
?無需手動選取特征,訓練好權重,即得特征分類效果好
(2)缺點
?需要調參,需要大樣本量,訓練最好要GPU
?物理含義不明確(也就說,我們并不知道沒個卷積層到底提取到的是什么特征,而且神經網絡本身就是一種難以解釋的“黑箱模型”)
3. 典型CNN
- LeNet,這是最早用于數字識別的CNN
- AlexNet, 2012 ILSVRC比賽遠超第2名的CNN,比
- LeNet更深,用多層小卷積層疊加替換單大卷積層。
- ZF Net, 2013 ILSVRC比賽冠軍
- GoogLeNet, 2014 ILSVRC比賽冠軍
- VGGNet, 2014 ILSVRC比賽中的模型,圖像識別略差于GoogLeNet,但是在很多圖像轉化學習問題(比如object detection)上效果奇好
4. fine-tuning
何謂fine-tuning?
fine-tuning就是使用已用于其他目標、預訓練好模型的權重或者部分權重,作為初始值開始訓練。
那為什么我們不用隨機選取選幾個數作為權重初始值?原因很簡單,第一,自己從頭訓練卷積神經網絡容易出現問題;第二,fine-tuning能很快收斂到一個較理想的狀態,省時又省心。
那fine-tuning的具體做法是?
?復用相同層的權重,新定義層取隨機權重初始值
?調大新定義層的的學習率,調小復用層學習率
5. 常用框架
Caffe
?源于Berkeley的主流CV工具包,支持C++,python,matlab
?Model Zoo中有大量預訓練好的模型供使用
PyTorch
?Facebook用的卷積神經網絡工具包
?通過時域卷積的本地接口,使用非常直觀
?定義新網絡層簡單
TensorFlow
?Google的深度學習框架
?TensorBoard可視化很方便
?數據和模型并行化好,速度快
四、總結
卷積網絡在本質上是一種輸入到輸出的映射,它能夠學習大量的輸入與輸出之間的映射關系,而不需要任何輸入和輸出之間的精確的數學表達式,只要用已知的模式對卷積網絡加以訓練,網絡就具有輸入輸出對之間的映射能力。
CNN一個非常重要的特點就是頭重腳輕(越往輸入權值越小,越往輸出權值越多),呈現出一個倒三角的形態,這就很好地避免了BP神經網絡中反向傳播的時候梯度損失得太快。
卷積神經網絡CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由于CNN的特征檢測層通過訓練數據進行學習,所以在使用CNN時,避免了顯式的特征抽取,而隱式地從訓練數據中進行學習;再者由于同一特征映射面上的神經元權值相同,所以網絡可以并行學習,這也是卷積網絡相對于神經元彼此相連網絡的一大優勢。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有著獨特的優越性,其布局更接近于實際的生物神經網絡,權值共享降低了網絡的復雜性,特別是多維輸入向量的圖像可以直接輸入網絡這一特點避免了特征提取和分類過程中數據重建的復雜度。
CNN應用案例:
[1]?表情識別FER | 基于深度學習的人臉表情識別系統(Keras)
[2]?表情識別FER | 基于CNN分類的表情識別研究
[3]?機器學習 | 卷積神經網絡詳解(二)——自己手寫一個卷積神經網絡
總結
以上是生活随笔為你收集整理的机器学习算法之——卷积神经网络(CNN)原理讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中virtual关键字的用法
- 下一篇: FlowNet到FlowNet2.0:基