乾貨_(DL_2)卷積神經網路

碼字不易,歡迎給個贊!

歡迎交流與轉載,文章會同步發布在公眾號:機器學習演算法工程師(Jeemy110)


文章翻譯來自:

Leonardo Araujo dos Santos?

leonardoaraujosantos.gitbooks.io圖標

譯者:石文華

前 言

卷積神經網路由很多層組成,利用過濾器(卷積核)從輸入中獲取有用的信息,這些卷積核的參數通過「學習」自動的進行調整,使其為沒有進行過手工特徵提取的任務提取最有用的信息。卷積神經網路更適合圖像任務,而全連接神經網路並不很適合圖像分類問題。本文繼承上次推文《深度學習以及卷積基礎》。

與全連接神經網路的對比

在全連接網路中,我們需要將圖像轉化為一個一維的向量[1,(width.height.channels)],然後將數據送入一個全連接的隱藏層,如下圖的1000*1000圖片,輸入到100萬個節點的隱藏層,這樣一個隱藏層就會產生1012個參數,而如果使用10*10的卷積核做卷積,這個卷積層才1億個參數。

常見的構建模式

通常[CONV-> ReLU-> Pool-> CONV-> ReLU-> Pool-> FC-> Softmax_loss(在訓練期間)]這樣的模式相當普遍。

卷積層

卷積神經網路中最重要的操作是對輸入做卷積,如果我們將該一個32x32x3圖像與5x5x3進行卷積(卷積核深度必須與輸入的深度相同),步長為1,則輸出的特徵圖的維度是28x28x1。

過濾器的作用相當於對圖片進行特徵提取,並且一個過濾器在一個輸入上只會產生一個特徵圖。

如果我們希望我們的卷積層尋找6個不同的特徵圖。在這種情況下,我們需要6個5x5x3過濾器。每一個過濾器都會對輸入圖片進行特徵提取。

卷積本身是一種線性操作,如果我們不想受到線性分類問題的困擾,那麼我們需要在卷積做完之後添加一個非線性層(通常是Relu)。

使用卷積作為模式匹配的另外一個原因是圖像上搜索的目標跟位置是不相關的。在卷積神經網路中,模型將在訓練期間對目標所在的確切位置學習它的特徵。

超參數

卷積層的超參數有:

卷積核的大小(K):小的更好(如果是在第一層,需要消耗大量的內存)

步長(S):卷積核窗口將滑動多少個像素(通常為1,在pooling層通常為2)

零填充(pad):在圖片邊緣填充0,使得輸出跟輸入的大小一致(F = 1,PAD = 0; F = 3,PAD = 1; F = 5,PAD = 2; F = 7,PAD = 3)

過濾器數量(F):也就是希望輸出多少個特徵圖。

輸出的特徵圖的大小

通常情況下,卷積之後的輸出是小於輸入的,但是我們可以使用0填充使得輸出跟輸入大小一致。不使用全零填充情況下計算輸出特徵圖的大小,我們可以使用下列公式:

Out(length)=[in(length)-filter(length)+1]/stride(length)

Out(width)=[in(width)-filter(width)+1]/stride(width)

卷積操作

接下來的幾個例子,我們通過改變一些超參數來看看卷積操作的效果。

padding為0,步長為1.

輸入為4*4的矩陣,卷積核為3*3,padding為0,步長為1,如下圖:

padding為1,步長為1.

輸入為5*5的矩陣,卷積核為3*3,padding為1,步長為1,在某些庫中,會有參數「same」使得輸出矩陣的維度跟輸入是一樣的。

參數的數量(權重)

我們用一個簡單的例子舉例說明如何計算一個卷積層的參數的數量,輸入圖片為32*32*3,也就是32*32大小的RGB彩色圖,卷積核大小為(5*5),步長為1,padding為2,卷積核數量為10(也就是深度為10),參數的數量為:

(5*5*3+1)*10=760,也就是說參數的數量只與卷積核的大小,輸入圖片的深度以及卷積核的數量有關,其中+1是偏置項,你也可以省略+1,因為偏置項可以設為0。

特徵圖占的內存

如何計算卷積圖層輸出所需的內存量呢?假設我們的輸入為32x32x3,3表示RGB三個通道。卷積層的配置為:Kernel(F):5x5,Stride:1,Pad:2,numFilters:10,因為我們使用了填充,所以輸出將是32x32x10,最終得到特徵圖所佔的內存大小為:32*32*10=10240位元組。內存量基本上只是輸出量張量的乘積。

