卷積神經網絡
- 1 計算機視覺(Computer Vision)
- 2 邊緣檢測(Edge Detection)
-
- 2.1 用卷積操作實作垂直邊緣檢測
- 2.2 更多邊緣檢測
- 3 填充(padding)
- 4 帶步長的卷積(Strided Convolutions)
- 5 對三通道圖檔的卷積
- 6 單層卷積神經網絡
- 7 一個簡單的卷積神經網絡
- 8 池化層(Pooling Layers)
- 9 CNN Example
- 10 為什麼要用卷積神經網絡
- 卷積神經網絡的好處
1 計算機視覺(Computer Vision)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0kTO0IzNzUTM1EDOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
受益于深度學習,計算機視覺是目前快速發展的領域之一。 深度學習計算機視覺可以幫助自動駕駛汽車判斷其周圍的其他汽車和行人的位置以躲避他們,幫助面部識别解鎖手機,甚至打開門等。 下面列出幾個深度學習的計算機視覺問題的例子:
- 圖像分類 / 圖像識别
- 目标檢測中
- 神經風格轉換
計算機視覺的一個挑戰是輸入可以任意大。 如果你使用較大的圖像 也許這是一個 10001000 像素的圖像,輸入特征的次元将會是10001000*3,也就是 3 ∗ 1 0 6 3*10^6 3∗106 維。如果用一個标準的或者全連接配接的網絡,假設第一個隐藏層隻有 1000 個隐藏的單元,那麼權重矩陣 W1 将會是一個 1000 ∗ 3000000 1000*3000000 1000∗3000000 維的矩陣。也就是說 W1 包含 3 ∗ 1 0 9 3*10^9 3∗109 個參數,這個參數數量是非常大的。
這麼多的參數會帶來兩方面的弊端:
- 很難獲得足夠的資料以避免神經網絡過拟合。
- 訓練一個有 3 ∗ 1 0 9 3*10^9 3∗109 個參數的神經網絡對計算資源和記憶體的需求是不太可行的。
但對于計算機視覺應用,你不會想要被限制于使用一個小圖像,你想要用清晰的圖像擷取足夠的資訊。為了做到這點你需要運用卷積運算,它是卷積神經網絡的基礎之一 。
2 邊緣檢測(Edge Detection)
在計算機視覺中,神經網絡的前幾層會檢測一些低級特征,例如邊緣; 接下來的幾層可能會檢測對象的某些部分;而更靠後的幾層會檢測到某些整個對象,比如在此例中的人臉。
如果給你一張這樣的圖檔(下圖左),讓電腦預測在這張圖檔中的物體是什麼。你做的第一件事可能是檢測圖檔中的垂直邊緣,例如圖像中垂直的線是栅欄、還有比較垂直的線是這些行人的輪廓 。除此之外,你也許也想要檢測水準邊緣,比如非常明顯的栅欄的橫杆。
2.1 用卷積操作實作垂直邊緣檢測
是以你怎樣才能在像這樣的圖像中檢測垂直邊緣呢?這裡以一個 6x6 的灰階圖像為例(下圖左)。為了檢測這個圖像中的垂直邊緣,你能做的是建立一個 3x3 的矩陣(下圖右),在池化(pooling)過程中,用卷積神經網絡中的專業術語它被稱為一個過濾器(filter),有時候在科研論文中也會将它稱為核(kernel)。
下面我們開始用這個 filter 在原圖上做卷積運算:
第一步:将 filter 覆寫在原圖左上角的位置,将 filter 中的數值與原圖相同位置的像素值相乘,再将得到的 9 個乘積結果相加,最後将最終結果記錄在另一個矩陣中。
第二步:将 filter 往右移動一格,将 filter 中的數值與原圖相同位置的像素值相乘,再将得到的 9 個乘積結果相加,最後将最終結果記錄下來。
以此類推,直到完成對整張圖的卷積操作
是以用 3x3 的 filter 對一個 6x6 灰階圖像完成一次卷積操作,将得到一個4x4的矩陣,可以把這個卷積的結果了解為另一個圖像,這就是一個垂直邊緣檢測器。
大部分的程式設計語言都會有自己的方法來完成卷積操作。python中可以用 conv_forward( ),在 TensorFlow 中是 tf.nn.conv2d( ) 函數,而在 Keras 中則是 Conv2D( ) 來實作卷積運算。
那麼為什麼這是在進行垂直邊緣檢測呢?原理見下圖:
2.2 更多邊緣檢測
正邊緣和負邊緣:即由亮變暗和由暗變亮的邊緣過渡
垂直邊緣過濾器和水準邊緣過濾器:
在計算機視覺的文獻中,對過濾器用哪些數字組合是最好的仍然存在相當大的争議。這裡你也可以選擇使用别的數字:
Sobel過濾器,這個過濾器的優點在于它給中間行賦予了更大的權重,進而可能使得它更加穩定。
Scharr過濾器。
随着深度學習的發展,我們發現,如果你想要檢測一些複雜圖檔的邊界,可能并不需要計算機視覺的研究人員挑選出這9個矩陣元素。你可以把矩陣裡的這9個元素當做參數,通過反向傳播來學習得到他們的數值。目标是要獲得這9個參數,使得對圖檔用這個過濾器進行卷積能得到一個優良的邊界檢測器。我們發現神經網絡可以學習底層特征得很好,比如邊界,甚至比計算機視覺研究人員精心選擇的更加穩定。
3 填充(padding)
如果你有一個 n x n 的圖檔并且想使用一個 f x f 的過濾器 這樣輸出的次元将會是 (n-f+1) x (n-f+1) 這其實有兩個缺陷:
第一個是 如果每一次你使用一個卷積操作,你的圖像都會縮小。例如你從 6x6 降維到 4x4 你做不了幾次卷積,你的圖檔就會變得非常小 也許它會縮小到隻有1x1或者别的什麼 是以也許你并不希望 每次你想檢測邊界或者其他的特征時,都縮小你的圖檔 這就是一個缺陷
第二個缺陷是 角落或者邊界上的像素被使用的次數少很多 你丢失了許多圖檔上靠近邊界的資訊
是以為了同時解決上述的兩個問題,你可以填充(pad)圖檔的邊緣。如果 p 是填充的數量,這樣輸出變成了 (n+2p-f+1) x (n+2p-f+1)
那麼這個 p 應該取什麼值呢?我們有兩個常見的選擇,即 valid卷積和 same 卷積
valid卷積 基本上意思是沒有填充 是以在這種情況下 當你用一個 fxf 過濾器去卷積一個 nxn 的圖檔 你會得到一個 (n-f+1) x (n-f+1) 次元的輸出 。
same卷積,意思是你選擇的填充将使得 輸出大小等于輸入大小。 當你用p=(f-1)/2個像素填充且f是奇數時,可以保證輸出和輸入的大小相同。
通常在計算機視覺(computer vision)領域,f 基本上是使用奇數。有兩個原因導緻這個現象,一是如果f是偶數,會需産生些不對稱的填充,其次當你有一個奇數大小的過濾器,比如 3x3 或者 5x5 這樣,則可以得到有一個中心位置。有時候在計算機視覺領域 有一個特殊點是很好的,你可以稱之為中心像素,這樣你就可以描述你過濾器的位置。但是隻是約定俗成。
4 帶步長的卷積(Strided Convolutions)
除了一次移動一格(stride = 1),我們還可以一次移動多格(stride = s),下面以步長為 2 舉例,7x7 的矩陣在用 3x3 的過濾器完成卷積操作後,得到了一個 3x3 的矩陣。
總結一下經卷積操作後,輸出矩陣的次元計算。如果你有一個 n x n 的圖像或矩陣,将其填充 p 層元素後,用 f x f 大小的過濾器,以步長為 s 的方式進行卷積,那麼輸出的矩陣大小為 (n + 2p - f) / s + 1,最後還需用向下取整可以保持結果為整數。
5 對三通道圖檔的卷積
假設你想在這張RGB(紅綠藍)圖檔中檢測特征,則相應的需要使用三通道過濾器。是以,過濾器本身将有對應的三層分别是 紅、綠、藍三個通道。并且,過濾器的通道數目必須和圖像中的通道數目相等。這個三通道的過濾器有27個參數,接下來,你要做的是用這個過濾器中的每個數字分别與圖像的紅,綠,藍三通道的對應數字相乘,再把所有這些數字相加就能得到你輸出結果矩陣中的一個元素。
假如你想檢測這種RGB圖像裡的垂直邊緣, 那你可以按照以下的數值設定過濾器:
也可以隻對一個通道的圖像檢測特征,比如想要檢測圖檔裡紅色通道的垂直邊緣, 那你可以按照以下的數值設定過濾器:
如果我們想同時檢測垂直邊緣和水準邊緣, 又或者是45度邊緣或者70度邊緣, 換句話來說,如果你想要同時應用多個過濾器呢?
這裡需要注意兩點,第一是不管有幾個過濾器,每個過濾器的通道數應該與被卷積圖像的通道數相等,第二是有多少個過濾器,卷積結果就有多少個通道。
6 單層卷積神經網絡
在卷積神經網絡中,一個卷積層需要做哪些工作呢?這裡以一個帶兩個 3x3x3 的過濾器的卷積網絡為例。
應用第一個卷積過濾器,我們得到了第一個4x4的輸出,最終我們需要把這些輸出變成單層卷積神經網絡 還需要對這 16個元素添加同樣的偏差(bias),這裡偏差是一個實數 這裡使用的是廣播機制,然後我們可以繼續進行一些非線性轉換ReLU。最終,我們得到一個4x4矩陣輸出 。同理第二個卷積層也是一樣。
總而言之,在一個卷積層中會經過線性操作計算(卷積操作)、添加偏差、然後通過ReLU操作。
假定你的單層神經網絡中有 10 個而不是 2 個 3x3x3 的過濾器, 這層網絡中有多少參數?
每個過濾器是一個 3x3x3 的矩陣 是以每個過濾器有27個參數 也就是,此外,每個過濾器還對應一個參數 b,也就是總共28個參數。現在這裡我們有10個過濾器,加起來是 28x10,也就是280個參數 。是以卷積層有一個很好的特性是:不管輸入的圖像有多大 比方1000 x 1000 或者5000 x 5000,隻要過濾器的大小與個數不變,這裡的參數個數就不會變.,依然是280個。 這個特性使得卷積神經網絡不太容易過拟合。
總結一下:
7 一個簡單的卷積神經網絡
假設我們有一張圖像 并且你想做圖像分類,或圖像識别 輸入為一個圖像, x , 然後判斷這是不是一隻貓,0或1 是以這是一個分類問題。 讓我們建構一個可用于此任務的ConvNet範例。 假設這個圖像是 39 x 39 x 3。
通過三個卷積層後得到結果為一個 7 x 7 x 40 的特征向量。 最後通常會做的是, 如果你把這個 7 x 7 x 40 的特征向量展開為 1960 個單元,然後将其輸入到一個邏輯回歸 或 softmax 單元。
随着你建的神經網絡越來越深, 通常你開始的時候, 圖像都是比較大的,例如39乘39 高度和寬度在保持不變一陣子後 随着你在神經網絡中的深入, 逐漸變小 在我們的這個例子裡,它從39到37到17到7。而通道的數目一般會增加,它已經從3到10到20到40。這在卷積神經網絡中是一種常見的趨勢。
卷積神經網絡設計中的許多工作是選擇 像這樣的超參數(hyperparameter): 總單元數是多少? 步長是什麼? padding是多少和使用了多少過濾器?
事實證明, 在一個典型的 ConvNet, 通常有三種類型的層。 第一種是卷積層, 通常我們會将其表示為一個Conv層 ;第二種稱為 “Pooling” 層, 通常我會直接稱為 Pool。 最後一種是全連接配接層,稱為 FC。
8 池化層(Pooling Layers)
除卷積層之外 ConvNets通常還使用池化層來減少展示量,以此來提高計算速度,并使一些特征的檢測功能更強大。以最大池化(Max pooling)為例:
最大池化就是将原矩陣劃分為大小相等的小區域,然後找到每個小區域最大的元素,并按順序儲存在一個新的矩陣種。假設你有一個 4x4 的輸入并且按照 2x2 的大小來劃分小區域,那麼 max pooling 後的輸出将會是一個 2x2 的矩陣。這如同你使用了一個大小為2的過濾器,因為你選取一個 2x2 的區域,并且使用的步長為 2,這些實際上就是max pooling 的超參數。
max pooling背後的機制:
如果你把這個4x4的區域看作某個特征的集合,那麼一個大的數字意味着它或許檢測到了一個特定的特征,它或許是一個垂直的邊沿,或者其他。是以左側上方的四分之一區域的最大值為 9,說明這個區域有這樣的特征。但是,右側上方的四分之一區域的最大值很小,可能說明這個區域沒有這個特征。是以 max pooling作所做的其實是如果在濾波器中任何地方檢測到了這些特征就保留最大的數值。
max pooling 的一個有趣的特性是它有一套超參,但是它沒有任何參數需要學習。實際上,沒有任何需要梯度相加算法學習的東西,一旦确定了 f 和 s 就确定了計算,而且梯度下降算法不會對其有任何改變。讓我們來看一個有某些不同超參的例子:
除了最大池化,還有一類不是很常使用的池化:平均池化。 它所做的不是求在每個小區域中取最大值,而是取其平均值。 目前,最大值采樣的使用通常比均值采樣多得多,唯一的例外是有時候在深度非常大的神經網絡 你也許可以使用均值采樣來合并表示。
總結一下,池化的超參數有濾波器的大小 f 以及步長 s,最常見的是 f = 2,s = 2,這個相當常用并且其效果是近似得把高度和寬度縮小了兩倍,而其它的超參就像一個二進制位來訓示你是使用最大值采樣還是均值采樣。通常情況下,是不進行任何的補位,是以,p 最為常用的取值是 p = 0。
此外,對于單個過濾器,輸入通道的數量等于輸出通道的數量,因為池化是獨立地應用于每一個通道。另外需要注意的是,池化是一個确定的函數,它沒有需要學習的參數。 反而這些超參需要你設定一次,或許是人工設定或者使用交叉檢驗。
9 CNN Example
現在我們用卷積層,池化層,全連接配接層建立一個完整的卷積神經網絡。 假設我們試着做手寫數字識别,輸入圖像大小為 32x32x3的一個RGB圖像,要嘗試識别圖像是0-9中十個數字中的哪一個是 7。
将上圖通過表格的形式展示出來。可以發現,随着神經網絡的深入,激活輸入大小也逐漸變小。不過如果減少的太快,通常也不利于網絡性能。許多卷積神經網絡有着與此相似的特性和模式。
這其中似乎有許多超參數,關于如何選擇這類超參數 ,一個常用的法則實際上是 不要試着創造你自己的超參數組,而是檢視文獻,看看其他人使用的超參數,從中選一組很可能它也适用于自己的應用。
到這裡你已經了解了神經網絡的基本構件 卷積神經網絡,卷積層,池化層和全連接配接層。如何利用這些基本構件來構造一個有效的神經網絡,已經有許多計算機領域專家在深入研究了,把這些構件組合到一起實際上需要相當的洞察力。最好的方法之一 就是去學習一定數量的執行個體,看看人家是如何做的,并從中來獲得靈感如何把這些構件組合在一起。
10 為什麼要用卷積神經網絡
卷積層和隻用完全連接配接的神經層比起來有兩個優勢:參數共享和連接配接的稀疏性 。
參數共享:過濾器對于圖像的一部分是有用的,那麼對于另一部分可能也是有用的。
稀疏連接配接:在每一層中,每個輸出值隻依賴于少量的輸入而不是全部的輸入。
通過這兩個優勢,卷積層所需的參數比起相同輸入輸出下的全連接配接層參數少了很多很多。
此外,卷積神經網絡會被用來捕捉平移不變。比如說當一張貓的圖檔的像素格向任意方向移動了幾格,還是一個非常清晰的貓的圖檔。經卷積層後産生的特征還是與沒有移動時的特征相似。
綜上所述,如何來訓練這樣一個卷積神經網絡?我們需要定義一個代價函數 J, 然後使用梯度下降或一些類似的算法,比如梯度下降動量 或者 RMSProp,Adam 等算法,來優化所有的神經網絡參數 W 和 b,進而降低成本函數 J。
卷積神經網絡的好處
1、利用到了圖像的空間資訊。
2、參數的多少取決于過濾器的大小和數量,和輸入的圖像沒有關系。即使輸入的圖檔很大很大,隻需少量的參數就能處理這張圖檔,而且少量的參數不會造成過拟合。
3、學習到的過濾器既可以用到大圖檔中,也可以用到小圖檔中,也就是對輸入沒有了限制。