天天看點

CNN卷積神經網絡學習筆記CNN訓練過程:

對CNN卷積神經網絡學習過程中的學習筆記,會持續更新。

本文所說的CNN(Convolution Neural Network)是卷積神經網絡的英文首字母,非"美國有線電視新聞網(Cable News Network)"。

CNN結構大同小異,主要由三個部分構成:

1.卷積層(Convlolutional layer)

2.池化層(Pooling layer)

3.全連接配接層(Full connected layer)

CNN卷積神經網絡學習筆記CNN訓練過程:

卷積層:

卷積層由多個卷積核構成,卷積核為帶有表示權重大小的矩陣。

卷積公式:

CNN卷積神經網絡學習筆記CNN訓練過程:

它的實體意義大概可以了解為:系統某一時刻的輸出是由多個輸入共同作用(疊加)的結果。

放在圖像分析裡,f(x) 可以了解為原始像素點(source pixel),所有的原始像素點疊加起來,就是原始圖了。

g(x)可以稱為作用點,所有作用點合起來我們稱為卷積核(Convolution kernel)。

卷積核上所有作用點依次作用于原始像素點後(即乘起來),線性疊加的輸出結果,即是最終卷積的輸出,也是我們想要的結果,我們稱為destination pixel.

CNN卷積神經網絡學習筆記CNN訓練過程:

卷積過程動态圖

卷積的意義:

提取特征。

卷積後輸出單元數量計算:

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

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

輸出單元數量計算定義如下:

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

則可以用以下公式計算一個次元(寬或高)内一個輸出單元裡可以有幾個隐藏單元: 

如果計算結果不是一個整數,則說明現有參數不能正好适合輸入,步幅(stride)設定的不合适,或者需要補零。

池化層:

池化主要方式:

1) mean-pooling,即對鄰域内特征點隻求平均,對背景保留更好;

2) max-pooling,即對鄰域内特征點取最大,對紋理提取更好;

3) Stochastic-pooling,介于兩者之間,通過對像素點按照數值大小賦予機率,再按照機率進行亞采樣;

CNN卷積神經網絡學習筆記CNN訓練過程:
作用:

1. invariance(不變性),這種不變性包括translation(平移),rotation(旋轉),scale(尺度)

2. 獲得定長輸出。(文本分類的時候輸入是不定長的,可以通過池化獲得定長輸出)

3. 保留主要的特征同時減少參數(降維,效果類似PCA)和計算量,防止過拟合,提高模型泛化能力

做視窗滑動卷積的時候,卷積值就代表了整個視窗的特征。因為滑動的視窗間有大量重疊區域,出來的卷積值有備援,進行最大pooling或者平均pooling就是減少備援。

減少備援的同時,pooling也丢掉了局部位置資訊,是以局部有微小形變,結果也是一樣的。就像圖檔上的字母A,局部出現微小變化,也能夠被識别成A。 而平移不變性,就是一個特征,無論出現在圖檔的那個位置,都會識别出來。 是以平移不變性不是pooling帶來的,而是層層的權重共享帶來的[1]。

全連接配接層:

全連接配接層(fully connected layers,FC)在整個卷積神經網絡中起到“分類器”的作用。如果說卷積層、池化層和激活函數層等操作是将原始資料映射到隐層特征空間的話,全連接配接層則起到将學到的“分布式特征表示”映射到樣本标記空間的作用,大大減少特征位置對分類帶來的影響。因為空間結構特性被忽略了,是以全連接配接層不适合用于在方位上找Pattern的任務,比如segmentation。

泰勒公式 用多項式函數去拟合光滑函數,全連接配接層中一層的一個神經元就可以看成一個多項式;用一層fully connected layer 有時候沒法解決非線性問題,而如果有兩層或以上fully connected layer就可以很好地解決非線性問題了。

在實際使用中,全連接配接層可由卷積操作實作:對前層是全連接配接的全連接配接層可以轉化為卷積核為1x1的卷積;而前層是卷積層的全連接配接層可以轉化為卷積核為hxw的全局卷積,h和w分别為前層卷積結果的高和寬

