1. 程式人生 > >深度學習:卷積神經網路,卷積,啟用函式,池化

深度學習:卷積神經網路,卷積,啟用函式,池化

卷積神經網路——輸入層、卷積層、啟用函式、池化層、全連線層

https://blog.csdn.net/yjl9122/article/details/70198357?utm_source=blogxgwz3

一、卷積層

特徵提取

輸入影象是32*32*3,3是它的深度(即R、G、B),卷積層是一個5*5*3的filter(感受野),這裡注意:感受野的深度必須和輸入影象的深度相同。通過一個filter與輸入影象的卷積可以得到一個28*28*1的特徵圖,上圖是用了兩個filter得到了兩個特徵圖;

我們通常會使用多層卷積層來得到更深層次的特徵圖。如下: 

關於卷積的過程圖解如下: 

 

 

 

兩個神經元,即depth=2,意味著有兩個濾波器。
資料視窗每次移動兩個步長取3*3的區域性資料,即stride=2。
zero-padding=1。
然後分別以兩個濾波器filter為軸滑動陣列進行卷積計算,得到兩組不同的結果。

左邊是輸入(7*7*3中,7*7代表影象的畫素/長寬,3代表R、G、B 三個顏色通道)
中間部分是兩個不同的濾波器Filter w0、Filter w1
最右邊則是兩個不同的輸出
輸入影象和filter的對應位置元素相乘再求和,最後再加上b,得到特徵圖。如圖中所示,filter w0的第一層深度和輸入影象的藍色方框中對應元素相乘再求和得到1,其他兩個深度得到-1,0,則有1-1+0+1=1即圖中右邊特徵圖的第一個元素1

.,卷積過後輸入影象的藍色方框再滑動,stride(步長)=2,如下:
如上圖,完成卷積,得到一個3*3*1的特徵圖;在這裡還要注意一點,即zero pad項,即為影象加上一個邊界,邊界元素均為0.(對原輸入無影響)一般有

F=3 => zero pad with 1 
F=5 => zero pad with 2 
F=7=> zero pad with 3,邊界寬度是一個經驗值,加上zero pad這一項是為了使輸入影象和卷積後的特徵圖具有相同的維度,如:

輸入為5*5*3,filter為3*3*3,在zero pad 為1,則加上zero pad後的輸入影象為7*7*3,則卷積後的特徵圖大小為5*5*1((7-3)/1+1),與輸入影象一樣; 

如上圖,引數個數就是卷積核的大小 K *filter為3*3*3  也有 filter 是3*3*1 的卷積核
而關於特徵圖的大小計算方法具體如下: 

卷積層還有一個特性就是“權值共享”原則。如下圖: 

 

所謂的權值共享就是說,給一張輸入圖片,用一個filter去掃這張圖,filter裡面的數就叫權重,這張圖每個位置就是被同樣的filter掃的,所以權重是一樣的,也就是共享。儘量減少引數個數。

 

二、啟用函式

如果輸入變化很小,導致輸出結構發生截然不同的結果,這種情況是我們不希望看到的,為了模擬更細微的變化,輸入和輸出數值不只是0到1,可以是0和1之間的任何數,

啟用函式是用來加入非線性因素的,因為線性模型的表達力不夠 
這句話字面的意思很容易理解,但是在具體處理影象的時候是什麼情況呢?我們知道在神經網路中,對於影象,我們主要採用了卷積的方式來處理,也就是對每個畫素點賦予一個權值,這個操作顯然就是線性的。但是對於我們樣本來說,不一定是線性可分的,為了解決這個問題,我們可以進行線性變化,或者我們引入非線性因素,解決線性模型所不能解決的問題。 
這裡插一句,來比較一下上面的那些啟用函式,因為神經網路的數學基礎是處處可微的,所以選取的啟用函式要能保證資料輸入與輸出也是可微的,運算特徵是不斷進行迴圈計算,所以在每代迴圈過程中,每個神經元的值也是在不斷變化的。 
這就導致了tanh特徵相差明顯時的效果會很好,在迴圈過程中會不斷擴大特徵效果顯示出來,但有是,在特徵相差比較複雜或是相差不是特別大時,需要更細微的分類判斷的時候,sigmoid效果就好了。 
還有一個東西要注意,sigmoid 和 tanh作為啟用函式的話,一定要注意一定要對 input 進行歸一話,否則啟用後的值都會進入平坦區,使隱層的輸出全部趨同,但是 ReLU 並不需要輸入歸一化來防止它們達到飽和。

構建稀疏矩陣,也就是稀疏性,這個特性可以去除資料中的冗餘,最大可能保留資料的特徵,也就是大多數為0的稀疏矩陣來表示。其實這個特性主要是對於Relu,它就是取的max(0,x),因為神經網路是不斷反覆計算,實際上變成了它在嘗試不斷試探如何用一個大多數為0的矩陣來嘗試表達資料特徵,結果因為稀疏特性的存在,反而這種方法變得運算得又快效果又好了。所以我們可以看到目前大部分的卷積神經網路中,基本上都是採用了ReLU 函式。

常用的啟用函式 
啟用函式應該具有的性質: 
(1)非線性。線性啟用層對於深層神經網路沒有作用,因為其作用以後仍然是輸入的各種線性變換。。 
(2)連續可微。梯度下降法的要求。 
(3)範圍最好不飽和,當有飽和的區間段時,若系統優化進入到該段,梯度近似為0,網路的學習就會停止。 
(4)單調性,當啟用函式是單調時,單層神經網路的誤差函式是凸的,好優化。 
(5)在原點處近似線性,這樣當權值初始化為接近0的隨機值時,網路可以學習的較快,不用可以調節網路的初始值。 
目前常用的啟用函式都只擁有上述性質的部分,沒有一個擁有全部的

1、Sigmoid函式 


目前已被淘汰 
缺點: 
∙ 飽和時梯度值非常小。由於BP演算法反向傳播的時候後層的梯度是以乘性方式傳遞到前層,因此當層數比較多的時候,傳到前層的梯度就會非常小,網路權值得不到有效的更新,即梯度耗散。如果該層的權值初始化使得f(x) 處於飽和狀態時,網路基本上權值無法更新。 
∙ 輸出值不是以0為中心值。

2、Tanh函式 


其中σ(x) 為sigmoid函式,仍然具有飽和的問題。
 

3、relu啟用層 max(0,x)

啟用函式sigmoid,但實際梯度下降中,sigmoid容易飽和、造成終止梯度傳遞,且沒有0中心化。咋辦呢,可以嘗試另外一個啟用函式:ReLU,其圖形表示如下.ReLU的優點是收斂快,求梯度簡單。

優點: 
∙ x>0 時,梯度恆為1,無梯度耗散問題,收斂快; 
∙ 增大了網路的稀疏性。當x<0 時,該層的輸出為0,訓練完成後為0的神經元越多,稀疏性越大,提取出來的特徵就約具有代表性,泛化能力越強。即得到同樣的效果,真正起作用的神經元越少,網路的泛化效能越好 
∙ 運算量很小; 
缺點: 
如果後層的某一個梯度特別大,導致W更新以後變得特別大,導致該層的輸入<0,輸出為0,這時該層就會‘die’,沒有更新。當學習率比較大時可能會有40%的神經元都會在訓練開始就‘die’,因此需要對學習率進行一個好的設定。 
由優缺點可知max(0,x) 函式為一個雙刃劍,既可以形成網路的稀疏性,也可能造成有很多永遠處於‘die’的神經元,需要tradeoff

真實使用的時候最常用的還是ReLU函式,注意學習率的設定以及死亡節點所佔的比例即可

4、Leaky ReLU函式 


這裡寫圖片描述 
改善了ReLU的死亡特性,但是也同時損失了一部分稀疏性,且增加了一個超引數,目前來說其好處不太明確

5、Maxout函式 


這裡寫圖片描述

 

泛化了ReLU和Leaky ReLU,改善了死亡特性,但是同樣損失了部分稀疏性,每個非線性函式增加了兩倍的引數

 

 

 

 

三、池化層

pooling  對輸入的特徵圖進行壓縮,一方面使特徵圖變小,簡化網路計算複雜度;一方面進行特徵壓縮,提取主要特徵

從每層的特徵,不改變層數,只改變當前層的大小

在卷積神經網路中,我們經常會碰到池化操作,而池化層往往在卷積層後面,通過池化來降低卷積層輸出的特徵向量,同時改善結果(不易出現過擬合)。

池化pooling :  avy平均、  max最大

降低卷積層輸出的特徵向量,同時改善結果(不易出現過擬合)

最常見的池化操作為平均池化mean pooling和最大池化max pooling: 
平均池化:計算影象區域的平均值作為該區域池化後的值。 
最大池化:選影象區域的最大值作為該區域池化後的值。

 

 

卷積層本身是個特徵抽取,可以指定超引數F來制定設立多少個特徵抽取器。

Poolig層對Filter層的特徵進行降維操作,形成最終的特徵。 
一般在Pooling層後連線全連線層神經網路,形成最後的分類結果。

 

pooling 好處有以下幾點

  1. 保證特徵的位置與旋轉不變性。對於影象處理這種特性是很好的,但是對於NLP來說特徵出現的位置是很重要的。比如主語一般出現在句子頭等等

  2. 減少模型引數數量,減少過擬合問題。2D或1D的陣列轉化為單一數值,對於後續的convolution層或者全連線隱層來說,減少了單個Filter引數或隱層神經元個數

  3. 可以把變長的輸入x整理成固定長度的輸入。CNN往往最後連線全連線層,神經元個數需要固定好,但是cnn輸入x長度不確定,通過pooling操作,每個filter固定取一個值。有多少個Filter,Pooling就有多少個神經元,這樣就可以把全連線層神經元固定住

max pooling 缺點如下

特徵的位置資訊在這一步驟完全丟失。在卷積層其實是保留了特徵的位置資訊的,但是通過取唯一的最大值,現在在Pooling層只知道這個最大值是多少,但是其出現位置資訊並沒有保留;另外一個明顯的缺點是:有時候有些強特徵會出現多次,比如我們常見的TF.IDF公式,TF就是指某個特徵出現的次數,出現次數越多說明這個特徵越強,但是因為Max Pooling只保留一個最大值,所以即使某個特徵出現多次,現在也只能看到一次,就是說同一特徵的強度資訊丟失了。

空金字塔池化(Spatial Pyramid Pooling)

 
空間金字塔池化可以把任何尺度的影象的卷積特徵轉化成相同維度,這不僅可以讓CNN處理任意尺度的影象,還能避免cropping和warping操作,導致一些資訊的丟失,具有非常重要的意義。 
一般的CNN都需要輸入影象的大小是固定的,這是因為全連線層的輸入需要固定輸入維度,但在卷積操作是沒有對影象尺度有限制,所有作者提出了空間金字塔池化,先讓影象進行卷積操作,然後轉化成維度相同的特徵輸入到全連線層,這個可以把CNN擴充套件到任意大小的影象 

è¿éåå¾çæè¿°


空間金字塔池化的思想來自於Spatial Pyramid Model,它一個pooling變成了多個scale的pooling。用不同大小池化視窗作用於卷積特徵,我們可以得到1X1,2X2,4X4的池化結果,由於conv5中共有256個過濾器,所以得到1個256維的特徵,4個256個特徵,以及16個256維的特徵,然後把這21個256維特徵連結起來輸入全連線層,通過這種方式把不同大小的影象轉化成相同維度的特徵。 

è¿éåå¾çæè¿°

 
對於不同的影象要得到相同大小的pooling結果,就需要根據影象的大小動態的計算池化視窗的大小和步長。假設conv5輸出的大小為a*a,需要得到n*n大小的池化結果,可以讓視窗大小sizeX為,步長為 。下圖以conv5輸出的大小為13*13為例。

 

四、全連線層

連線所有的特徵,將輸出值送給分類器(如softmax分類器)。