卷積神經網絡——卷積神經網絡
一、計算機視覺
1.計算機視覺的具體應用:圖像識别、目标檢測、圖檔風格轉換。在應用計算機視覺時要面臨一個挑戰:資料輸入大。例如:一張畫質為1000*1000*3的圖檔,其所建構的神經網絡中輸入特征将是300W,這将消耗巨大的記憶體,是以要處理這樣龐大的神經網絡,必須使用卷積技術來建構神經網絡。
二、邊緣檢測
1卷積計算:卷積計算作為卷積神經網絡的基礎,其最基本的運用是在邊緣檢測中,我們來看看這個卷積過程是如何實作的。
假設左側6X6的矩陣是圖檔A,中間的3X3矩陣是卷積計算中的一個重要概念稱為過濾器(filter)也稱“核”,經過卷積運算後圖檔A轉化成右側4X4矩陣假設其為圖檔B,這個過程中卷積計算的重要作用是将較大圖檔A轉化為較小圖檔B。卷積計算的具體過程如圖中綠色字型所示,将過濾器中的元素逐一和圖檔A最左上角的一個3X3矩陣運算得到圖檔B第一個值,依次類推。
2.為什麼卷積計算可以進行垂直邊界檢測
我們知道圖像是有RGB值組成,值得大小決定了顔色的深淺,是以,我們可以将上圖中的三個矩陣轉化成具有色彩的圖檔進行說明這個邊界檢測的實作過程,如下圖。
三、邊緣檢測(續)
1.從上節可以使用過濾器(vertical)可以進行垂直邊緣檢測,那麼我們可以推出使用過濾器(horizontal)可以進行水準邊緣檢測,兩種過濾器(核)見下圖
2.常見的過濾器(核)形式:sobel filter,scharr filter,如下圖
當然我們可以将過濾器中的9個數字當做九個參數[w1,w2,...,w9],然後神經網絡的反向傳播來去學習得到這九個參數,這樣一來就可以進行各種角度的邊緣檢測,這種思路已經成為計算機視覺領域的主流方法。
四、padding
1.padding:卷積的基本操作,卷積的缺點(1)每次卷積操作圖像會縮小;(2)邊角處的像素點或者邊緣像素點會被較少使用,這意味着會丢失邊緣資訊。是以為了解決這兩個問題,在卷積之前要進行填充(padding),比如一個6X6的圖像在padding之後變成8X8的圖像,經過3X3的卷積,得到了6X6的圖像,這樣圖像大小沒有縮小,邊緣像素點也沒有丢失。
通常padding的填充值為0,填充層數P=1.
2.填充像素的選擇:valid 和same卷積
(1)valid 卷積:不需padding
(2)same卷積:使卷積後的輸出與輸入圖像大小相同,此時通過選擇過濾器的大小(即fxf的值)可以保證輸出與輸入大小相同:p = ( f - 1) / 2.在計算機視覺中f通常為奇數。
3.我們在确定p的取值時有三種方式:(1)給定p值;(2)使用valid卷積,則p=0;(3)使用same卷積,則p值為(f-1)/2
五、卷積步長(stride)
1.如果在卷積操作中設定步長s,則輸出矩陣大小為 [(n +2*p -f)/ s ] +1,如果不能整除,則進行floor操作(向下取整)
2.在深度學習中的卷積操作其實和數學定義中的有所差別,應稱互相關而非卷積,但由于習慣還是稱之為卷積。數學定義中在做乘積前需要對過濾器進行翻窗,見下圖。
六、立體空間的卷積操作
1.對RGB圖像的卷積操作,圖像的三個次元分别是(高,寬,通道數(深度)),此時圖像和過濾器的通道數需要保持一緻。
2.多過濾器的卷積操作
七、如何建構CNN的卷積層——單層卷積網絡
1.在上一節中我們了解到一個6x6x3的輸入圖像經過卷積操作後變成4x4x2的輸出,如果把這個過程嵌入到神經網絡,其類似于前向傳播的過程,即Z[1] = W[1] x a[0] + b[1],其中a[0] = X,代表6x6x3的輸入圖像。
2.避免過拟合(less prone to over-fitting):在cnn中,不論輸入的圖像有多大,1000x1000或者2000x2000,某層卷積的參數始終不變,使用過濾器來提取如垂直邊緣、水準邊緣或者其他特征時,即使圖檔很大,但參數很少,這種特性稱為“避免過拟合”
3.卷積層的标記
八、深度卷積神經網絡示例
1.建構一個簡單的深層CNN網絡,各卷積層參數如下圖所示。從圖中可見超參數很多,是以在建構CNN時參數的選擇是很重要的一個問題。在CNN中随着層數的深入,圖像的次元會逐漸減小(如:39-37-17-7),但是信道數量逐層增加(3-10-20-40)
2.一個典型的卷積網絡通常包括3層:卷積層、池化層、全連接配接層。
九、池化層
1.池化層的作用:縮減模型的大小,提高計算速度,同時可提高所提取特征的魯棒性。
2.max-pooling:比較常用的池化類型,實作的過程見下圖。其功能是隻要在任何一個象限内提取到某一個特征值,就把它保留在最大池化輸出裡,最大化運算的實際作用(直覺了解):如果在過濾器中提取到某個特征,那麼保留其最大值;如果沒有提取到這個特征,(可能在該象限裡不存在這個特征,那其最大值也很小)。
通常池化過程中需要設定的兩個參數:f 和 s,一旦f 和 s确定了,之後再不需反向傳播學習什麼參數。在此案例中,f=2, s=1。下面我們來看一個更複雜的案例。
3. Average Pooling:平均值池化(不常用)
該方法中f = 2,s = 2,通常最大池化操作比平均池化應用的更多,但是在非常深層CNN中使用平均池化。
4.總結:
(1)在最大池化操作時通常不使用padding
(2)最大池化的輸入:n_H, n_W, n_c 輸出為:math.floor( (n_H - f) / s +1 ), math.floor( (n_W - f) / s +1 ), n_c
(3)在反向傳播是沒有需要學習的參數
(4)最大池化隻是計算神經網絡某一層的靜态屬性。
十、CNN示例
1.示例(類似LeNet-5):
中間層的定義,在CNN中有的文獻将卷積層和pooling層合起來稱為一層;有的文獻将二者分開各稱一層。我們知道在神經網絡劃分層時通常是按照權重來劃分的,按照這個邏輯由于pooling層沒有權重,是以應将卷積層和pooling層合起來稱為一層。
2.超參數的選擇有個小技巧:多參閱文獻和資料,看看别人在取得較好效果時是如何選取的超參數,或者直接使用該架構,盡量不要全部通過反向出傳播學習。
3.随着神經網絡的加深,激活層size逐漸下降,但是下降得太快也會影響網絡性能。
十一、為什麼使用卷積
1.卷積或卷積網絡在計算機視覺中表現良好的原因:與隻用全連接配接層相比,卷積有兩個優勢:參數共享和稀疏連接配接,由于這兩種特性的存在還可以防止神經網絡發生過拟合。
2.卷積神經網絡善于捕捉平移不變。通過觀察可以發現,向右平移兩個像素圖檔中的圖像(比如貓)仍然清晰可見,這正是因為神經網絡的卷積結構即使移動幾個像素,圖檔依然具有非常相似的特性,應該屬于同樣的輸出标記。實際上我們用一個過濾器生成各層中圖檔的所有像素值,希望網絡通過自動學習變得更加強壯,以便取得更好的平移不變屬性。