以VGG-16為例,對224x224x3的輸入,最後一層卷積可得輸出為7x7x512,如後層是一層含4096個神經元的FC,則可用卷積核為7x7x512x4096的全局卷積來實作這一全連接配接運算過程,其中該卷積核參數如下:

“filter size = 7, padding = 0, stride = 1, D_in = 512, D_out = 4096”

經過此卷積操作後可得輸出為1x1x4096。

如需再次疊加一個2048的FC,則可設定參數為“filter size = 1, padding = 0, stride = 1, D_in = 4096, D_out = 2048”的卷積層操作[2]。

Reference: https://www.zhihu.com/question/41037974/answer/320267531

CNN訓練過程:

如何調整Filter的權重:通過反向傳播 反向傳播過程: 1) 向前傳遞 2) 損失函數 3) 向後傳遞 4) 權重更新

開始階段權重都是随機的,無法找出低層次的特性,無法得出分類的合理結論。

損失函數:

如何比較預測值和目标值的差異,用于衡量預測值和目标值的差異的方程。損失函數的輸出值越高表示差異值越大。損失函數常見定義時MSE(平均平方誤差)即(實際的-預測的)平方:   

CNN卷積神經網絡學習筆記CNN訓練過程:

如何縮小loss:

梯度下降法:通過使loss值向目前點對應梯度的反方向不斷移動來降低loss。一次移動多少是由學習速率(learning rate)控制的。 使用梯度下降訓練神經網絡有兩個難題: 1、 局部最小值   梯度下降尋找的時損失函數的局部最小值,而我們想要的是全局最小值。

解決辦法:

調節步伐:調節學習速率,使每一次的更新的“步伐”不同,常用方法有: 1) 随機梯度下降(SGD):每次隻更新一個樣本所計算的梯度 2) 小批量梯度下降(mini-batch gradient descent):每次更新若幹樣本所計算的梯度平均值 3) 動量(momentum):不僅僅考慮目前樣本所計算的梯度 4) Neserov動量:momentum的改進 5) Adagrad、RMSprop、Adadelta、Adam:這些方法都是訓練過程中依照規則降低學習速率 優化起點:合理初始化權重(weights initialization)、預訓練網絡(pre-train),使網絡獲得一個較好的“起始點”,如最右側的起始點就比最左側的起始點要好。常用方法有: 1) 高斯分布初始權重(Gaussian distribution) 2) 均勻分布初始權重(Uniform distribution) 3) Glorot初始權重 4) He初始權重 5) 稀疏矩陣初始權重(sparse matrix) 2、 梯度計算 

反向傳播算法

為了達到預測的标簽和訓練标簽一緻的目的,需要最小化損失。把最小化損失看作微積分中的一個優化問題,找出時哪些輸入直接導緻了網絡中的損失。

CNN卷積神經網絡學習筆記CNN訓練過程:

  這是一個數學上的等價于dl/dw,其中W是一個特定層的權重。   學習速率是由程式員選擇的一個參數。高學習率意味着在權重更新中會采取更大的步驟,是以,模型在最優權重集上的收斂可能會花費更少的時間。然而,一個太高的學習速率會導緻跳得太大而不夠精确以至于無法達到最佳點。

CNN卷積神經網絡學習筆記CNN訓練過程:

轉發傳遞、丢失功能、反向傳遞和參數更新的過程是一個訓練疊代。這個程式将重複這個過程,為每組訓練圖像(通常稱為批處理)進行固定次數的疊代。一旦在上一個教育訓練示例中完成了參數更新,希望網絡應該得到足夠的訓練,進而使各個層的權重得到正确的調優。

參考文獻

[1].CNN網絡的pooling層有什麼用? - 知乎https://www.zhihu.com/question/36686900

[2].全連接配接層的作用是什麼? - 蔣竺波的回答 - 知乎https://www.zhihu.com/question/41037974/answer/320267531

繼續閱讀