【Python教程】計算機視覺的基石——讀懂 CNN卷積神經網路

懶懶小道長 發表於 2021-08-26
Python 神經網路

神經網路接受輸入影像/特徵向量,並通過一系列隱藏層轉換,然後使用非線性啟用函式。每個隱藏層也由一組神經元組成,其中每個神經元都前一層中的所有神經元完全連線。神經網路的最後一層(即“輸出層”)也是全連線的,代表網路的最終輸出分類。

計算機視覺的基石——讀懂 CNN卷積神經網路

CNN神經網路

一般卷積神經網路有如下結構:

  1. •資料輸入層/ Input layer
  2. •卷積計算層/ CONV layer
  3. •ReLU激勵層 / ReLU layer
  4. •池化層 / Pooling layer
  5. •全連線層 / FC layer

當然卷積層,Relu激勵層與Pooling層可以多次使用

輸入層/ Input layer

該層要做的處理主要是對原始影像資料進行預處理,其中包括:

•去均值:把輸入資料各個維度都中心化為0,如下圖所示,其目的就是把樣本的中心拉回到座標系原點上。

•歸一化:幅度歸一化到同樣的範圍,如下所示,即減少各維度資料取值範圍的差異而帶來的干擾,比如,我們有兩個維度的特徵A和B,A範圍是0到10,而B範圍是0到10000,如果直接使用這兩個特徵是有問題的,好的做法就是歸一化,即A和B的資料都變為0到1的範圍。

•PCA/白化:用PCA降維;白化是對資料各個特徵軸上的幅度歸一化

卷積層

卷積層是卷積神經網路的核心構建塊。這層引數由一組K 個可學習過濾器(即“核心”)組成,其中每個過濾器都有寬度和高度,並且幾乎總是正方形。

對於 CNN 的輸入,深度是影像中的通道數(即,處理 RGB 影像時深度為 3,每個通道一個)。對於網路中更深的卷積,深度將是一層應用的過濾器數量。

為了讓這個概念更清晰,讓我們考慮 CNN 的前向傳遞,我們在輸入體積的寬度和高度上對K 個濾波器中的每一個進行卷積。更簡單地說,我們可以想象我們的K 個核心中的每一個都在輸入區域上滑動,計算元素級乘法、求和,然後將輸出值儲存在二維啟用圖中

計算機視覺的基石——讀懂 CNN卷積神經網路

左:在 CNN 的每個卷積層,有K 個核心。中間:K 個核心中的每一個都與輸入進行了卷積。右圖:每個核心產生一個 2D 輸出,稱為啟用圖。卷積過程可以參考下圖

計算機視覺的基石——讀懂 CNN卷積神經網路

在將所有K 個過濾器應用於輸入體積後,我們現在有K個二維啟用圖。然後我們沿著陣列的深度維度堆疊我們的K 個啟用圖,以形成最終的輸出體積。

計算機視覺的基石——讀懂 CNN卷積神經網路

獲得K個啟用圖後,將它們堆疊在一起,形成網路中下一層的輸入。

因此,輸出中的每一個都是一個神經元的輸出,它只“觀察”輸入的一小部分割槽域。通過這種方式,神經網路“學習”過濾器,當它們在輸入中的給定空間位置看到特定型別的特徵時啟用。在網路的較低層,當過濾器看到類似邊緣或類似角落的區域時,它們可能會啟用。

這裡有三個引數控制輸出體積的大小:depthstridezero-padding大小

depth

輸出影像的深度。每個過濾器都會生成一個啟用圖,在K個核心的卷積中,啟用圖的深度將為K,或者只是我們在當前層中學習的過濾器的數量。

stride

考慮我們將卷積操作描述為在大矩陣上“滑動”一個小矩陣,在每個座標處停止,計算元素乘法求和,然後儲存輸出。這個描述類似於一個滑動視窗,它從左到右、從上到下在影像上滑動。這裡我們有一個 5 × 5 的輸入影像和一個 3 × 3 的卷積核心。

計算機視覺的基石——讀懂 CNN卷積神經網路

使用S = 1,我們的核心從左到右從上到下滑動,一次一個畫素,產生以下輸出(左圖)。若使用S = 2的步幅,我們一次跳過兩個畫素(沿x軸的兩個畫素和沿y軸的兩個畫素),將會輸出更少的資料量(右圖)

計算機視覺的基石——讀懂 CNN卷積神經網路

左: 1 × 1 步長的卷積輸出。右圖: 2 × 2 步長的卷積輸出

zero-padding

在應用卷積時,我們需要“填充”輸入影像的邊界以保留經過CNN卷積後的原始影像大小。使用zero-padding,我們可以沿著邊界“填充”我們的輸入影像,使得我們經過CNN後輸出體積大小與我們的輸入體積大小完全一樣。我們應用的填充量由引數P控制。

為了視覺化zero-padding,我們將 3 × 3 卷積核心應用於步長為S = 1的 5 × 5 輸入影像

從上圖中,我們可以看到卷積後的圖片尺寸為3*3,如果我們改為設定P = 1,我們可以用零填充我們的輸入圖片()以建立一個 7 × 7 的圖片尺寸,然後應用卷積操作,得到5*5的輸出圖片,這跟輸入圖片的尺寸大小完全一致。