1*1卷積核

這種類型的卷積通常適用於深度,合併它們的時候,並不影響空間信息。

代替大卷積

這裡我們解釋一下級聯幾個小卷積的效果,如下圖所示,兩次3*3的卷積效果相當於一次5*5卷積之後的效果,也就是說級聯可以使感受野變大。

現在更多的是趨向於使用小的卷積核,例如7*7的卷積核你可以使用三個3*3深度相同的卷積核來替換,但是不要在第一層替換,因為深度不匹配,所以無法在第一層替換(除非你第一層只有3個卷積核)

在上圖中,我們用3個3x3的卷積核代替一個7x7的卷積核,每個卷積核中間我們有Relu層進行非線性化。此外,越到後面我們擁有更少的權重以及乘加操作,因此計算速度會更快。

計算替換的7*7卷積

輸入矩陣為W*H*C的矩陣上使用C個7*7的卷積核,我們可以計算出參數的數量為:7*7*C*C,如果我們使用3個3*3的過濾器代替7*7的話參數的數量為:3*3*3*C*C,可以看出我們將會有更少的參數,由於卷積層之間還要進行非線性的relu操作,所以我們的非線性程度更大。更少的參數和更大程度的非線性操作將使得模型會更優。

在第一層進行替換

如前所述,我們一般不會在第一層用小的卷積代替大的卷積,因為第一層使用小卷積的話得到的特徵圖所佔的內存是遠比大卷積得到的特徵圖的內存要大很多的,有興趣的話可以計算一下輸入圖片為256*256*3,卷積神經網路的第一層為3x3與64個濾波器,步幅1和深度7x7和步幅2相同的深度的情況進行比較。

瓶頸層來替換3*3

用一種稱為瓶頸的機制來簡化3x3卷積。與正常3×3卷積的效果是相同的,但它具有更少的參數和更多的非線性,觀察下圖用瓶頸層替換3*3的卷積,效果是一樣的,但是參數更少,非線性更顯著。

瓶頸層上使用的參數量計算如下:

計算出了是3.25*C*C,明顯比9*C*C更少。

微軟的殘差網路也是用了這種瓶頸層,如下圖所示殘差網路。

另外一種替換3*3使得參數更少的結構是先使用1*3*C再使用3*1*C,googlenet的 inception層上使用了這種方式。

FC -> Conv

可以將全連接層轉換為卷積層,反之亦然,但我們對FC-> Conv轉換更感興趣。這是為了提高性能。

例如,設想輸出K = 4096和輸入7x7x512的FC層,轉換將為:

CONV:卷積核:7x7,pad:0,步幅:1,卷積核數量:4096。

使用2d卷積公式size :

結果是1x1x4096。

通過將FC層轉換為卷積的好處:

性能:由於權重共享,計算速度更快

你可以使用比你訓練的圖像更大的圖像,但不會改變任何內容

你將能夠在同一圖像上檢測到2個對象(如果使用更大的圖像),則最終輸出將大於單行矢量的輸出。

計算感受野

感受野是一個特定的卷積窗口,表示「看到」它輸入的張量。

有時候,確切地知道每個單元格從輸入圖像上「看到」多少,這對於物體檢測系統是特別重要的,因為我們需要以某種方式將某些激活圖尺寸匹配回原始圖像的尺寸(Label圖片)。

Rk:當前層k的接受野

Kernel:當前圖層k的內核大小

s:步長

指每一層都輸出直到第k-1層(所有以前的層,而不是當前層)

需要注意的一點是:

對於第一層,接受野是內核大小。

這些計算與圖層類型(CONV,POOL)無關,例如,步長為2的CONV將與步長為2的POOL具有相同的感受野。

例:

輸入為14x14x3的圖像:

CONV:S:1,P:0,K:3

CONV:S:1,P:0,K:3

MaxPool:S:2,P:0,K2

CONV:S:1,P:0,K:3

參考文獻:

yann.lecun.com/exdb/pub cs231n.github.io/convol youtube.com/watch? youtube.com/watch? youtube.com/watch? facebook.com/yann.lecun neuralnetworksanddeeplearning.com ujjwalkarn.me/2016/08/1 shawnleezx.github.io/bl guillaumebrg.wordpress.com


碼字不易,歡迎給個贊!

歡迎交流與轉載,文章會同步發布在公眾號:機器學習演算法工程師(Jeemy110)


推薦閱讀:

TAG:深度學習DeepLearning | 計算機視覺 | 卷積神經網路CNN |