卷積神經網絡CNN

卷積神經網絡,在圖像識別和天然語言處理中有很大的做用,講cnn的中文博客也很多,可是我的感受說的脈絡清晰清晰易懂的很少.python

無心中看到這篇博客,寫的很好,圖文並茂.建議英文好的直接去看原文.英文很差的就直接看我這篇,算是讀後總結吧.原文裏對數學原理的着墨很少,在這篇文章裏我會留着相關的標題,待往後慢慢補充這篇文章.git

 

卷積神經網絡

 

以上是一個cnn的典型結構.包含如下3種結構github

  • 卷積層
  • 池化層
  • 全鏈接層

卷積層

這是數字8的圖片,圖片其實就是一堆像素點的組合,能夠理解爲一個M*N的矩陣,矩陣中每個元素的值就是像素值,取值從0-255.彩色的圖有RGB三個通道,能夠理解爲3個M*N矩陣.爲了簡化討論,咱們以灰度圖爲例,灰度圖是單通道的.算法

卷積在作什麼

假設咱們有一個5*5的圖片網絡

咱們有一個3*3的矩陣,在CNN中,咱們稱之爲‘filter‘ or ‘kernel’ or ‘feature detector’。app

,ide

咱們用這個kenel對輸入的圖像作卷積,過程以下所示:函數

其中,卷積的過程,用filter與input的相應位置相乘再相加.獲得新的矩陣的對應元素的值.ui

而後滑動這個filter矩陣,滑動x個像素,x稱之爲步長stride(在這個例子中步長=1),算出下一個矩陣對應元素的值.不斷重複這個過程. 完整過程以下所示:this

卷積後獲得的這個3*3的矩陣稱之爲‘Activation Map’ or the ‘Feature Map‘.

卷積層完成了特徵提取.

 

卷積有什麼效果

不一樣的filter有不一樣的效果.好比上圖展現了邊緣檢測,銳化,模糊等等.

下圖很好的展現了cnn卷積操做作了什麼:

不一樣的filter提取出了圖片的不一樣角度的特徵,獲得了不一樣的特徵圖.注意將上述的圖片都理解爲一個一個的矩陣.

It is important to note that the Convolution operation captures the local dependencies in the original image.

影響咱們獲得的特徵圖的參數有如下幾個:

Depth:

depth與filter數量是一致的.不一樣的獨立的filter提取出不一樣的特徵. 好比以下,有3個filter對原始圖片進行處理,獲得的特徵圖能夠理解爲3個疊在一塊兒的矩陣.

 

Stride

步長是filter矩陣在輸入矩陣上每次滑動的距離.步長越大,最終獲得的特徵圖越小.

Zero-padding 

補零操做,在原始矩陣周圍補0. 添加補0的卷積叫wide convolution, 不添加補0的卷積叫 narrow convolution

以原始圖像爲32*32,filter爲5*5爲例,不作補0的話,獲得的特徵圖矩陣大小爲28*28.在神經網絡的前幾層,咱們但願保留儘量多的信息,好提取更多的特徵.即咱們但願依然獲得一個32*32的矩陣.

https://adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks-Part-2/

Now, let’s take a look at padding. Before getting into that, let’s think about a scenario. What happens when you apply three 5 x 5 x 3 filters to a 32 x 32 x 3 input volume? The output volume would be 28 x 28 x 3. Notice that the spatial dimensions decrease. As we keep applying conv layers, the size of the volume will decrease faster than we would like. In the early layers of our network, we want to preserve as much information about the original input volume so that we can extract those low level features. Let’s say we want to apply the same conv layer but we want the output volume to remain 32 x 32 x 3. To do this, we can apply a zero padding of size 2 to that layer. Zero padding pads the input volume with zeros around the border. If we think about a zero padding of two, then this would result in a 36 x 36 x 3 input volume.

 

卷積爲何有這種效果

卷積爲何能夠提取特徵,背後的數學原理,往後補充

非線性(ReLU)

ReLU做用於卷積後獲得的特徵圖. 將矩陣中的負數替換爲0.

ReLU爲卷積神經網絡引入非線性.真實世界裏的數據絕大多數是非線性的(卷積是一種線性操做)

The purpose of ReLU is to introduce non-linearity in our ConvNet, since most of the real-world data we would want our ConvNet to learn would be non-linear (Convolution is a linear operation – element wise matrix multiplication and addition, so we account for non-linearity by introducing a non-linear function like ReLU)

對特徵圖中的每個像素作ReLU操做後的效果如上圖所示.

其餘的非線性函數還有tanh,sigmoid。可是實際使用中,大多狀況下ReLU效果更好.

 

池化層

上面通過多個filter卷積,以及ReLU處理以後,咱們獲得了多個特徵圖.
此時咱們想減少特徵矩陣的維度,可是又保留下最重要的特徵.和上面介紹的卷積過程相似,咱們定義一個空間池.池化操做有Max, Average, Sum etc.

Spatial Pooling (also called subsampling or downsampling) reduces the dimensionality of each feature map but retains the most important information. Spatial Pooling can be of different types: Max, Average, Sum etc.

下圖展現了用一個2*2的filter作最大池化後的效果:

下圖展現了實際的特徵圖作不一樣的池化操做的效果:

 

池化有如下4個做用

  • 減小特徵維度
  • 減小參數及運算量,這樣模型的複雜度下降,避免過擬合
  • 使得神經網絡對原始圖像的一些小改變能夠無視,仍然取的相同的處理效果.  好比原始圖片的某個像素從0-->10.假設這個像素周邊的像素最大值爲20.那作完max池化操做後,咱們獲得的仍然是20.
  • 讓咱們獲得等變的圖像.(這句沒大理解啥意思).做用就是:不管圖片中的物體位於什麼位置,咱們都能識別.
  • makes the input representations (feature dimension) smaller and more manageable  
  • reduces the number of parameters and computations in the network, therefore, controlling overfitting [4]  
  • makes the network invariant to small transformations, distortions and translations in the input image (a small distortion in input will not change the output of Pooling – since we take the maximum / average value in a local neighborhood).  
  • helps us arrive at an almost scale invariant representation of our image (the exact term is 「equivariant」). This is very powerful since we can detect objects in an image no matter where they are located (read [18] and [19] for details).

 

全鏈接層

全鏈接層是一個在輸出層使用了softmax激活函數的多層感知機.

什麼是多層感知機

卷積層和池化層的輸出的特徵圖矩陣,表明了輸入圖像的高層次特徵(high-level features).全鏈接層使用這些高層次特徵對輸入圖片進行分類.

除了用於分類,添加一個全鏈接層一般也是一種爲特徵組合添加非線性的方式.對分類任務來講,使用卷積和池化層輸出的特徵就已經能取得不錯的結果,可是把這些特徵組合到一塊兒,效果會更好.

全鏈接層輸出的分類機率之和爲1.這是由softmax保證的.

什麼是softmax

 

CNN的完整過程

以上述圖片識別爲例,咱們要識別出來這張圖應該被分類爲dog/cat/boat/bird?

上文說過了,卷積層和池化層的做用是特徵提取,全鏈接層的做用是分類.

整個神經網絡的訓練過程以下:

  • step1:用隨機值初始化全部的filter和參數/權重
  • step2:CNN接收待識別圖片做爲輸入,通過卷積,ReLU,池化,全鏈接層的一系列操做後,能夠輸出分類機率
    • 好比咱們獲得機率爲[0.2, 0.4, 0.1, 0.3]
    • 因爲權重值是隨機設置的,因此第一次訓練後獲得的分類機率也是隨機的.
  • step3:計算分類結果的錯誤.
    •   Total Error = ∑  ½ (target probability – output probability) ²
  • step4:用反向傳播算法計算Total Error 對網絡中全部權值的梯度,利用梯度降低更新全部filter/權重值和參數值,使輸出偏差最小。
    •   權重根據它們對總偏差的貢獻按比例進行調整
    •        對同一圖片再進行訓練,這時候獲得的機率多是[0.1, 0.1, 0.7, 0.1],距離正確的目標[0, 0, 1, 0]又更近一步了.這說明神經網絡經過調整weights/filters的值已經更好地學到了圖片的信息.
    •        在訓練過程當中,filters,filter size,cnn的結構這些是在step1以前就肯定的,不會在訓練過程當中改變.只有filter矩陣的值和鏈接的權重會更新.
  • step5:對訓練集中的全部圖片重複step2-step4.

這樣咱們的神經網絡的filter/parameters/weights這些就肯定下來了,當來了一個新的圖片,咱們就能夠按照前面說的卷積-池化-全鏈接這個過程處理圖片對其進行分類.

 

幾點要注意的:

  • 上面的例子裏咱們使用了2個卷積層+池化層,實際上這個次數是沒有限制的.
  • 並非必定要一個卷積層接一個池化層,池化層前面能夠有多個卷積層.

 

 手寫數字識別示例

這是一個1024個像素點(32*32)的圖片。

卷積層1有6個filter,每一個filter是5*5矩陣(stride=1)。 28*28

池化層1作2*2 max pooling(stride=2)。            

能夠看出來作max pooling以後,圖片留下了最亮的點.

卷積層2有6個filter,每一個filter是5*5矩陣(stride=1)。

池化層2作2*2 max pooling(stride=2)。

 

接下來是3個全鏈接層

  • 第一個鏈接層有120個神經元
  • 第二個鏈接層有100個神經元
  • 第三個鏈接層(也叫輸出層),有10個神經元,表明數字0-9.

 


 

cnn識別手寫數字集

model = Sequential()

model.add(Conv2D(filters = 32, kernel_size = (5,5),padding = 'Same',activation ='relu', input_shape = (28,28,1)))
model.add(Conv2D(filters = 64, kernel_size = (5,5),padding = 'Same', activation ='relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Flatten())
model.add(Dense(256, activation = "relu"))
model.add(Dropout(0.2))
model.add(Dense(10, activation = "softmax"))

model.compile(optimizer = "SGD" , loss = "categorical_crossentropy", metrics=["accuracy"])

model.fit(X_train, Y_train, batch_size=100, verbose=1,epochs=5,validation_data=(X_val, Y_val))

完整代碼見https://github.com/sdu2011/nlp/blob/master/keras.ipynb.

相關文章
相關標籤/搜索