計算機視覺的基石——讀懂 CNN卷積神經網路

•ReLU激勵層 / ReLU layer

這一層也是我們前期分享的激勵函式層

計算機視覺的基石——讀懂 CNN卷積神經網路

左上角:階躍函式。右上角: Sigmoid 啟用函式。左中:雙曲正切。中右: ReLU 啟用(深度神經網路最常用的啟用函式)。左下: Leaky ReLU,允許負數的 ReLU 變體。右下: ELU,ReLU 的另一種變體,其效能通常優於 Leaky ReLU。

CNN採用的激勵函式一般為ReLU(The Rectified Linear Unit/修正線性單元),它的特點是收斂快,求梯度簡單,但較脆弱,影像如下。

計算機視覺的基石——讀懂 CNN卷積神經網路

在輸入圖片進行CNN卷積後,通常我們需要使用激勵函式對輸出的圖片資料進行激勵,一般神經網路最常見的是ReLU激勵函式,說白一點,此函式便是當小於0的資料全部替換成0,大於0的資料是y=x,直接是輸入的值

此層接受大小為W input ×H input ×D input的輸入圖片,然後應用給定的啟用函式。由於啟用函式以元素方式應用,啟用層的輸出始終與輸入維度相同,W input = W outputH input = H outputD input = D output

計算機視覺的基石——讀懂 CNN卷積神經網路

啟用函式

池化層 / Pooling layer

有兩種方法可以減小輸入圖片的大小,CNN 以及pooling,常見的卷積神經網路的步驟為

輸入 = >CNN = > RELU = >pooling= >CNN = > RELU = >pooling = > FC

池化層夾在連續的卷積層中間, 用於壓縮資料和引數的量,減小過擬合。簡而言之,如果輸入是影像的話,那麼池化層的最主要作用就是壓縮影像。池化層用的方法有Max pooling 和 average pooling,而實際用得較多的是Max pooling。

通常我們使用 2 × 2的池大小,我們還將步幅設定為S = 1 或S = 2。下圖應用最大池化的示例,其中池大小為 2 × 2,步幅為S = 1。每 2 × 2 塊,我們只保留最大值,從而產生 3 × 3的輸出體積大小。

計算機視覺的基石——讀懂 CNN卷積神經網路

我們可以通過增加步幅來進一步減小輸出體積的大小——這裡我們將S = 2 應用於相同的輸入。對於輸入中的每個 2 × 2 塊,我們只保留最大值,然後以兩個畫素為步長,再次應用該操作,我們得到2*2的輸出圖片大小。

全連線層

深度神經網路的最後一層往往是全連線層+Softmax(分類網路),如下圖所示

計算機視覺的基石——讀懂 CNN卷積神經網路

全連線層將權重矩陣與輸入向量相乘再加上偏置,將n個(−∞,+∞)的實數對映為K個(−∞,+∞)的實數(分數);Softmax將K個(−∞,+∞)的實數對映為K個(0,1)的實數(概率),同時保證它們之和為1。具體如下:

計算機視覺的基石——讀懂 CNN卷積神經網路

其中,x為全連線層的輸入,Wn*K為權重,b為偏置,y^為Softmax輸出的概率,Softmax的計算方式如下:

計算機視覺的基石——讀懂 CNN卷積神經網路

dropout

Dropout 實際上是一種正則化形式,旨在通過提高測試準確性來幫助防止過度擬合,可能會以犧牲訓練準確性為代價。對於我們訓練集中的每個小批量,dropout 層以概率p隨機斷開網路架構中從前一層到下一層的輸入。

計算機視覺的基石——讀懂 CNN卷積神經網路

我們應用 dropout 的原因是通過在訓練時,改變網路架構來減少過擬合

計算機視覺的基石——讀懂 CNN卷積神經網路

如上圖:圖中黑色曲線是正常模型,綠色曲線就是overfitting模型。儘管綠色曲線很精確地區分了所有的訓練資料,但是並沒有描述資料的整體特徵,對新測試資料的適應性較差,且訓練模型太複雜,後期的訓練資料會很龐大。

假設有一個神經網路:

計算機視覺的基石——讀懂 CNN卷積神經網路

按照之前的方法,根據輸入X,先正向更新神經網路,得到輸出值,然後反向根據backpropagation演算法來更新權重和偏向。而Dropout不同的是,

1)在開始,隨機刪除掉隱藏層一半的神經元,如圖,虛線部分為開始時隨機刪除的神經元:

計算機視覺的基石——讀懂 CNN卷積神經網路

2)然後,在刪除後的剩下一半的神經元上正向和反向更新權重和偏差;

3)再恢復之前刪除的神經元,再重新隨機刪除一半的神經元,進行正向和反向更新w和b;

4)重複上述過程。

最後還是要推薦下我自己建的Python學習群:[856833272],群裡都是學Python的,如果你想學或者正在學習Python ,歡迎你加入,大家都是軟體開發黨,不定期分享乾貨,還有免費直播課程領取。包括我自己整理的一份2021最新的Python進階資料和零基礎教學,歡迎進階中和對Python感興趣的小夥伴加入!還可以掃碼加VX領取資料哦!

【Python教程】計算機視覺的基石——讀懂 CNN卷積神經網路