1. 程式人生 > >對CNN網路卷積層的一些理解

對CNN網路卷積層的一些理解

關於CNN的全連線層可以看這篇文章:https://blog.csdn.net/zgcr654321/article/details/84894860

CNN網路的卷積層的組成和全連線層類似,它也由線性部分和非線性部分組成。但是CNN卷積層的線性部分計算與全連線層不同。

CNN卷積層的線性部分計算總是針對輸入樣本中區域性的一塊區域的資料,而全連線層的線性部分計算總是針對輸入的整個樣本的資料。我們將卷積層的線性部分計算稱為卷積。

卷積運算由影象資料和卷積核兩部分資料合作完成,影象資料中的每一個和卷積核等大小的區域都會和卷積核完成元素級(Element-wise)乘法(即相同位置的元素相乘),並將乘法得到的結果加和匯聚成一個數字。每個區域都會得到這樣的一個數字,所有的數字根據相對位置拼合起來,就是卷積計算最後的結果。

如:

卷積計算的特點:

首先,卷積層的計算只會做某一部分的資料彙總計算,比方說在以某一畫素為中心的某個區域內進行彙總計算;

其次,卷積層在完成區域性彙總計算後, 會保持計算前的相對位置。如左右相鄰的兩個畫素,以左邊畫素為中心的彙總結果還是會在以右邊畫素為中心的彙總結果的左邊。這使得卷積層的輸入輸出及中間結果都保持一定的空間形狀。

卷積引數stride:

表示我們卷積區域每次更新時的步長。

卷積引數padding:

在原始影象四周填充適當行和列的0值使得我們卷積輸出的矩陣大小不變。padding後,對於那些處於邊角的畫素也可以參與卷積計算了。

如:

卷積層到底卷積了什麼?

卷積運算利用了影象的區域性相關性。影象的區域性區域的畫素往往具有相關性,比如一段筆畫附近的畫素往往是相同顏色的,一塊背景區域的畫素之間的顏色差距也不大。

一個畫素通常和距離很遠的畫素關係不大,因此卷積計算在關注了附近畫素的同時,忽略了遠處的畫素,這也和實際影象表現出來的性質類似。

卷積計算就是對我們區域性相關的一塊區域中的畫素資料作了一種“精簡”,同時又保留了這一個個區域性區域在影象整體上的空間相關性。

卷積只考慮一塊區域性區域的內容,分析這塊區域性區域的特點,針對這塊區域性區域使用卷積演算法計算出一個最能程式碼這塊區域的資料特徵值。再加上pooling層從卷積結果中只選擇一些高價值的資訊,這樣就可以進一步對特徵資訊進行過濾處理,讓特徵變得少而精。

RELU啟用函式:

RELU,全稱Rectify Linear Unit。它的函式形式是這樣的:

def relu(x) :
    return x if x > 0 else 0

函式影象如下:

這個函式主要是為了解決sigmoid啟用函式引起的梯度消失問題。

因為sigmoid函式的導數是

而其中f(x)的範圍是(0,1)。

這個導數的最大值也只有0.25(f(x)=0.5時)。那麼在反向傳播計算時,由於是按鏈式求導法則計算,每層的sigmoid函式的導數都小於等於0.25,這樣就會導致最後得到的梯度值在最初的幾層變得很小。那麼最初幾層的引數在訓練時更新的速度就很慢,整個網路的訓練過程就會延長。

ReLU函式把小於0的部分截斷,那麼對於x大於0的線性部分的輸出,最終的結果就好像左乘一個非0即1的對角陣。

如:

如果把非線性層的輸入想象成高維空間的一個向量,那麼ReLU就是完成一次向量的投影,捨棄了其中的負數部分。從這個角度來思考,深層神經網路的計算過程就變成了“線性變換一投影一線性變換一投影”這樣不斷迴圈的過程。

當然,由於RELU函式在x大於0時輸出仍為x,這樣資料的上界沒有限制,故也可能因為資料過大引起資料不穩定的問題。因此也有人將資料先進行batch normalization後再輸入RELU。

relu函式在x大於0時,導數為1,x小於0時導數為0,這樣就不會引起梯度消失的問題。對於導數為0的那些權重相當於本次訓練過程反向傳播時沒有更新權重,但是下一次訓練時,這個權重接收到的輸入x就可能會大於0,這樣下一次反向傳播時就會更新這個權重。

Softplus啟用函式:

它和ReLU的函式非常相近,一般也可以認為是ReLU的平滑版。而且它的導數函式剛好是Sigmoid 函式。

不過這個函式相對來說計算量依然比較大,所以一般不太被人使用。它代表了啟用函式的一個新方向:單邊抑制,更寬廣的接受域(0,+oo),這些和Sigmoid 函式相比有很大的不同。