卷積神經網絡(Convolutional Neural Network, CNN)是一種前饋神經網絡,它的人工神經元能夠響應一部分覆蓋範圍內的周圍單元,對於大型圖像處理有出色表現。php
卷積神經網絡(Convolutional Neural Networks / CNNs / ConvNets)與普通神經網絡很是類似,它們都由具備可學習的權重和偏置常量(biases)的神經元組成。每一個神經元都接收一些輸入,並作一些點積計算,輸出是每一個分類的分數,普通神經網絡裏的一些計算技巧到這裏依舊適用。html
因此哪裏不一樣呢?卷積神經網絡默認輸入是圖像,可讓咱們把特定的性質編碼入網絡結構,使是咱們的前饋函數更加有效率,並減小了大量參數。git
具備三維體積的神經元(3D volumes of neurons) 卷積神經網絡利用輸入是圖片的特色,把神經元設計成三個維度 : width, height, depth(注意這個depth不是神經網絡的深度,而是用來描述神經元的) 。好比輸入的圖片大小是 32 × 32 × 3 (rgb),那麼輸入神經元就也具備 32×32×3 的維度。下面是圖解:github
傳統神經網絡算法
卷積神經網絡數組
一個卷積神經網絡由不少層組成,它們的輸入是三維的,輸出也是三維的,有的層有參數,有的層不須要參數。網絡
卷積神經網絡一般包含如下幾種層:架構
一個卷積神經網絡各層應用實例: app
局部感知(Local Connectivity)ide
普通神經網絡把輸入層和隱含層進行「全鏈接(Full Connected)「的設計。從計算的角度來說,相對較小的圖像從整幅圖像中計算特徵是可行的。可是,若是是更大的圖像(如 96x96 的圖像),要經過這種全聯通網絡的這種方法來學習整幅圖像上的特徵,從計算角度而言,將變得很是耗時。你須要設計 10 的 4 次方(=10000)個輸入單元,假設你要學習 100 個特徵,那麼就有 10 的 6 次方個參數須要去學習。與 28x28 的小塊圖像相比較, 96x96 的圖像使用前向輸送或者後向傳導的計算方式,計算過程也會慢 10 的 2 次方(=100)倍。
卷積層解決這類問題的一種簡單方法是對隱含單元和輸入單元間的鏈接加以限制:每一個隱含單元僅僅只能鏈接輸入單元的一部分。例如,每一個隱含單元僅僅鏈接輸入圖像的一小片相鄰區域。(對於不一樣於圖像輸入的輸入形式,也會有一些特別的鏈接到單隱含層的輸入信號「鏈接區域」選擇方式。如音頻做爲一種信號輸入方式,一個隱含單元所須要鏈接的輸入單元的子集,可能僅僅是一段音頻輸入所對應的某個時間段上的信號。)
每一個隱含單元鏈接的輸入區域大小叫r神經元的感覺野(receptive field)。
因爲卷積層的神經元也是三維的,因此也具備深度。卷積層的參數包含一系列過濾器(filter),每一個過濾器訓練一個深度,有幾個過濾器輸出單元就具備多少深度。
具體以下圖所示,樣例輸入單元大小是32×32×3, 輸出單元的深度是5, 對於輸出單元不一樣深度的同一位置,與輸入圖片鏈接的區域是相同的,可是參數(過濾器)不一樣。
雖然每一個輸出單元只是鏈接輸入的一部分,可是值的計算方法是沒有變的,都是權重和輸入的點積,而後加上偏置,這點與普通神經網絡是同樣的,以下圖所示:
空間排列(Spatial arrangement)
一個輸出單元的大小有如下三個量控制:depth, stride 和 zero-padding。
咱們先定義幾個符號:
則能夠用如下公式計算一個維度(寬或高)內一個輸出單元裏能夠有幾個隱藏單元:
若是計算結果不是一個整數,則說明現有參數不能正好適合輸入,步幅(stride)設置的不合適,或者須要補零,證實略,下面用一個例子來講明一下。
這是一個一維的例子,左邊模型輸入單元有5個,即
, 邊界各補了一個零,即
,步幅是1, 即
,感覺野是3,由於每一個輸出隱藏單元鏈接3個輸入單元,即
,根據上面公式能夠計算出輸出隱藏單元的個數是:
,與圖示吻合。右邊那個模型是把步幅變爲2,其他不變,能夠算出輸出大小爲:
,也與圖示吻合。若把步幅改成3,則公式不能整除,說明步幅爲3不能剛好吻合輸入單元大小。
另外,網絡的權重在圖的右上角,計算方法和普通神經網路同樣。
參數共享(Parameter Sharing)
應用參數共享能夠大量減小參數數量,參數共享基於一個假設:若是圖像中的一點(x1, y1)包含的特徵很重要,那麼它應該和圖像中的另外一點(x2, y2)同樣重要。換種說法,咱們把同一深度的平面叫作深度切片(depth slice)((e.g. a volume of size [55x55x96] has 96 depth slices, each of size [55x55])),那麼同一個切片應該共享同一組權重和偏置。咱們仍然可使用梯度降低的方法來學習這些權值,只須要對原始算法作一些小的改動, 這裏共享權值的梯度是全部共享參數的梯度的總和。
咱們不由會問爲何要權重共享呢?一方面,重複單元可以對特徵進行識別,而不考慮它在可視域中的位置。另外一方面,權值共享使得咱們能更有效的進行特徵抽取,由於它極大的減小了須要學習的自由變量的個數。經過控制模型的規模,卷積網絡對視覺問題能夠具備很好的泛化能力。
卷積(Convolution)
若是應用參數共享的話,實際上每一層計算的操做就是輸入層和權重的卷積!這也就是卷積神經網絡名字的由來。
先拋開卷積這個概念無論。爲簡便起見,考慮一個大小爲5×5的圖像,和一個3×3的卷積核。這裏的卷積核共有9個參數,就記爲
吧。這種狀況下,卷積覈實際上有9個神經元,他們的輸出又組成一個3×3的矩陣,稱爲特徵圖。第一個神經元鏈接到圖像的第一個3×3的局部,第二個神經元則鏈接到第二個局部(注意,有重疊!就跟你的目光掃視時也是連續掃視同樣)。具體以下圖所示。
圖的上方是第一個神經元的輸出,下方是第二個神經元的輸出。每一個神經元的運算依舊是
須要注意的是,平時咱們在運算時,習慣使用
這種寫法,但事實上,咱們這裏使用的是
。
如今咱們回憶一下離散卷積運算。假設有二維離散函數
,
, 那麼它們的卷積定義爲
如今發現了吧!上面例子中的9個神經元均完成輸出後,實際上等價於圖像和卷積核的卷積操做!
Numpy examples
下面用numpy的代碼具體的說明一下上面的概念和公式等。
假設輸入存儲在一個numpy array X
裏,那麼: * 位於 (x, y) 的 depth column 是 X[x, y, :]
* 深度爲 d 的 depth slice 是 X[:, :, d]
假設X的大小是X.shape: (11,11,4)
,而且不用補零(P = 0),過濾器(感覺野)大小F = 5,步幅爲2(S= 2)。那麼輸出單元的空間大小應該爲 (11 - 5) / 2 + 1 = 4,即寬和高都爲4 。假設輸出存儲在 V
中,那麼它的計算方式應該爲:
V[0,0,0] = np.sum(X[:5,:5,:] * W0) + b0
V[1,0,0] = np.sum(X[2:7,:5,:] * W0) + b0
V[2,0,0] = np.sum(X[4:9,:5,:] * W0) + b0
V[3,0,0] = np.sum(X[6:11,:5,:] * W0) + b0
V[0,0,1] = np.sum(X[:5,:5,:] * W1) + b1
V[1,0,1] = np.sum(X[2:7,:5,:] * W1) + b1
V[2,0,1] = np.sum(X[4:9,:5,:] * W1) + b1
V[3,0,1] = np.sum(X[6:11,:5,:] * W1) + b1
V[0,1,1] = np.sum(X[:5,2:7,:] * W1) + b1
V[2,3,1] = np.sum(X[4:9,6:11,:] * W1) + b1
注意在numpy中 *
表示兩個數組對應元素相乘。
卷積層總結(Summary)
池化(pool)即下采樣(downsamples),目的是爲了減小特徵圖。池化操做對每一個深度切片獨立,規模通常爲 2*2,相對於卷積層進行卷積運算,池化層進行的運算通常有如下幾種: * 最大池化(Max Pooling)。取4個點的最大值。這是最經常使用的池化方法。 * 均值池化(Mean Pooling)。取4個點的均值。 * 高斯池化。借鑑高斯模糊的方法。不經常使用。 * 可訓練池化。訓練函數 ff ,接受4個點爲輸入,出入1個點。不經常使用。
最多見的池化層是規模爲2*2, 步幅爲2,對輸入的每一個深度切片進行下采樣。每一個MAX操做對四個數進行,以下圖所示:
池化操做將保存深度大小不變。
若是池化層的輸入單元大小不是二的整數倍,通常採起邊緣補零(zero-padding)的方式補成2的倍數,而後再池化。
池化層總結(Summary)
全鏈接層和卷積層能夠相互轉換: * 對於任意一個卷積層,要把它變成全鏈接層只須要把權重變成一個巨大的矩陣,其中大部分都是0 除了一些特定區塊(由於局部感知),並且好多區塊的權值還相同(因爲權重共享)。 * 相反地,對於任何一個全鏈接層也能夠變爲卷積層。好比,一個
的全鏈接層,輸入層大小爲
,它能夠等效爲一個
的卷積層。換言之,咱們把 filter size 正好設置爲整個輸入層大小。
常見的卷積神經網絡架構是這樣的:
INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
堆疊幾個卷積和整流層,再加一個池化層,重複這個模式知道圖片已經被合併得比較小了,而後再用全鏈接層控制輸出。
上述表達式中 ?
意味着0次或1次,一般狀況下:N >= 0 && N <= 3
, M >= 0
, K >= 0 && K < 3
。
好比你能夠組合出如下幾種模式: * INPUT -> FC
, 實現了一個線性分類器, 這裏 N = M = K = 0
* INPUT -> CONV -> RELU -> FC
* INPUT -> [CONV -> RELU -> POOL]*2 -> FC -> RELU -> FC
. Here we see that there is a single CONV
layer between every POOL
layer. * INPUT -> [CONV -> RELU -> CONV -> RELU -> POOL]*3 -> [FC -> RELU]*2 -> FC
Here we see two CONV layers stacked before every POOL layer. This is generally a good idea for larger and deeper networks, because multiple stacked CONV layers can develop more complex features of the input volume before the destructive pooling operation.
大牛們構建的網絡
CS231n: Convolutional Neural Networks for Visual Recognition 卷積神經網絡-維基百科 卷積特徵提取 卷積神經網絡全面解析
http://www.cnblogs.com/molakejin/p/8350160.html
http://blog.csdn.net/qq_25762497/article/details/51052861#詳解卷積神經網絡cnn