卷積神經網絡(Convolutional Neural Network)的結構類似於神經網絡,可以看做是對其的改進。它利用局部連接、權值共享、多核卷積、池化四個手段大大降低了參數的數目,使得網絡的層數可以變得更深,並且能夠合理的隱式的提取特征。CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由於其特征檢測層通過訓練數據進行學習,隱式地從訓練數據中進行學習,避免了顯式的特征抽取;再者由於同一特征映射面上的神經元權值相同,所以網絡可以並行學習,這也是卷積網絡相對於神經元彼此相連網絡的一大優勢。卷積神經網絡以其局部權值共享的特殊結構在語音識別和圖像處理方面有着獨特的優越性,其布局更接近於實際的生物神經網絡,權值共享降低了網絡的復雜性,特別是多維輸入向量的圖像可以直接輸入網絡這一特點避免了特征提取和分類過程中數據重建的復雜度它可以直接處理灰度圖片,能夠直接用於處理基於圖像的分類。
卷積神經網絡是一種帶有卷積結構的深度神經網絡,卷積結構可以減少深層網絡占用的內存量。卷積神經網絡的結構組成如下圖:
其中包含有:
- 輸入層、
- 卷積層(Convolutional Layer)、
- 激勵層(ReLU layer)
- 池化層(下采樣層Pooling Layer)、
- 全連接層(Fully Connected Network)
- 輸出層
卷積神經網絡層、池化層(下采樣層)、全連接被合稱為隱含層。在卷積神經網絡中,卷積神經層與池化層(下采樣層)的連接方式是局部連接的形式,即每層的神經元只連接輸入層中的跟它相近的幾個節點。而全連接層中采用的是全連接的方式,即每一個神經元與輸入層中的所有節點連接。
1、輸入層
如果采用經典的神經網絡模型,則需要讀取整幅圖像作為神經網絡模型的輸入(即全連接的方式),當圖像的尺寸越大時,其連接的參數將變得很多,從而導致計算量非常大。而我們人類對外界的認知一般是從局部到全局,先對局部有感知的認識,再逐步對全體有認知,這是人類的認識模式。在圖像中的空間聯系也是類似,局部范圍內的像素之間聯系較為緊密,而距離較遠的像素則相關性較弱。因而,每個神經元其實沒有必要對全局圖像進行感知,只需要對局部進行感知,然后在更高層將局部的信息綜合起來就得到了全局的信息。這種模式就是卷積神經網絡中降低參數數目的重要神器:局部感受野。
假如:CNN輸入層主要是n×m×3 RGB圖像,這不同於人工神經網絡,人工神經網絡的輸入是n×1維的矢量。
該層要做的處理主要是對原始圖像數據進行預處理,其中包括:
- 去均值:把輸入數據各個維度都中心化為0,如下圖所示,其目的就是把樣本的中心拉回到坐標系原點上。
- 歸一化:幅度歸一化到同樣的范圍,如下所示,即減少各維度數據取值范圍的差異而帶來的干擾,比如,我們有兩個維度的特征A和B,A范圍是0到10,而B范圍是0到10000,如果直接使用這兩個特征是有問題的,好的做法就是歸一化,即A和B的數據都變為0到1的范圍。
- PCA/白化:用PCA降維;白化是對數據各個特征軸上的幅度歸一化
去均值與歸一化效果圖:
中心化與標准化:在數據挖掘數據處理過程中,不同評價指標往往具有不同的量綱和量綱單位,這樣的情況會影響到數據分析的結果,為了消除指標之間的量綱影響,需要進行數據標准化處理,以解決數據指標之間的可比性。原始數據經過數據標准化處理后,各指標處於同一數量級,適合進行綜合對比評價。
- 中心化(又叫零均值化):是指變量減去它的均值。其實就是一個平移的過程,平移后所有數據的中心是(0,0)。
- 標准化(又叫歸一化): 是指數值減去均值,再除以標准差。
去相關與白化效果圖:
- PCA是指通過拋棄攜帶信息量較少的維度,保留主要的特征信息來對數據進行降維處理,思路上是使用少數幾個有代表性、互不相關的特征來代替原先的大量的、存在一定相關性的特征,從而加速機器學習進程。 PCA可用於特征提取,數據壓縮,去噪聲,降維等操作。
- 白化的目的是去掉數據之間的相關聯度和令方差均一化,由於圖像中相鄰像素之間具有很強的相關性,所以用於訓練時很多輸入是冗余的。這時候去相關的操作就可以采用白化操作,從而使得:
- 減少特征之間的相關性
- 特征具有相同的方差(協方差陣為1)
2、卷積層
卷積神經網絡里面的這個卷積和信號里面的卷積是有些差別的,信號中的卷積計算分為鏡像相乘相加,卷積層中的卷積沒有鏡像這一操作,直接是相乘和相加,如下圖所示:
最左邊的是卷積的輸入,中間的為卷積核,最右邊的為卷積的輸出。可以發現卷積計算很簡單,就是卷積核與輸入對應位置相乘然后求和。除了圖中綠顏色的例子,我們可以計算一下圖中紅色圈對應的卷積結果:(-1)*2+(-1)*9+(-1)*2+1*4+1*4=-5。
如上所述,輸入內容為一個 5 X 5 的像素值數組。現在,解釋卷積層的最佳方法是想象有一束手電筒光正從圖像的左上角照過,假設手電筒光可以覆蓋 3 x 3 的區域,想象一下手電筒光照過輸入圖像的所有區域。
- 在機器學習術語中,這束手電筒被叫做過濾器(filter,有時候也被稱為 神經元(neuron)或 核(kernel)),被照過的區域被稱為 感受野(receptive field)。
- 過濾器同樣也是一個數組(其中的數字被稱作權重或參數)。重點在於過濾器的深度必須與輸入內容的深度相同(這樣才能確保可以進行數學運算)。
- 現在,以過濾器所處在的第一個位置為例,即圖像的左上角。當篩選值在圖像上滑動(卷積運算)時,過濾器中的值會與圖像中的原始像素值相乘(又稱為計算點積)。現在你得到了一個數字。切記,該數字只是表示過濾器位於圖片左上角的情況。我們在輸入內容上的每一位置重復該過程。(下一步將是將過濾器右移 1 單元,接着再右移 1 單元,以此類推。)輸入內容上的每一特定位置都會產生一個數字。
- 過濾器滑過所有位置后將得到一個 3 x 3 x 1 的數組,我們稱之為激活映射(activation map)或特征映射(feature map)。
卷積計算的過程,對於整個輸入來說,計算結果還取決於兩個參數:padding 和 stride
2.1、Padding填白:它是很多地方都會用到的一種操作比如在加密過程中明文不夠長就需要加padding來使得明文與密鑰長度相同,其意思就是在原有的基礎之上增加一些東西是其規模符合后續操作。
- 以下圖為例子,比如有這么一個5*5的圖片(一個格子一個像素),我們滑動窗口取2*2,步長取2,那么我們發現還剩下1個像素沒法滑完,那怎么辦呢?
- 那我們在原先的矩陣加了一層填充值,使得變成6*6的矩陣,那么窗口就可以剛好把所有像素遍歷完。這就是填充值的作用。
- 在Tensorflow中padding有兩種屬性
- 一種是valid,這種表示不需要padding操作,假設輸入大小為n*n,卷積核大小為f*f,此時輸出大小為(n-f+1);
- 另一種是same,表示輸入和輸出的大小相同,假設padding的大小為p,此時為了保持輸出和輸入消息相同p = (f-1)/2,但是此時卷積核要是奇數大小。
2.2、Stride步長:指卷積核在輸入上移動時每次移動的距離。如下圖:其中按紅框來移動的話stride = 1;按藍色框來移動的話stride = 2。
下面兩行代碼是Tensorflow進行卷積計算的代碼:
- tf.nn.conv2d(x, W, stride=[1, 1, 1, 1], padding='SAME')
- tf.nn.conv2d(x, W, stride=[1, 2, 2, 1], padding='VALID')
其中:
- x為輸入,
- W為權重,
- stride的原型為strides =[b, h, w, c],其中:
- b表示在樣本上的步長,默認為1表示每個樣本都會進行計算;
- h,w表示高度和寬度,即橫向和縱向步長?
- c表示通道數,默認為1,表示每個通道都會參與計算。
2.3 對多通道(channels)圖片的卷積
卷積核除了長寬這兩個參數之外還有通道數這個參數,首先需要明確的是單個卷積核的通道數要等於圖像的通道數,彩色圖像,一般都是RGB三個通道(channel)的,因此輸入數據的維度一般有三個:(長,寬,通道)。比如一個28×28的RGB圖片,維度就是(28,28,3)。對於多個卷積核的情況也不復雜,直接對每個卷積核進行單個卷積核的操作,然后把它們拼在一起就行了。如下圖:
- 我們的輸入圖片就是X,shape=(8,8,3);
- 4個filters其實就是第一層神經網絡的參數W1,,shape=(3,3,3,4),這個4是指有4個filters;
- 輸出,就是Z1,shape=(6,6,4);
3、激勵層
前面的圖中,再加一個激活函數,給對應的部分標上符號,就是這樣的:
激勵層的主要作用是將卷積層的結果做非線性映射。常見的激勵層函數有sigmoid、tanh、Relu、Leaky Relu、ELU、Maxout。如下圖:
- sigmoid函數是早期用的比較多的激勵函數,但現在已經不常用了。主要是當輸入特別大或者特別小時,sigmoid函數的偏導數趨於0,這樣在使用反向傳播算法時將會出現問題,並且sigmoid函數不是關於原點對稱的,這樣在進行反向傳播時w的梯度要么全為正,要么全負(w的梯度即為x乘以上一層的梯度,x恆為正,所以梯度的正負一直不變),收斂速度會非常慢。
- tanh函數與sigmoid函數圖像類似,但是它比sigmoid函數好的一點是tanh函數是關於原點對稱的,這樣可以減少數據的傾斜。
- 現在比較常用的激勵函數為ReLu(The Rectified Linear Unit/修正線性單元),函數表達式為:f(x)=max(0,x)。ReLu函數的優點是收斂非常快,因為在原點右側它的偏導數為1,求導簡單,這樣在做反向傳播時速度比較快。缺點時較為脆弱,原點左側的函數具有的sigmoid相似的問題,即導數等於0。
- Leaky ReLu在是ReLu的“增強版”,其函數表達式為:f(x)=max(ax,x),a通常為一個比較小的數,比如0.01,上圖是a=0.01時的圖像,可以看到,相比ReLu,Leaky ReLu在原點左側的表達式中對x乘以了一個比較小的系數,這樣保證了在做反向傳播時不會掛掉,並且其計算也很快。
- ELU指數線性單元:ELU不會掛掉,計算速度比較快,並且輸出的均值趨於0,但是由於指數的存在,計算量略大。
- Maxout:兩條直線拼接而成,計算是線性的,比較快,不會飽和不會掛,但是參數比較多。
激勵函數使用總結:
- 盡量不要用sigmoid函數
- 首選ReLu,速度快,但是需要小心,有可能會掛掉
- ReLu不行的話再選用Leaky ReLu或者Maxout
4、池化層
池化層(pooling)的作用主要是降低維度,通過對卷積后的結果進行降采樣來降低維度,分為最大池化和平均池化兩類。
4.1、最大池化
最大池化顧名思義,降采樣的時候采用最大值的方式采樣,如圖所示,其中池化核的大小為2*2,步長也為2*2
4.2、平均池化
平均池化就是用局部的平均值作為采樣的值,還是上面的數據,平均池化后的結果為:
示例代碼:
- tf.nn.max_pool(x, ksize=[2, 2, 2, 1], stride=[2, 2, 2, 1], padding='SAME')
- tf.nn.avg_pool(x, ksize=[2, 2, 2, 1], stride=[2, 2, 2, 1], padding='SAME')
小結:
- 通常,使用的比較多的是Maxpooling,而且一般取大小為(2,2)步長為2的filter,這樣,經過pooling之后,輸入的長寬都會縮小2倍,channels不變。
5、全連接層
在卷積神經網絡網絡中,至少是有一個全連接層。全連接層位於所有的卷積層之后,層與層之間的神經元采用全連接的方式進行連接。全連接層的主要作用是對卷積層提取出來的特征進一步提取出高層次的特征。它通過將卷積層的特征進行合並或者取樣,提取出其中的具有區分性的特征,從而達到分類的目的。全連接層與卷積層的區別第一個是連接方式的不同:
- 卷積層中采用的是局部連接方式,即一個節點和上一層中的部分節點相連
- 而全連接層中,該層的每一個神經元與上一層的所有神經進行連接,如下圖
- 連接層中權值是不共享的,每一條線都代表了一個權值。而在左邊卷積層的連接方式圖中,顏色相同的連接,參數相同。我們可以看出相對於卷積層,全連接層的參數更多,所以其網絡的復雜度也更大。
- 在全連接層中,常用softmax 邏輯回歸來進行分類識別圖像。softmax 邏輯回歸分類方法主要用於多分類問題。在構建分類器的過程中,一般還采用正則化方法來防止訓練過擬合,提高分類的性能
鏈全連接層在整個卷積神經網絡中起到“分類器”的作用,即通過卷積、激活函數、池化等深度網絡后,再經過全連接層對結果進行識別分類。首先將經過卷積、激活函數、池化的深度網絡后的結果串起來,如下圖所示:
接下來,隨便看一個CNN的模樣,來獲取對CNN的一些感性認識:
-
結構可以用:X-->CONV(relu)-->MAXPOOL-->CONV(relu)-->FC(relu)-->FC(softmax)-->Y 來表示。
- 在經過數次卷積和池化之后,我們 最后會先將多維的數據進行“扁平化”,也就是把 (height,width,channel)的數據壓縮成長度為 height × width × channel 的一維數組,然后再與 FC層連接,這之后就跟普通的神經網絡無異了。
6、小結
6.1、參數共享機制(parameters sharing)
假設圖像是8×8大小,也就是64個像素,假設我們用一個有9個單元的全連接層,那這一層我們需要多少個參數呢?需要 64×9 = 576個參數(先不考慮偏置項b)。因為每一個鏈接都需要一個權重w。那我們看看 同樣有9個單元的filter是怎么樣的:
不用看就知道,有幾個單元就幾個參數,所以總共就9個參數!因為,對於不同的區域,我們都共享同一個filter,因此就共享這同一組參數。這也是有道理的,filter是用來檢測特征的,那一個特征一般情況下很可能在不止一個地方出現,比如“豎直邊界”,就可能在一幅圖中多出出現,那么 我們共享同一個filter不僅是合理的,而且是應該這么做的。
由此可見,參數共享機制,讓我們的網絡的參數數量大大地減少。這樣,我們可以用較少的參數,訓練出更加好的模型,典型的事半功倍,而且可以有效地 避免過擬合。同樣,由於filter的參數共享,即使圖片進行了一定的平移操作,我們照樣可以識別出特征,這叫做 “平移不變性”。因此,模型就更加穩健了。
6.2、問題二:卷積核的大小以及卷積核之中的參數是怎么得來的么
大小的話,常見的是3x3,但為什么是3x3,並沒有理論依據,通過大量的實踐測試得來的,這個大小最好用。還有一個特殊的是1x1的,一般做降維或者線性變換的時候用。 常見的卷積核如下圖:
6.3、BP網絡
卷積神經網絡 (CNN)訓練的過程是:信號由輸入層輸入,經隱含層 ( 至少一層 ) , 最后由輸出層輸出。 為了使得輸出的結果與期望值間的誤差最小,我們需要對每層的權重參數進行調整,調成的過程是: 利用輸出值與期望值之間的誤差, 由輸出層經隱含層到輸入層, 進行每層的誤差計算, 這個過程其實就是反向傳播網絡 BP(Back Propagation)的計算過程。
BP(Back Propagation)網絡是 1986 年由 Rumelhart 和McCelland 為首的科學家小組提出,是一種按誤差逆傳播算法訓練的多層前饋網絡, 是目前應用最廣泛的神經網絡模型之一。 BP學習網絡能學習和存儲大量的輸入 - 輸出模式映射關系,而事前無需揭示這種映射關系的數學方程。 它的學習規則是使用梯度下降法, 通過反向傳播不斷調整網絡的權重和閾值, 使網絡的誤差平方和最小。詳細推導過程,參見:https://wenku.baidu.com/view/01f86babf9c75fbfc77da26925c52cc58ad69078.html
6.4、如何利用CNN實現圖像識別的任務
- 輸入層讀入經過規則化(統一大小)的圖像,每一層的每個神經元將前一層的一組小的局部近鄰的單元作為輸入,也就是局部感受野和權值共享,神經元抽取一些基本的視覺特征,比如邊緣、角點等,這些特征之后會被更高層的神經元所使用。
- 卷積神經網絡通過卷積操作獲得特征圖,每個位置,來自不同特征圖的單元得到各自不同類型的特征。一個卷積層中通常包含多個具有不同權值向量的特征圖,使得能夠保留圖像更豐富的特征。
- 卷積層后邊會連接池化層進行降采樣操作,一方面可以降低圖像的分辨率,減少參數量,另一方面可以獲得平移和形變的魯棒性。
- 卷積層和池化層的交替分布,使得特征圖的數目逐步增多,而且分辨率逐漸降低,是一個雙金字塔結構。
6.5、CNN的特征
- 具有一些傳統技術所沒有的優點:良好的容錯能力、並行處理能力和自學習能力。可處理環境信息復雜,背景知識不清楚,推理規則不明確情況下的問題,允許樣品有較大的缺損、畸變,運行速度快,自適應性能好,具有較高的分辨率。它是通過結構重組和減少權值將特征抽取功能融合進多層感知器,省略識別前復雜的圖像特征抽取過程。
- 泛化能力要顯著優於其它方法,卷積神經網絡已被應用於模式分類,物體檢測和物體識別等方面。利用卷積神經網絡建立模式分類器,將卷積神經網絡作為通用的模式分類器,直接用於灰度圖像。
- 是一個前潰式神經網絡,能從一個二維圖像中提取其拓撲結構,采用反向傳播算法來優化網絡結構,求解網絡中的未知參數。
- CNN被認為是第一個真正成功的采用多層層次結構網絡的具有魯棒性的深度學習方法。CNN通過挖掘數據中的空間上的相關性,來減少網絡中的可訓練參數的數量,達到改進前向傳播網絡的反向傳播算法效率,因為CNN需要非常少的數據預處理工作,所以也被認為是一種深度學習的方法。在CNN中,圖像中的小塊區域(也叫做“局部感知區域”)被當做層次結構中的底層的輸入數據,信息通過前向傳播經過網絡中的各個層,在每一層中都由過濾器構成,以便能夠獲得觀測數據的一些顯著特征。因為局部感知區域能夠獲得一些基礎的特征,比如圖像中的邊界和角落等,這種方法能夠提供一定程度對位移、拉伸和旋轉的相對不變性。
- CNN中層次之間的緊密聯系和空間信息使得其特別適用於圖像的處理和理解,並且能夠自動的從圖像抽取出豐富的相關特性。
- CNN通過結合局部感知區域、共享權重、空間或者時間上的降采樣來充分利用數據本身包含的局部性等特征,優化網絡結構,並且保證一定程度上的位移和變形的不變性。
- CNN是一種深度的監督學習下的機器學習模型,具有極強的適應性,善於挖掘數據局部特征,提取全局訓練特征和分類,它的權值共享結構網絡使之更類似於生物神經網絡,在模式識別各個領域都取得了很好的成果。
- CNN可以用來識別位移、縮放及其它形式扭曲不變性的二維或三維圖像。CNN的特征提取層參數是通過訓練數據學習得到的,所以其避免了人工特征提取,而是從訓練數據中進行學習;其次同一特征圖的神經元共享權值,減少了網絡參數,這也是卷積網絡相對於全連接網絡的一大優勢。共享局部權值這一特殊結構更接近於真實的生物神經網絡使CNN在圖像處理、語音識別領域有着獨特的優越性,另一方面權值共享同時降低了網絡的復雜性,且多維輸入信號(語音、圖像)可以直接輸入網絡的特點避免了特征提取和分類過程中數據重排的過程。
- CNN的分類模型與傳統模型的不同點在於其可以直接將一幅二維圖像輸入模型中,接着在輸出端即給出分類結果。其優勢在於不需復雜的預處理,將特征抽取,模式分類完全放入一個黑匣子中,通過不斷的優化來獲得網絡所需參數,在輸出層給出所需分類,網絡核心就是網絡的結構設計與網絡的求解。這種求解結構比以往多種算法性能更高。
- 隱層的參數個數和隱層的神經元個數無關,只和濾波器的大小和濾波器種類的多少有關。隱層的神經元個數,它和原圖像,也就是輸入的大小(神經元個數)、濾波器的大小和濾波器在圖像中的滑動步長都有關。
6.6 、卷積神經網絡之典型CNN
- LeNet,這是最早用於數字識別的CNN
- AlexNet, 2012 ILSVRC比賽遠超第2名的CNN,比LeNet更深,用多層小卷積層疊加替換單大卷積層。
- ZF Net, 2013 ILSVRC比賽冠軍
- GoogLeNet, 2014 ILSVRC比賽冠軍
- VGGNet, 2014 ILSVRC比賽中的模型,圖像識別略差於GoogLeNet,但是在很多圖像轉化學習問題(比如object detection)上效果奇好
參考資料
- https://blog.csdn.net/jiaoyangwm/article/details/80011656
- https://www.easemob.com/news/1966
- https://www.cnblogs.com/hesi/p/9013205.html
- https://www.cnblogs.com/luofeel/p/8654931.html
- https://blog.csdn.net/sinat_35821976/article/details/81503953
- https://blog.csdn.net/weiyongle1996/article/details/78088654
- https://blog.csdn.net/weixin_41923961/article/details/80113737
- https://blog.csdn.net/u013832707/article/details/53884811