paper 162:卷積神經網絡(CNN)解析

卷積神經網絡(CNN)解析:

  • 卷積神經網絡CNN解析
  • 概攬
  • Layers used to build ConvNets
    • 卷積層Convolutional layer
    • 池化層Pooling Layer
    • 全鏈接層Fully-connected layer
  • 卷積神經網絡架構
    • Layer Patterns
    • Layer Sizing Patterns
    • Case Studies
  • 參考

 


卷積神經網絡(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

這裏寫圖片描述 傳統神經網絡算法

這裏寫圖片描述 卷積神經網絡數組

一個卷積神經網絡由不少層組成,它們的輸入是三維的,輸出也是三維的,有的層有參數,有的層不須要參數。網絡


Layers used to build ConvNets

卷積神經網絡一般包含如下幾種層:架構

  • 卷積層(Convolutional layer),卷積神經網路中每層卷積層由若干卷積單元組成,每一個卷積單元的參數都是經過反向傳播算法優化獲得的。卷積運算的目的是提取輸入的不一樣特徵,第一層卷積層可能只能提取一些低級的特徵如邊緣、線條和角等層級,更多層的網絡能從低級特徵中迭代提取更復雜的特徵。
  • 線性整流層(Rectified Linear Units layer, ReLU layer),這一層神經的活性化函數(Activation function)使用線性整流(Rectified Linear Units, ReLU)f(x)=max(0,x
  • 池化層(Pooling layer),一般在卷積層以後會獲得維度很大的特徵,將特徵切成幾個區域,取其最大值或平均值,獲得新的、維度較小的特徵。
  • 全鏈接層( Fully-Connected layer), 把全部局部特徵結合變成全局特徵,用來計算最後每一類的得分。

一個卷積神經網絡各層應用實例應用app


卷積層(Convolutional layer)

局部感知(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, stridezero-padding

  • 深度(depth) : 顧名思義,它控制輸出單元的深度,也就是filter的個數,鏈接同一塊區域的神經元個數。又名:depth column
  • 步幅(stride):它控制在同一深度的相鄰兩個隱含單元,與他們相鏈接的輸入區域的距離。若是步幅很小(好比 stride = 1)的話,相鄰隱含單元的輸入區域的重疊部分會不少; 步幅很大則重疊區域變少。
  • 補零(zero-padding) : 咱們能夠經過在輸入單元周圍補零來改變輸入單元總體大小,從而控制輸出單元的空間大小。

咱們先定義幾個符號:

  • W 
    : 輸入單元的大小(寬或高)
  • F 
    : 感覺野(receptive field)
  • S 
    : 步幅(stride)
  • P 
    : 補零(zero-padding)的數量
  • K 
    : 深度,輸出單元的深度

則能夠用如下公式計算一個維度(寬或高)內一個輸出單元裏能夠有幾個隱藏單元:

WF+2PS +

若是計算結果不是一個整數,則說明現有參數不能正好適合輸入,步幅(stride)設置的不合適,或者須要補零,證實略,下面用一個例子來講明一下。

 

這是一個一維的例子,左邊模型輸入單元有5個,即W=
,  邊界各補了一個零,即P=
,步幅是1, 即S=
,感覺野是3,由於每一個輸出隱藏單元鏈接3個輸入單元,即F=
,根據上面公式能夠計算出輸出隱藏單元的個數是:53+21 +1=
,與圖示吻合。右邊那個模型是把步幅變爲2,其他不變,能夠算出輸出大小爲:53+22 +1=
,也與圖示吻合。若把步幅改成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個參數,就記爲 Θ=[θ i3× 
吧。這種狀況下,卷積覈實際上有9個神經元,他們的輸出又組成一個3×3的矩陣,稱爲特徵圖。第一個神經元鏈接到圖像的第一個3×3的局部,第二個神經元則鏈接到第二個局部(注意,有重疊!就跟你的目光掃視時也是連續掃視同樣)。具體以下圖所示。

卷積

圖的上方是第一個神經元的輸出,下方是第二個神經元的輸出。每一個神經元的運算依舊是

f(x)=act(∑ i,θ (ni)(nji+b

 

須要注意的是,平時咱們在運算時,習慣使用 θ ii 
這種寫法,但事實上,咱們這裏使用的是 θ (ni)(nji 

如今咱們回憶一下離散卷積運算。假設有二維離散函數 f(x,y
, g(x,y
, 那麼它們的卷積定義爲

f(m,n)g(m,n)=∑ ∞ ∑ ∞ f(u,v)g(mu,nv

 

如今發現了吧!上面例子中的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)

  • 接收三維輸入 W H  
  • 須要給出4個參數(hyperparameters):
    • Number of filters K 
      ,
    • their spatial extent F 
      ,
    • the stride S 
      ,
    • the amount of zero padding P 
      .
  • 輸出一個三維單元 W H  
    ,其中:
    • W =W F+2PS +
    • H =H F+2PS +
    • =K 
          
  • 應用權值共享,每一個filter會產生FF 
    個權重,總共 (FF)K 
    個權重和 K 
    個偏置。
  • 在輸出單元,第d個深度切片的結果是由第d個filter 和輸入單元作卷積運算,而後再加上偏置而來。

池化層(Pooling Layer)

池化(pool)下采樣(downsamples),目的是爲了減小特徵圖。池化操做對每一個深度切片獨立,規模通常爲 2*2,相對於卷積層進行卷積運算,池化層進行的運算通常有如下幾種: * 最大池化(Max Pooling)。取4個點的最大值。這是最經常使用的池化方法。 * 均值池化(Mean Pooling)。取4個點的均值。 * 高斯池化。借鑑高斯模糊的方法。不經常使用。 * 可訓練池化。訓練函數 ff ,接受4個點爲輸入,出入1個點。不經常使用。

最多見的池化層是規模爲2*2, 步幅爲2,對輸入的每一個深度切片進行下采樣。每一個MAX操做對四個數進行,以下圖所示: 池化

池化操做將保存深度大小不變

若是池化層的輸入單元大小不是二的整數倍,通常採起邊緣補零(zero-padding)的方式補成2的倍數,而後再池化。


池化層總結(Summary)

  • 接收單元大小爲:W H  
  • 須要兩個參數(hyperparameters):
    • their spatial extent F 
      ,
    • the stride S 
      ,
  • 輸出大小:W H  
    ,其中:
    • W =W FS  
    • H =H FS +
    • = 
  • 不須要引入新權重

全鏈接層(Fully-connected layer)

全鏈接層和卷積層能夠相互轉換: * 對於任意一個卷積層,要把它變成全鏈接層只須要把權重變成一個巨大的矩陣,其中大部分都是0 除了一些特定區塊(由於局部感知),並且好多區塊的權值還相同(因爲權重共享)。 * 相反地,對於任何一個全鏈接層也能夠變爲卷積層。好比,一個K4096 
的全鏈接層,輸入層大小爲 77512 
,它能夠等效爲一個 F=7, P=0, S=1, K=4096 
的卷積層。換言之,咱們把 filter size 正好設置爲整個輸入層大小。


卷積神經網絡架構

Layer Patterns

常見的卷積神經網絡架構是這樣的:

INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
  • 1

堆疊幾個卷積和整流層,再加一個池化層,重複這個模式知道圖片已經被合併得比較小了,而後再用全鏈接層控制輸出。

上述表達式中 ? 意味着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.


Layer Sizing Patterns

  • Input layer : 應該是2的整數次冪。好比32,64, 128等。
  • Conv Layer : 使用小的過濾器(filter),F=3 or F=
    , 步幅 S=
    ,若是不能剛好擬合輸入層,還要邊緣補零。若是使用 F=3, P=
    ,那麼輸出大小將與輸入同樣。若是用更大的過濾器(好比7*7),通常只會在緊挨着原始輸入圖片的卷積層纔會看到。
  • Pool Layer : F=2, S=

Case Studies

大牛們構建的網絡

  • LeNet. The first successful applications of Convolutional Networks were developed by Yann LeCun in 1990’s. Of these, the best known is the LeNet architecture that was used to read zip codes, digits, etc.
  • AlexNet. The first work that popularized Convolutional Networks in Computer Vision was the AlexNet, developed by Alex Krizhevsky, Ilya Sutskever and Geoff Hinton. The AlexNet was submitted to the ImageNet ILSVRC challenge in 2012 and significantly outperformed the second runner-up (top 5 error of 16% compared to runner-up with 26% error). The Network had a similar architecture basic as LeNet, but was deeper, bigger, and featured Convolutional Layers stacked on top of each other (previously it was common to only have a single CONV layer immediately followed by a POOL layer).
  • ZF Net. The ILSVRC 2013 winner was a Convolutional Network from Matthew Zeiler and Rob Fergus. It became known as the ZFNet (short for Zeiler & Fergus Net). It was an improvement on AlexNet by tweaking the architecture hyperparameters, in particular by expanding the size of the middle convolutional layers.
  • GoogLeNet. The ILSVRC 2014 winner was a Convolutional Network from Szegedy et al. from Google. Its main contribution was the development of an Inception Module that dramatically reduced the number of parameters in the network (4M, compared to AlexNet with 60M). Additionally, this paper uses Average Pooling instead of Fully Connected layers at the top of the ConvNet, eliminating a large amount of parameters that do not seem to matter much.
  • VGGNet. The runner-up in ILSVRC 2014 was the network from Karen Simonyan and Andrew Zisserman that became known as the VGGNet. Its main contribution was in showing that the depth of the network is a critical component for good performance. Their final best network contains 16 CONV/FC layers and, appealingly, features an extremely homogeneous architecture that only performs 3x3 convolutions and 2x2 pooling from the beginning to the end. It was later found that despite its slightly weaker classification performance, the VGG ConvNet features outperform those of GoogLeNet in multiple transfer learning tasks. Hence, the VGG network is currently the most preferred choice in the community when extracting CNN features from images. In particular, their pretrained model is available for plug and play use in Caffe. A downside of the VGGNet is that it is more expensive to evaluate and uses a lot more memory and parameters (140M).
  • ResNet. Residual Network developed by Kaiming He et al. was the winner of ILSVRC 2015. It features an interesting architecture with special skip connections and features heavy use of batch normalization. The architecture is also missing fully connected layers at the end of the network. The reader is also referred to Kaiming’s presentation (video, slides), and some recent experiments that reproduce these networks in Torch.

參考

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

相關文章
相關標籤/搜索