1. 程式人生 > >機器學習_3.神經網路之CNN

機器學習_3.神經網路之CNN

卷積神經網路

卷積神經網路(Convoltional Neural Networks, CNN)是一類包含卷積或相關計算且具有深度結構的前饋神經網路(Feedforward Neural Networks),是深度學習(deep learning)的代表演算法之一  。由於卷積神經網路能夠進行平移不變分類(shift-invariant classification),因此在文獻中也被稱為“平移不變人工神經網路(Shift-Invariant Artificial Neural Networks, SIANN)” 。

卷積神經網路仿造生物的視知覺(visual perception)機制構建,可以進行監督學習和非監督學習,其隱含層內的卷積引數共享和層間連線的稀疏性使得卷積神經網路能夠以較小的計算量對格點化(grid-like topology)特徵,例如畫素和音訊進行學習、有穩定的效果且對資料沒有額外的特徵工程(feature engineering)要求  。

對卷積神經網路的研究始於二十世紀80至90年代,時間延遲網路和LeNet-5是最早被證實有效的卷積神經網路演算法  ;在二十一世紀後,隨著數值計算裝置的改進,卷積神經網路得到了快速發展,並被大量應用於計算機視覺、自然語言處理等領域  。

卷積神經網路(Convolutional Neural Networks / CNNs / ConvNets)與普通神經網路非常相似,它們都由具有可學習的權重和偏置常量(biases)的神經元組成。每個神經元都接收一些輸入,並做一些點積計算,輸出是每個分類的分數,普通神經網路裡的一些計算技巧到這裡依舊適用。

所以哪裡不同呢?卷積神經網路預設輸入是影象,可以讓我們把特定的性質編碼入網路結構,使是我們的前饋函式更加有效率,並減少了大量引數。

具有三維體積的神經元(3D volumes of neurons) 
卷積神經網路利用輸入是圖片的特點,把神經元設計成三個維度 : width, height, depth(注意這個depth不是神經網路的深度,而是用來描述神經元的) 。比如輸入的圖片大小是 32 × 32 × 3 (rgb),那麼輸入神經元就也具有 32×32×3 的維度。

這裡寫圖片描述

一個卷積神經網路由很多層組成,它們的輸入是三維的,輸出也是三維的,有的層有引數,有的層不需要引數。

CNN基本模組

輸入層

接收三維輸入 W1∗H1∗D1

卷積層

卷積神經網路中每層卷積層由若干卷積單元組成,每個卷積單元的引數都是通過反向傳播演算法優化得到的。卷積運算的目的是提取輸入的不同特徵,第一層卷積層可能只能提取一些低階的特徵如邊緣、線條和角等層級,更多層的網路能從低階特徵中迭代提取更復雜的特徵。

區域性感知:為解決處理更大的影象計算過程慢、需學習引數多的問題,對隱含單元和輸入單元間的連線加以限制:每個隱含單元僅僅只能連線輸入單元的一部分。每個隱含單元連線的輸入區域大小叫r神經元的感受野(receptive field)

空間排列:

一個輸出單元的大小有以下三個量控制:depth, stride 和 zero-padding。

深度(depth) : 顧名思義,它控制輸出單元的深度,也就是filter的個數,連線同一塊區域的神經元個數。又名:depth column
步幅(stride):它控制在同一深度的相鄰兩個隱含單元,與他們相連線的輸入區域的距離。如果步幅很小(比如 stride = 1)的話,相鄰隱含單元的輸入區域的重疊部分會很多; 步幅很大則重疊區域變少。
補零(zero-padding) : 我們可以通過在輸入單元周圍補零來改變輸入單元整體大小,從而控制輸出單元的空間大小。
我們先定義幾個符號:

W: 輸入單元的大小(寬或高)
F: 感受野(receptive field)
S: 步幅(stride)
P: 補零(zero-padding)的數量
K: 深度,輸出單元的深度
則可以用以下公式計算一個維度(寬或高)內一個輸出單元裡可以有幾個隱藏單元: 

引數共享:

應用引數共享可以大量減少引數數量,引數共享基於一個假設:如果影象中的一點(x1, y1)包含的特徵很重要,那麼它應該和影象中的另一點(x2, y2)一樣重要。換種說法,我們把同一深度的平面叫做深度切片(depth slice)((e.g. a volume of size [55x55x96] has 96 depth slices, each of size [55x55])),那麼同一個切片應該共享同一組權重和偏置。我們仍然可以使用梯度下降的方法來學習這些權值,只需要對原始演算法做一些小的改動, 這裡共享權值的梯度是所有共享引數的梯度的總和。一方面,重複單元能夠對特徵進行識別,而不考慮它在可視域中的位置。另一方面,權值共享使得我們能更有效的進行特徵抽取,因為它極大的減少了需要學習的自由變數的個數。通過控制模型的規模,卷積網路對視覺問題可以具有很好的泛化能力。

卷積:一個大小為5×5的影象,和一個3×3的卷積核。這裡的卷積核共有9個引數,就記為 Θ=[θij]3×3
 吧。這種情況下,卷積核實際上有9個神經元,他們的輸出又組成一個3×3的矩陣,稱為特徵圖。第一個神經元連線到影象的第一個3×3的區域性,第二個神經元則連線到第二個區域性。如圖:

卷積

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

離散卷積運算:假設有二維離散函式 f(x,y) , g(x,y) , 那麼它們的卷積定義為

上面例子中的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中 * 表示兩個陣列對應元素相乘。
--------------------- 
作者:liuhe_ 
來源:CSDN 
原文:https://blog.csdn.net/qq_25762497/article/details/51052861 

池化層

池化(pool)下采樣(downsamples),目的是為了減少特徵圖。通常在卷積層之後會得到維度很大的特徵,將特徵切成幾個區域,取其最大值或平均值,得到新的、維度較小的特徵。

池化操作對每個深度切片獨立,規模一般為 2*2,相對於卷積層進行卷積運算,池化層進行的運算一般有以下幾種: 
* 最大池化(Max Pooling)。取4個點的最大值。這是最常用的池化方法。 
* 均值池化(Mean Pooling)。取4個點的均值。 
* 高斯池化。借鑑高斯模糊的方法。不常用。 
* 可訓練池化。訓練函式 ff ,接受4個點為輸入,出入1個點。不常用。

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

池化操作將儲存深度大小不變

如果池化層的輸入單元大小不是二的整數倍,一般採取邊緣補零(zero-padding)的方式補成2的倍數,然後再池化

RELU層

全名將修正線性單元,是神經元的啟用函式,對輸入值x的作用是max(0,x),當然RELU只是一種選擇,還有選Leak-Relu等等,一般都是用Relu!

全連通層

常規的神經網路。對經過多次卷積層和多次池化層所得出來的高階特徵進行全連線(全連線就是常規神經網路的性質),算出最後的預測值。

輸出層

對結果的預測值,一般會加一個softmax層。

CNN特點

1.區域性感知

卷積核和影象卷積的時候,每次卷積核所覆蓋的畫素只是一小部分,是區域性特徵,所以說是區域性感知。CNN是一個從區域性到整體的過程(區域性到整體的實現是在全連通層),而傳統的神經網路是整體的過程。

圖形描述:

2.權重共享

傳統的神經網路的引數量是非常巨大的,CNN與傳統的神經網路相比,引數量小,計算量小。整個圖片共享一組濾波器的引數。

一方面,重複單元能夠對特徵進行識別,而不考慮它在可視域中的位置。另一方面,權值共享使得我們能更有效的進行特徵抽取,因為它極大的減少了需要學習的自由變數的個數。通過控制模型的規模,卷積網路對視覺問題可以具有很好的泛化能力。

3.多卷積核

一種卷積核代表的是一種特徵,為獲得更多不同的特徵集合,卷積層會有多個卷積核,生成不同的特徵,這也是為什麼卷積後的圖片的高,每一個圖片代表不同的特徵。
 

CNN實現架構

舉例LeNet-5主要有7層(不包括輸入和輸出),具體框架如圖:

流程:輸入層——>第一層卷積層——>第一層池化層——>第二層卷積層——>第二層池化層——>三層全連通層——>輸出層

詳解:輸入是一個2維的圖片,大小32X32,經過第一層卷積層,得到了C1層的6個28X28的特徵對映圖,6個說明了第一層卷積層用了6個卷積核。這裡卷積後大小變成28X28,這是因為卷積有兩種,一種有填充,卷積後與原影象大小一樣,另一種不帶填充,卷積後結果與原影象相比,小了一些。然後經過第一層池化層,28X28變成了14X14,一般是每鄰域四個畫素中的最大值變為一個畫素,相應圖片的長和寬各縮小兩倍。然後又經過一個卷積層,變成了C3層的16個10X10的特徵對映圖,然後又經過一個池化層,得到S4層的16個5X5的特徵對映,然後將這16個5X5的特徵對映送到3層的常規神經網路,得出最後的結果。

總結:我們可以這樣想,前面的卷積層和池化層是為了提取輸入的高階特徵,送到全連通層的輸入,然後訓練出最後的結果。

dropout

dropout是一種正則化的方法,應用在CNN中,主要解決CNN過擬合的問題。

怎麼理解這個東西呢,首先我們要知道為什麼過擬合?這是因為神經網路的神經元過多,引數過多,導致訓練集擬合得太好了,為此,我們想dropout(丟掉)一些神經元,讓它不產生影響。

具體做法:在每個隱藏層的輸入進行一個概率判決,比如我們設定概率為0.5(通常命名為keep_prob),根據0.5,我們生成一個跟隱藏層神經元個數的向量,true:false的比例是1:1(因為keep_prob=0.5),與隱藏層的輸入進行相乘,那麼會有一半隱藏層的神經元被丟掉,不起作用,整個網路變得簡單了,就會從過擬合過渡到just right 。這是組合派的說法,andrew也是這麼講的,文末連結中還有一派噪聲派的說法,也很有意思,可以看看!

圖形理解(這個keep_prob等於0.4,即2/5):

 

卷積神經網路架構

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=5
, 步幅 S=1
,如果不能恰好擬合輸入層,還要邊緣補零。如果使用 F=3, P=1
,那麼輸出大小將與輸入一樣。如果用更大的過濾器(比如7*7),一般只會在緊挨著原始輸入圖片的卷積層才會看到。
Pool Layer : F=2, S=2
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.