卷積神經網絡——輸入層、卷積層、激活函數、池化層、全連接層


版權聲明:本文為博主原創文章,遵循 CC 4.0 by-sa 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接: https://blog.csdn.net/yjl9122/article/details/70198357

卷積神經網絡(CNN)由輸入層、卷積層、激活函數、池化層、全連接層組成,即INPUT(輸入層)-CONV(卷積層)-RELU(激活函數)-POOL(池化層)-FC(全連接層)

卷積層

用它來進行特征提取,如下:


 

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

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



 

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



輸入圖像和filter的對應位置元素相乘再求和,最后再加上b,得到特征圖。如圖中所示,filter w0的第一層深度和輸入圖像的藍色方框中對應元素相乘再求和得到0,其他兩個深度得到2,0,則有0+2+0+1=3即圖中右邊特征圖的第一個元素3.,卷積過后輸入圖像的藍色方框再滑動,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),與輸入圖像一樣;
而關於特征圖的大小計算方法具體如下:


這里寫圖片描述

 

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


 

如沒有這個原則,則特征圖由10個32*32*1的特征圖組成,即每個特征圖上有1024個神經元,每個神經元對應輸入圖像上一塊5*5*3的區域,即一個神經元和輸入圖像的這塊區域有75個連接,即75個權值參數,則共有75*1024*10=768000個權值參數,這是非常復雜的,因此卷積神經網絡引入“權值”共享原則,即一個特征圖上每個神經元對應的75個權值參數被每個神經元共享,這樣則只需75*10=750個權值參數,而每個特征圖的閾值也共享,即需要10個閾值,則總共需要750+10=760個參數。

所謂的權值共享就是說,給一張輸入圖片,用一個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的隨機值時,網絡可以學習的較快,不用可以調節網絡的初始值。
目前常用的激活函數都只擁有上述性質的部分,沒有一個擁有全部的~~

  • Sigmoid函數


     

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

  • Tanh函數


    這里寫圖片描述

     

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

  • ReLU函數


    這里寫圖片描述

     

    Alex在2012年提出的一種新的激活函數。該函數的提出很大程度的解決了BP算法在優化深層神經網絡時的梯度耗散問題

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

  • Leaky ReLU函數


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

     

  • Maxout函數


    這里寫圖片描述

     

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

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

池化層

對輸入的特征圖進行壓縮,一方面使特征圖變小,簡化網絡計算復雜度;一方面進行特征壓縮,提取主要特征,如下:


這里寫圖片描述

 

池化操作一般有兩種,一種是Avy Pooling,一種是max Pooling,如下:


這里寫圖片描述

 

同樣地采用一個2*2的filter,max pooling是在每一個區域中尋找最大值,這里的stride=2,最終在原特征圖中提取主要特征得到右圖。
(Avy pooling現在不怎么用了,方法是對每一個2*2的區域元素求和,再除以4,得到主要特征),而一般的filter取2*2,最大取3*3,stride取2,壓縮為原來的1/4.
注意:這里的pooling操作是特征圖縮小,有可能影響網絡的准確度,因此可以通過增加特征圖的深度來彌補(這里的深度變為原來的2倍)。


 

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

為什么可以通過降低維度呢?
因為圖像具有一種“靜態性”的屬性,這也就意味着在一個圖像區域有用的特征極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)來代表這個區域的特征。

  • 一般池化(General Pooling)

    池化作用於圖像中不重合的區域(這與卷積操作不同),過程如下圖。

    我們定義池化窗口的大小為sizeX,即下圖中紅色正方形的邊長,定義兩個相鄰池化窗口的水平位移/豎直位移為stride。一般池化由於每一池化窗口都是不重復的,所以sizeX=stride。


    這里寫圖片描述

     

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

  • 重疊池化(OverlappingPooling
    重疊池化正如其名字所說的,相鄰池化窗口之間會有重疊區域,此時sizeX>stride。
    論文中Krizhevsky, I. Sutskever, andG. Hinton, “Imagenet classification with deep convolutional neural networks,”in NIPS,2012.中,作者使用了重疊池化,其他的設置都不變的情況下, top-1和top-5 的錯誤率分別減少了0.4% 和0.3%。

  • 空金字塔池化(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分類器)。

總的一個結構大致如下:
這里寫圖片描述

展開閱讀全文
 

 

 
還能輸入1000個字符
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM