1、邊緣檢測示例(Edge Detection Example)
卷積運算(convolutional operation)是卷積神經網路最基本的組成部分,使用邊緣檢測(edge detection)作為入門樣例。接下來,你會看到卷積是如何進行運算的。
在之前的人臉例子中,我們知道神經網路的前幾層是如何檢測邊緣的,然後,後面的層有可能檢測到物體的部分割槽域,更靠後的一些層可能檢測到完整的物體。圖片下方給了這樣一張圖片,讓電腦去搞清楚這張照片裡有什麼物體,你可能做的第一件事是檢測圖片中的垂直邊緣(vertical edges)和水平邊緣(horizontal edges)。所以如何在影像中檢測這些邊緣?
這是一個6×6的灰度影像(grayscale image)。因為是灰度影像,所以它是6×6×1的矩陣,為了檢測影像中的垂直邊緣,需要構造一個3×3矩陣。在共用習慣中,在卷積神經網路的術語中,它被稱為過濾器(filter),也被稱為核(kernel)。對這個6×6的影像進行卷積運算,卷積運算用星號“*”(在不同語言和框架中表示方法不一致)來表示,用3×3的過濾器對其進行卷積。
在過濾器覆蓋的區域執行:每個元素對應相乘再求和,這個卷積運算的輸出將會是一個4×4的矩陣,這個就是垂直邊緣檢測器。在圖二中這個6×6影像的中間部分,明亮的畫素在左邊,深色的畫素在右邊,就被視為一個垂直邊緣,卷積運算提供了一個方便的方法來發現影像中的垂直邊緣。
2、更多邊緣檢測內容
如何區分正邊和負邊,這實際就是由亮到暗(light to dark)與由暗到亮(dark to light)的區別,也就是邊緣的過渡(edge transitions)。
這張6×6的圖片,左邊較亮,而右邊較暗,將它與垂直邊緣檢測濾波器進行卷積,檢測結果就顯示在了右邊這幅圖的中間部分。現在將圖片進行翻轉,變成了左邊比較暗,右邊比較亮。從結果可以看到這個過濾器確實可以區分這兩種明暗變化的區別。
總而言之,對於這個3×3的過濾器(左邊)來說,這是其中的一種數字組合。也可以使用Sobel過濾器(中間),它的優點在於增加了中間一行元素的權重,這使得結果的魯棒性會更高一些。或者Scharr過濾器(右邊),它有著和之前完全不同的特性,實際上也是一種垂直邊緣檢測。
隨著深度學習的發展,我們學習的其中一件事就是當你真正想去檢測出複雜影像的邊緣,你不一定要去使用那些研究者們所選擇的這九個數字,但你可以從中獲益匪淺。把這矩陣中的9個數字當成9個引數,並且在之後你可以學習使用反向傳播演算法,其目標就是去理解這9個引數。
3、Padding
為了構建深度神經網路,你需要學會使用的一個基本的卷積操作就是padding,下面來看看它是如何工作的。
你用一個3×3的過濾器卷積一個6×6的影像,你最後會得到一個4×4的輸出,也就是一個4×4矩陣。這背後的數學解釋是,如果我們有一個n×n的影像,用f×f的過濾器做卷積,那麼輸出的維度就是(n - f + 1) × (n - f + 1)。
這樣的話會有兩個缺點,第一個缺點是每次做卷積操作,你的影像就會縮小。第二個缺點是那些在角落或者邊緣區域的畫素點在輸出中採用較少,意味著你丟掉了影像邊緣位置的許多資訊。為了解決這兩個問題,你可以在卷積操作之前填充這幅影像。在這個案例中,你可以沿著影像邊緣再填充一層畫素。如果你這樣操作了,那麼6×6的影像就被你填充成了一個8×8的影像。
習慣上,你可以用0填充,如果p表示填充的數量,在這個例子中,p=1,因為在周圍都填充了一個畫素點。輸出維度變成了(一般向下取整):(n + 2p - f + 1) × (n + 2p - f + 1)。這樣一來,丟失資訊或者更準確來說角落或影像邊緣的資訊發揮的作用較小的這一缺點就被削弱了。
如果你想的話,也可以填充兩個畫素點。至於選擇填充多少畫素,通常有兩個選擇,分別叫做Valid卷積(不填充)和Same卷積(填充後影像大小不變)。Same卷積中P是透過n+2p-f+1=n求解,p = (f - 1)/2。習慣上,計算機視覺中,f通常是奇數,甚至可能都是這樣。
4、卷積步長(Strided Convolutions)
卷積中的步長(strided convolutions)是另一個構建卷積神經網路的基本操作,看下面一個例子。
如果你想用3×3的過濾器卷積這個7×7的影像,和之前不同的是,我們把步幅設定成了2。注意一下左上角,這個點移動到其後兩格的點,跳過了一個位置。然後你還是將每個元素相乘並求和,你將會得到的結果是100。如果你使用一個f x f的過濾器卷積一個n x n的影像,padding為p,步幅為s,這樣輸出的大小變為:。
需要注意:如果商不是一個整數,則向下取整。這個原則實現的方式是,你只在藍框完全包括在影像或填充完的影像內部時,才對它進行運算。
5、三維卷積(Convolutions Over Volume)
現在看看如何執行卷積不僅僅在二維(2D)影像上,而是三維立體(three dimensional volumes)上。
假如說你不僅想檢測灰度影像的特徵,也想檢測RGB彩色影像(紅、綠、藍)的特徵。彩色影像如果是6×6×3,這裡的3指的是三個顏色通道(可以想象成三個6×6影像的堆疊)。為了檢測影像的邊緣或者其他的特徵,這裡跟一個三維的過濾器,它的維度是3×3×3,這樣這個過濾器也有三層,對應紅綠、藍三個通道。
注意這些名字,第一個6代表影像高度(height),第二個6代表寬度(width),這個3代表通道的數目(channels)。同樣過濾器(filter)也有高,寬和通道數,並且影像的通道數必須和過濾器的通道數相同。
為了計算上圖中卷積操作的輸出,你要做的就是把這個3×3×3的過濾器先放到最左上角的位置(upper left most position),這個3×3×3的過濾器有27個數,27個引數就是3的立方。依次取這27個數,然後乘以相應的紅綠藍通道中的數字。先取紅色通道的前9個數字,然後是綠色通道,然後再是藍色通道,乘以左邊黃色立方體覆蓋的對應的27個數,然後把這些數都加起來,就得到了輸出的第一個數字。
當不僅僅想要檢測垂直邊緣時,也即想同時用多個過濾器時,如上圖所示(第一個黃色表示)這可能是一個垂直邊界檢測器或者是學習檢測其他的特徵。第二個過濾器橘色表示,它可以是一個水平邊緣檢測器。這樣的輸出是一個4×4×2的立方體,這裡的2的來源於用了兩個不同的過濾器。
6、單層卷積網路(One Layer of a Convolutional Network)
如何構建卷積神經網路的卷積層(convolutional layer),看一個例子。
假設使用第一個過濾器進行卷積,得到第一個4×4矩陣,形成一個卷積神經網路層,然後增加偏差(bias),它是一個實數(real number),透過Python的廣播機制給這16個元素都加上同一偏差。然後應用非線性函式,它是一個非線性啟用函式ReLU,輸出結果是一個4×4矩陣。對另一個矩陣重複上述操作,把這兩個矩陣堆疊起來,最終得到一個4×4×2的矩陣。我們透過計算,從6×6×3的輸入推匯出一個4×4×2矩陣,它是卷積神經網路的一層,把它對映到標準神經網路中四個卷積層中的某一層或者一個非卷積神經網路中。
最後總結一下,用於描述卷積神經網路的一層,例如l層的各種標記。
輸出影像中的通道數量就是神經網路中這一層所使用的過濾器的數量。因此,輸出通道數量就是輸入通道數量,所以過濾器維度為:
採用批次梯度下降(batch gradient descent),變數的排列順序如下:首先是索引(index)和訓練示例(training examples),然後是其它三個變數。該如何確定權重引數(weights parameters),即引數W呢?權重也就是所有過濾器的集合再乘以過濾器的總數量,即
最後我們看看偏差引數(bias parameters),每個過濾器都有一個偏差引數,它是一個實數。偏差包含了這些變數,它是該維度上的一個向量。後續為了方便,偏差表示為一個的四維矩陣或四維張量,即
注意:線上搜尋或檢視開原始碼時,關於高度,寬度和通道的順序並沒有完全統一的標準卷積,有些作者會採用把通道放在首位的編碼標準。實際上在某些架構中,當會有一個變數或引數來標識計算通道數量和通道損失數量的先後順序。
7、簡單卷積網路示例
在上圖中,一個卷積網路通常有三層,一個是卷積層(convolution layer),我們常常用Conv來標註。一個是池化層(pooling layer),我們稱之為POOL。最後一個是全連線層(fully connected layer),用FC表示。
8、池化層(Pooling Layers)
除了卷積層,卷積網路也經常使用池化層來縮減模型的大小,提高計算速度,同時提高所提取特徵的魯棒性,下面來看一下。
上圖中池化層型別為最大池化(max pooling),執行過程非常簡單,把4×4的輸入拆分成不同的區域(不同區域用不同顏色來標記)。對於2×2的輸出,輸出的每個元素都是其對應顏色區域中的最大元素值。其主要目的是減少特徵圖的尺寸(降低計算複雜度),同時保留了顯著的區域性特徵(具有一定的抗干擾性)。此方法在很多實驗中效果都很好。
其中一個有意思的特點就是,它有一組超引數,但並沒有引數需要學習。在實際操作中,一旦確定f和s,就是一個固定運算,梯度下降無需改變任何值。還有一種型別的池化,平均池化(average pooling),但是並不常用,運算時選取的不是每個過濾器的最大值,而是平均值。
現在總結一下,如上圖,池化的超級引數包括過濾器大小和步幅,常用的引數值為f = 2,s = 2,應用頻率非常高,其效果相當於高度和寬度縮減一半。也有使用f =3,s=2的情況。至於其它超級引數就要看你用的是最大池化還是平均池化了。最大池化時,往往很少用到超引數padding,當然也有例外的情況。假設沒有padding,最大池化的輸入和輸出分別為:
需要注意的一點是,池化過程中沒有需要學習的引數。執行反向傳播時,反向傳播沒有引數適用於最大池化。只有這些設定過的超引數(f,s),可能是手動設定的,也可能是透過交叉驗證設定的。
9、卷積神經網路示例
補充內容:人們發現在卷積神經網路文獻中,卷積有兩種分類,這與所謂層的劃分存在一致性。(1)一類卷積是一個卷積層和一個池化層一起作為一層,這就是神經網路的Layer1。(2)另一類卷積是把卷積層作為一層,而池化層單獨作為一層。人們在計算神經網路有多少層時,通常只統計具有權重和引數的層。因為池化層沒有權重和引數,只有一些超引數。
此例中的卷積神經網路很典型,看上去它有很多超引數,關於如何選定這些引數,常規做法是,儘量不要自己設定超引數,而是檢視文獻中別人採用了哪些超引數,選一個在別人任務中效果很好的架構,那麼它也有可能適用於你自己的應用程式。
在神經網路中,另一種常見模式就是一個或多個卷積後面跟隨一個池化層,然後一個或多個卷積層後面再跟一個池化層,然後是幾個全連線層,最後是一個softmax。
10、為什麼使用卷積?
卷積在深度學習,尤其是影像處理領域中非常常用,原因在於它帶來了多方面的優勢。以下是使用卷積(尤其是卷積神經網路,CNN)的主要原因和好處: