1、卷積計算
卷積運算實現垂直邊緣檢測
過濾器檢測不同方向的邊緣
Padding
輸入圖片維度信息是[6,6],卷積核尺寸[3,3],padding=1,步長stride=1,經過卷積運算之後輸出圖片維度信息也是[(6+2x1-3+1),(6+2x1-3+1)],這樣也就保持維度信息的一致性,不致於特徵信息丟失。
計算公式:n = (n-f+2p)/s+1 ,n是指輸入/輸出維度信息,f是卷積核或過濾器,p是0元素填充個數,s是卷積核的步長。
如果兩邊n的維度信息都一樣,且默認s = 1的情況下,就可以求出p = (f-1)/2,所以當f是一個奇數的時候,p的範圍[0,1,2,3,4,…, (f-1)/2],只要選擇相應的填充尺寸,就能保證得到輸入相同尺寸的和輸出。當卷積核5x5,使得輸入和輸出的維度信息都一樣,就要保證f=5對應的p=2,一般情況下卷積核尺寸都是奇數,很少看到一個偶數的卷積核,爲了保證輸入維度信息周邊都能均勻地填充0元素,我推薦你只用奇數的卷積核。在數字圖像處理課程中是這樣的,當你用卷積核與圖像進行卷積時,是對應點相乘相加,最後輸出在中心點的位置,如果是奇數,就剛好有中心點,偶數就沒有了。
至於選擇填充多少像素,通常有兩個選擇,分別叫做Valid卷積和Same卷積。
Valid
意味着padding的0元素填充個數爲0,卷積運算輸出維度信息:[n-f+1,n-f+1]
Same
意味着你填充padding之後,你的輸入大小和輸出大小是一樣的。根據這個公式,當你填充p個像素點,原來輸入的維度信息經過卷積運算之後得到新輸出的維度信息[n+2p-f+1,n+2p-f+1]
卷積步長
input:7,f:3,s:2,output:3
代入式子output = (input-f+2p)/s+1,從而得到padding = 0
還有一個細節需要注意,如果輸出的維度信息不是一個整數怎麼辦?這種情況下要向下取整。output = floor[(input-f+2p)/s+1]
2、卷積爲何有效
RGB圖片的卷積
圖像的通道數也要與過濾器的通道數保持一致。
單過濾器
過濾器有三個通道,共有3x3x3=27個元素需要與待卷積圖像對應點相乘相加,最後輸出在中心點的位置。當padding=0,output = n-f+1 = 6-3+1=4
多過濾器
3、單層卷積網絡
假設在一個神經網絡的某一層有10個3x3x3尺寸的過濾器,那麼這一層總共有多少參數呢?
parameters : (3 * 3 * 3 + bias) * 10 = (27 + 1) * 10 = 280
請注意一點,無論你輸入的圖片尺寸有多大,用這10個過濾器來提取特徵,參數始終都是280個。即使圖片尺寸很大,參數卻很少。這就是卷積神經網絡的一個特徵——避免過擬合。
符號摘要
If layer is convolution layer:
通常情況下,上標 用來標記第層
= filter size 第 層中過濾器的尺寸大小爲 x
= padding 標記padding的數量,也可以指定Valid(無padding)或Same(有padding,輸出和輸入圖片的高度和寬度就相同了)
= stride 標記步長
Input: x x
x 代表第層輸入某個維度的數據,通道數量
Output:第 層的圖片大小爲 x x ,第 層的輸入就是上一層的輸出,神經網絡中這一層的輸出圖像大小爲 x x
:channel在學術上既可表達通道也可以是深度,輸出圖片也具有深度,輸出圖像中的通道數量等於神經網絡中該層所使用過濾器的數量。
每一個過濾器尺寸大小: x x ,過濾器的通道數量必須與輸入數據的通道數量一致。 = 這樣輸出通道數量就是輸入通道數量
計算輸出圖像高度或寬度公式:,,向下取整。
Activations:應用偏差和非線性函數之後,這一層的輸出等於它的激活值,是一個三維體,即 x x ,當你執行批量梯度下降或小批量梯度下降時,如果有m個例子就有m個激活值的集合,那麼輸出的 = x x x
變量排列順序:首先是索引和訓練樣本,其次是高度,寬度,通道數。
Weights:權重參數,怎樣確定權重參數的數量?已知 x x 代表一個過濾器的元素數量,而權重數量是所有過濾器的集合再乘以每個過濾器的元素數量, 就是層 過濾器的個數,故Weights = x x +
Bias:每個過濾器都有一個偏置參數,它是一個實數,可用代表偏置,它是該維度上的一個向量(線代中默認向量爲列向量),偏置在代碼中表示爲一個1 x 1 x 1 x 的四維向量或四維張量。
— (1,1,1,)
在線上搜索或學習開源代碼,關於高度、寬度和通道的順序並沒有完全統一的標準卷積,所以在查看GitHub上的源代碼或閱讀一些開源實現的時候,你會發現有些作者會採用把通道放在首位的編碼標準。很遺憾!這只是一部分標記法,因爲深度學習的相關文獻並未對標記達成一致。
4、簡單卷積網絡示例
Convolution(Conv)
Polling(Pool)
Fully connected(FC)
雖然僅用卷積層也有可能構建出很好的神經網絡,但是在部分神經網絡架構師依然會添加池化層和全連接層。
5、池化層
Max pooling
Average pooling
Summary of pooling
6、卷積神經網絡示例
下面我們來看一個例子,假設有一張大小爲32x32x3的輸入圖片, 這是一張RGB模式的圖片,你想做手寫體數字識別,32x32的RGB圖片中含有某個數字,比如“7”。你想識別它是屬於10個數字(0~9)中的哪一個。現在我們基於這個簡單任務構建一個神經網絡來實現這個功能。我使用這個網絡模型和經典網絡LeNet-5非常相似,靈感也來源於此。現在我所採用的模型並不是LeNet-5,但是受它啓發,許多參數選擇都與LeNet-5相似。
輸入一個32x32x3的矩陣,假設第一層使用的過濾器(f)大小爲5x5,步幅(s)是1,padding是0,過濾器個數是6
那麼輸出爲28x28x6,將這層標記爲CONV1,該層用了6個過濾器,增加了偏差,應用了非線性函數(ReLu),最後輸出CONV1的結果。
將CONV1 輸出的28x28x6 作爲輸入,輸入到池化層。
現在開始構建池化層(最大池化),該層超參數f=2,s=2,padding=0,maxpool使用的過濾器(f)爲2x2,步幅(s)爲2,padding爲0,表示該層的高度和寬度會減少一半。因此28x28變成了14x14,其中信道數量保持不變,所以最終輸出爲14x14x6,將該輸出標記爲POOL1。
在卷積網絡文獻中,卷積有兩種分類,這與所謂層的劃分存在一致性,A類卷積是一個卷積層和一個池化層一起作爲一層,這就是神經網絡的Layer1層
另一類卷積是把卷積層單獨作爲一層,而池化層單獨作爲一層,人們在計算神經網絡有多少層時,通常只是統計具有權重和參數的層,因爲池化層沒有權重和參數,只有一些超級參數,所以剛纔我們把CONV1和POOL1共同作爲一個卷積並標記爲Layer1。雖然你在閱讀網絡文章或研究報告時,可能會看到卷積層和池化層各爲一層的情況,這只是兩種不同的標記術語。一般我在統計網絡層數時,只計算具有權重的層,也就是把CONV1和POOL1作爲Layer1。這裏我們用CONV1和POOL1來標記,兩者都是神經網絡Layer1的一部分。POOL1也被劃分在Layer1中,因爲它沒有權重,得到的輸出是14x14x6。
把上一層輸出的14x14x6作爲輸入,輸入到下一層的卷積。既是輸入又輸出的層可以看作爲隱含層。新構建的卷積層,過濾器(f)大小爲5x5,步幅(s)爲1,過濾器數量爲10,最後輸出一個10x10x10的矩陣,並標記爲CONV2然後做最大池化,maxpool超參數f=2,s=2,同樣高度和寬度會減半,最後輸出爲5x5x10 ,標記爲POOL2。這就是神經網絡的第二個卷積層,即Layer2。
如果Layer1後面接另一個卷積層,該卷積層超參數f=5x5,s=1,padding=0,過濾器數量爲16,則CONV2輸出爲10x10x16,繼續執行最大池化計算,超參數f=2,s=2,p=0,輸入的寬度和高度會減半的,輸出結果爲5x5x16,信道數量和之前一樣,標記爲POOL2。把這個卷積標記爲Layer2。
5x5x16矩陣包含400個元素,現在將POOL2平整化爲一個大小400的一維向量。把平整化的結果想象成像一個神經元集合。
然後利用這400個單元構建下一層,下一層含有120個單元。這就是我們第一個全連接層,標記爲FC3,這400個單元與120個單元緊密相連,這樣就構成一個標準的神經網絡。
它在120x400的維度上具有一個權重矩陣,這就是所謂的全連接,因爲這400個單元與這120個單元中的每一個單元相連接,還有一個偏差參數,最後輸出維度大小是120,因爲FC3只有120個輸出。
然後我們在FC3層後面再添加一個全連接層,這層更小,假設它含有84個單元,標記爲FC4。最後用這84個單元填充一個softmax單元,如果我們想通過手寫數字識別來識別手寫的0-9數字,那麼這個softmax就會有10個輸出。
此例中的卷積神經網絡很典型,看上去它有很多超級參數,關於如何選定這些參數?常規做法是儘量不要自己設置超級參數,而是查看作者論文或文獻採用了哪些超級參數,選一個在作者任務中效果很好的架構,那麼它也有可能適用於你自己的應用程序。
隨着神經網絡深度的加深,高度和寬度通常都會減少,前面已經提到過,從32x32=>28x28=>14x14=>10x10到5x5,而信道數量會增加,從3=>6=>16不斷增加,然後得到一個全連接層。在神經網絡中,另一種常見模式就是一個或多個卷積層後面跟隨一個池化層,然後一個或多個卷積層後面再跟一個池化層,然後是幾個全連接層,最後是一個softmax,這是神經網絡的另一種常見模式。
下面表格描述神經網絡的激活值形狀、激活值大小和參數數量。
Neural network example
Activation shape | Activation Size | # parameters | |
---|---|---|---|
Input: | (32,32,3) | 3072 | 0 |
CONV1(f=5,s=1) | (28,28,8) | 6272 | 208 |
POOL1 | (14,14,8) | 1568 | 0 |
CONV2(f=5,s=1) | (10,10,16) | 1600 | 416 |
POOL2 | (5,5,16) | 400 | 0 |
FC3 | (120,1) | 120 | 48001 |
FC4 | (84,1) | 84 | 10081 |
Softmax | (10,1) | 10 | 841 |
表格第二行分析:激活值有3072維 = 32 x 32 x 3,輸入層沒有參數。
其它行分析:這些都是網絡中不同層的激活值形狀、激活大小和參數數量。有幾點需要注意。第一,池化層(POOL)沒有參數;第二,卷積層的參數相對較少,其實很多參數都存在於神經網絡的全連接層。從表格觀察中可以發現,隨着神經網絡的不斷加深,激活值會逐漸變小,如果激活值下降太快,也會影響網絡性能。第一層的激活值是6272,第二層激活值1600,慢慢減少到84,最後輸出softmax結果。
至此神經網絡的基本構造模塊基本講完,一個卷積神經網絡包括卷積層、池化層和全連接層。許多計算機視覺研究正在探索,如何把這些基本模塊整合起來構建高效的神經網絡。整合這些基本模塊確實需要深入的理解和感覺,根據我的經驗,找到整合基本構造模塊的感覺,最好的方法就是大量閱讀別人優秀的案例,或許你也可以將別人開發的框架應用於自己的應用程序。
爲什麼使用卷積
我們來分析一下卷積在神經網絡中如此受用的原因,以及如何整合這些卷積,如何通過一個標註過的訓練集訓練卷積神經網絡做一個簡單地概括。
卷積層與全連接層相比,卷積層比全連接層映射的參數要少,主要有兩原因:
(1)參數共享。舉例說明一下,假設有一張32x32x3的緯度圖片,用了6個大小爲5x5的過濾器,輸出維度爲28x28x6。
我們構建一個神經網絡,其中一層含有3072個單元,下一層含有4074個單元,兩層中的每個神經元彼此相連,然後計算權重矩陣,它就等於3072x4704約等於1400萬,所以要訓練的參數很多。雖然以現在的技術我們可以用1400萬個參數來訓練網絡,因爲這張32x32x3的圖片非常小,訓練這麼多參數沒有問題。如果這是一張1000x1000的圖片,權重矩陣會變得非常大。卷積層的參數數量等於每個過濾器尺寸大小乘以過濾器數量,過濾器尺寸大小是5x5,一個過濾器有25個參數,再加上偏差參數,那麼每個過濾器就有26個參數,一共有6個過濾器,所以參數總計156個。
(2)稀疏連接
featuremap綠色圈標記的0元素就是通過3x3的卷積計算得到的,它只依賴於這個3x3的輸入單元格,輸出的featuremap僅與左邊36個輸入特徵中的9個元素相連接,而且其它像素值都不會對輸出產生任何影響,這就是稀疏連接的概念。
卷積神經網絡善於捕捉平移不變的性質,通過觀察可以發現向右移動兩個像素,圖片中的貓依然清晰可見。因爲神經網絡的卷積結構使得即使移動幾個像素,這張圖片依然具有非常相似的特徵,應該屬於同樣的輸出標記。實際上使用同一個過濾器生成各層中圖片的所有像素值,希望網絡通過自動學習變得更加健壯,以便更好地取得所期望的平移不變屬性,這就是卷積或卷積網絡在計算機視覺任務中表現良好的原因。
最後,我們把這些層整合起來,觀察如何訓練這些網絡。比如我們要構建一個貓咪檢測器,有下面這些標記訓練集,表示一張圖片,是二進制標記或某個重要標記。我們選定了一個卷積神經網絡,輸入圖片,增加捲積層和池化層,然後添加全連接層,最後輸出一個softmax,即。卷積層和全連接層有不同的參數和偏差,我們可以用任何參數集合來定義代價函數
隨機初始化函數參數和,等於神經網絡對整個訓練集的平均預測損失總和,所以訓練神經網絡就要使用梯度下降法,或含有動量、RMSProp及其它因子的梯度下降來優化神經網絡的所有參數,以減少代價函數的值。
通過上述操作你可以構建一個高效的貓咪檢測器或其它檢測器。你也可以嘗試去判斷哪些網絡架構類型效率更高,人們通常的做法是將別人發現和發表在研究報告上的架構應用於自己的應用程序。
參考
[1]深度學習的局部響應歸一化LRN理解
[2]卷積神經網絡之AlexNet
[3]https://blog.csdn.net/program_developer/article/details/89462239
[4]https://www.deeplearning.ai