1. 程式人生 > >吳恩達deeplearning之CNN—卷積神經網路入門

吳恩達deeplearning之CNN—卷積神經網路入門

1.邊界檢測示例

假如你有一張如下的影象,你想讓計算機搞清楚影象上有什麼物體,你可以做的事情是檢測影象的垂直邊緣和水平邊緣。 

这里写图片描述如下是一個6*6的灰度影象,構造一個3*3的矩陣,在卷積神經網路中通常稱之為filter,對這個6*6的影象進行卷積運算,以左上角的-5計算為例 
3*1+0*0+1*-1+1*1+5*0+8*-1+2*1+7*0+2*-1 = -5 
其它的以此類推,讓過濾器在影象上逐步滑動,對整個影象進行卷積計算得到一幅4*4的影象。 

这里写图片描述

為什麼這種卷積計算可以得到影象的邊緣,下圖0表示影象暗色區域,10為影象比較亮的區域,同樣用一個3*3過濾器,對影象進行卷積,得到的影象中間亮,兩邊暗,亮色區域就對應影象邊緣。 

这里写图片描述

通過以下的水平過濾器和垂直過濾器,可以實現影象水平和垂直邊緣檢測。 

这里写图片描述

以下列出了一些常用的過濾器,對於不同的過濾器也有著不同的爭論,在卷積神經網路中把這些過濾器當成我們要學習的引數,卷積神經網路訓練的目標就是去理解過濾器的引數。 

这里写图片描述


2. padding

在上部分中,通過一個3*3的過濾器來對6*6的影象進行卷積,得到了一幅4*4的影象,假設輸出影象大小為n*n與過濾器大小為f*f,輸出影象大小則為(n−f+1)∗(n−f+1)(n−f+1)∗(n−f+1)。 
這樣做卷積運算的缺點是,卷積影象的大小會不斷縮小,另外影象的左上角的元素只被一個輸出所使用,所以在影象邊緣的畫素在輸出中採用較少,也就意味著你丟掉了很多影象邊緣的資訊,為了解決這兩個問題,就引入了padding操作,也就是在影象卷積操作之前,沿著影象邊緣用0進行影象填充。對於3*3的過濾器,我們填充寬度為1時,就可以保證輸出影象和輸入影象一樣大。 

这里写图片描述

padding的兩種模式: 
Valid:no padding 
輸入影象n*n,過濾器f*f,輸出影象大小為:(n−f+1)∗(n−f+1)(n−f+1)∗(n−f+1) 
Same:輸出影象和輸入影象一樣大

3.卷積步長

卷積步長是指過濾器在影象上滑動的距離,前兩部分步長都預設為1,如果卷積步長為2,卷積運算過程為: 

这里写图片描述

加入stride後卷積影象大小的通用計算公式為: 
輸入影象:n*n,過濾器:f*f步長:s,padding:p 
輸出影象大小為:⌊(n+2p−fs+1))⌋∗⌊(n+2p−fs+1)⌋⌊(n+2p−fs+1))⌋∗⌊(n+2p−fs+1)⌋,⌊⌋表示向下取整

以輸入影象7*7,過濾器3*3,步長為2,padding模式為valid為例輸出影象大小為:

⌊(7+2∗0−32+1)⌋∗⌊7+2∗0−32+1)⌋=3∗3⌊(7+2∗0−32+1)⌋∗⌊7+2∗0−32+1)⌋=3∗3

4.彩色影象的卷積

以上講述的卷積都是灰度影象的,如果想要在RGB影象上進行卷積,過濾器的大小不在是3*3而是有3*3*3,最後的3對應為通道數(channels),卷積生成影象中每個畫素值為3*3*3過濾器對應位置和影象對應位置相乘累加,過濾器依次在RGB影象上滑動,最終生成影象大小為4*4。 

这里写图片描述

另外一個問題是,如果我們在不僅僅在影象總檢測一種型別的特徵,而是要同時檢測垂直邊緣、水平邊緣、45度邊緣等等,也就是多個過濾器的問題。如果有兩個過濾器,最終生成影象為4*4*2的立方體,這裡的2來源於我們採用了兩個過濾器。如果有10個過濾器那麼輸出影象就是4*4*10的立方體。 

这里写图片描述


5.單層卷積網路

通過上一節的講述,影象通過兩個過濾器得到了兩個4*4的矩陣,在兩個矩陣上分別加入偏差b1b1和b2b2,然後對加入偏差的矩陣做非線性的Relu變換,得到一個新的4*4矩陣,這就是單層卷積網路的完整計算過程。用公式表示: 

z[1]=w[1]a[0]+b[1]
a[1]=g(z[1])

其中輸入影象為a[0]a[0],過濾器用w[1]w[1]表示,對影象進行線性變化並加入偏差得到矩陣z[1]z[1],a[1]a[1]是應用Relu啟用後的結果。 

这里写图片描述

  • 如果有10個過濾器引數個數有多少個呢? 

        每個過濾器都有3*3*3+1=28個引數,3*3*3為過濾器大小,1是偏差係數,10個過濾器引數個數就是28*10=280個。不論輸入影象大小引數個數是不會發生改變的。

  • 描述卷積神經網路的一些符號標識: 

这里写图片描述

6.簡單卷積網路示例

这里写图片描述

卷積神經網路層的型別:
卷積層(convolution,conv)
池化層(pooling,pool)
全連線層(Fully connected,FC)


7.池化層

最大池化(Max pooling) 
最大池化思想很簡單,以下圖為例,把4*4的影象分割成4個不同的區域,然後輸出每個區域的最大值,這就是最大池化所做的事情。其實這裡我們選擇了2*2的過濾器,步長為2。在一幅真正的影象中提取最大值可能意味著提取了某些特定特徵,比如垂直邊緣、一隻眼睛等等。 

这里写图片描述

以下是一個過濾器大小為3*3,步長為1的池化過程,具體計算和上面相同,最大池化中輸出影象的大小計算方式和卷積網路中計算方法一致,如果有多個通道需要做池化操作,那麼就分通道計算池化操作。 

这里写图片描述

平均池化和最大池化唯一的不同是,它計算的是區域內的平均值而最大池化計算的是最大值。在日常應用使用最多的還是最大池化。 

这里写图片描述

池化的超引數:步長、過濾器大小、池化型別最大池化or平均池化

8.卷積神經網路示例

以下是一個完整的卷積神經網路,用於手寫字識別,這並不是一個LeNet-5網路,但是設計令該來自於LeNet-5。 

網路各層引數個數表: 

这里写图片描述