(4-1)卷積神經網絡 | 卷積神經網絡基礎

目錄

計算機視覺

卷積運算

Padding

卷積步長

三維卷積

單層卷積網絡

簡單卷積網絡實例

池化層

卷積神經網絡示例

使用卷積的原因


計算機視覺

計算機視覺(Computer Vision)涉及許多不同類別的問題,如圖片分類、目標檢測、圖片風格遷移等等。

對於小尺寸的圖片問題,也許我們用深度神經網絡的結構可以較爲簡單的解決一定的問題。但是當應用在大尺寸的圖片上,輸入規模將變得十分龐大,難以獲得足夠的數據來防止神經網絡發生過擬合和競爭需求,要處理包含幾十億參數的神經網絡,這樣巨大的內存需求讓人不太能接受。

但對於計算機視覺應用來說,我們肯定不想它只處理小圖片,而是希望它同時也能處理大圖。因此,我們需要進行卷積計算,它是卷積神經網絡中非常重要的一塊。

卷積運算

卷積運算是卷積神經網絡最基本的組成部分,這裏以邊緣檢測爲例來介紹卷積運算。

如下圖所示,如果我們想讓電腦搞清楚這張照片裏有什麼物體,做的第一件事可能是檢測圖片中的垂直邊緣。在這張圖片中的欄杆就對應垂直線,並且這些行人的輪廓線某種程度上也是垂線,這些線是垂直邊緣檢測器的輸出。同樣,我們可能也想檢測水平邊緣,圖片中的欄杆就是很明顯的水平線。所以我們應該如何在圖像中檢測這些邊緣呢?

如圖所示,我們以 6×6 的灰度圖像爲例,爲了檢測圖像中的垂直邊緣,我們可以構造一個 3×3 矩陣(也稱爲過濾器/卷積核),對這個 6×6 的圖像進行卷積運算,卷積運算用“∗”來表示。過濾器不斷地和其大小相同的部分做對應元素的乘法運算並求和,最終得到的數字相當於新圖片的一個像素值,如右矩陣所示,最終得到一個 4*4 大小的圖片。

補充,各種不同編程框架中卷積運算使用的函數:

  1. python:conv_forward
  2. tensorflow: tf.conv2d
  3. Keras: Conv2D
  • 邊緣檢測原理

以如圖所示的 6×6 圖像爲例,它左邊的一半是 10,右邊一半是 0。如果把它當成一個圖片,因爲像素值 10 是比較亮的像素值,所以左邊那部分會是白色的,相比較而言,右邊像素值會比較暗。因此,圖片中會有一個特別明顯的垂直邊緣在圖像中間。當用一個 3×3 過濾器進行卷積運算後,在中間會有段亮一點的區域,對應檢查到這個 6×6 圖像中間的垂直邊緣。

  • 邊緣過渡

正邊和負邊的區別其實就在於是由亮到暗還是由暗到亮,也就是邊緣的過渡。如下圖所示,將左邊較亮,右邊較暗的圖片進行翻轉,得到左邊較暗,右邊較亮的圖片。如果用它與相同的過濾器進行卷積,中間的過渡部分被翻轉了,之前的 30 翻轉成了-30,表明是由暗向亮過渡, 而不是由亮向暗過渡(30)。

  • 更多邊緣檢測

一個垂直邊緣過濾器是一個 3×3 的區域,它的左邊相對較亮,而右邊相對較暗。相似的,水平邊緣過濾器也是一個 3×3 的區域,它的上邊相對較亮,而下方相對較暗。計算機視覺的研究者們還會使用其它的數字組合,如Sobel過濾器,它的優點在於增加了中間一行元素的權重,這使得結果的魯棒性會更高一些;又比如 Scharr 過濾器,它有着和之前完全不同的特性,實際上也是一種垂直邊緣檢測,如果將其翻轉 90 度,也能得到對應水平邊緣檢測。

    

對於複雜的圖片,我們可以直接將過濾器 中的數字直接看作是需要學習的參數,並且在之後可以使用反向傳播算法,讓模型在數據中去學習這9個參數,將其應用於整個圖片,輸出其提取到的所有有用的特徵。相比於單純的水平和垂直檢測器,其可以學習更好更復雜的過濾器,訓練的過濾器也許可以檢測出更多不同角度的邊緣。

  • 卷積和互相關

在數學定義上,矩陣的卷積(convolution)操作爲首先將卷積核同時在水平和垂直方向上進行翻轉(如下圖所示),構成一個卷積核的鏡像,然後使用該鏡像再和前面的矩陣進行移動相乘求和操作。

在深度學習中,我們稱爲的卷積運算實則沒有卷積核變換爲鏡像的這一步操作,因爲在權重學習的角度,變換是沒有必要的。深度學習的卷積操作在數學上準確度來說稱爲互相關

Padding

從前面的內容我們可以看到,如果我們將一個 6×6 的圖像用一個 3×3 的過濾器卷積,最後會得到一個 4×4 的圖像。這背後的數學解釋是如果我們有一個𝑛 × 𝑛的圖像,用𝑓 × 𝑓的過濾器做卷積,那麼輸出的維度就是(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1)。而這樣做會有兩個缺點:

  1. 每次卷積操作,圖像會縮小;
  2. 邊緣位置的像素進行卷積運算的次數少,會丟失圖像邊緣位置的許多信息。

爲了解決上述的兩個缺點,我們可以在卷積操作之前填充這幅圖像。如圖所示,我們可以沿着圖像邊緣再填充一層像素(習慣上用0填充),這樣 6×6 的圖像就被填充成了 8×8 的 圖像。用p來表示填充的數量,輸入n*n大小的圖片,卷積後得到的圖片大小爲 (𝑛 + 2𝑝 − 𝑓 + 1) × (𝑛 + 2𝑝 − 𝑓 + 1),爲使圖片大小保持不變,需根據過濾器的大小來調整p的值。

  • Valid / Same卷積

Valid 卷積:不填充,也就是p = 0,如果𝑛 × 𝑛的圖像,用一個𝑓 × 𝑓的過濾器卷積,就可得到(𝑛 − 𝑓 + 1) × (𝑛 − 𝑓 + 1)維的圖像。

Same卷積:填充後輸出大小和輸入大小一樣。如果𝑛 × 𝑛的圖像,用𝑝個像素填充邊緣,就可得到(𝑛 + 2𝑝 − 𝑓 + 1) × (𝑛 + 2𝑝 − 𝑓 + 1)維的圖像,因爲輸入輸出大小相同,那麼𝑝 = (𝑓 − 1)/2。(注意:習慣上,計算機視覺中,𝑓通常是奇數)

卷積步長

卷積步長是構建卷積神經網絡的一個基本的操作。在之前的卷積操作中,步長是爲1,如圖所示,我們將步長設置爲2進行卷積:

s表示stride的大小,那麼在進行卷積運算後,圖片的變化爲:

注意,在當pading不爲1時,若移動的窗口落在圖片外面,則不要再進行相乘的操作,丟棄邊緣的數值信息,所以輸出圖片的最終維度爲向下取整。

三維卷積

對於灰色圖像中,卷積核和圖像均是二維的。而應用於彩色圖像中,因爲圖片有R、G、B三個顏色通道,所以此時的卷積核應爲三維卷積核。如圖所示,我們用一個3×3×3的過濾器對6x6x6的圖像(第一個6 代表圖像高度,第二個6代表寬度,3 代表通道數)進行卷積,可以得到一個4x4的圖像。

如下圖所示,如果我們將6x6x6的圖像同時和兩個過濾器(一個垂直邊緣檢測器,一個水平邊緣檢測器)進行卷積,就可以得到 兩個不同的 4×4 的輸出,然後我們將這兩個輸出堆疊在一起, 這樣就得到了一個 4×4×2 的輸出立方體,這裏的 2 其實來源於我們用了兩個不同的過濾器。

總結:輸入一個𝑛 × 𝑛 × 𝑛𝑐 (通道數)的輸入圖像,用𝑓 × 𝑓 × 𝑛𝑐的過濾器(卷積核與輸入圖像的通道數必須相同),就可得到(𝑛 − 𝑓 + 1)× (𝑛 − 𝑓 + 1) × 𝑛𝑐′的圖像(𝑛𝑐′爲下一層的通道數,也就是用的過濾器個數)。

單層卷積網絡

普通的神經網絡單層前向傳播是先由輸入和權重及偏置做線性運算,然後將得到的結果輸入一個激活函數中。卷積神經網絡的前向傳播與其類似,不同的是,卷積神經網絡中的權重和輸入進行的是卷積運算。

在一個卷積層中,假設我們有10個 3x3x3 大小的卷積核,再加上每個卷積覈對應的一個偏置參數,那麼對於一個卷積層,我們一共10 x (3x3x3+1) = 280 個參數。可以看出,無論圖片大小是多少,該例子中的卷積層參數個數一直都是280個,相對於普通的神經網絡,卷積神經網絡的參數個數要少很多。

卷積層的各種標記總結(以𝑙層爲例):

簡單卷積網絡實例

如圖所示爲卷積神經網絡的一個典型範例,在設計卷積神經網絡時,確定超參數會比較費工夫,要決定過濾器的大小、步幅、padding 以及使用多少個過濾器。一般來說,開始時的圖像會更大一些,隨着神經網絡計算深度不斷加深,高度和寬度會逐漸減小,而通道數量會逐漸增加。

一個典型的卷積神經網絡通常有三層:卷積層( CONV)、池化層(POOL)和全連接層(FC)。雖然僅用卷積層也有可能構建出很好的神經網絡,但大部分神經網絡架構師依然會添加池化層和全連接層,並且池化層和全連接層比卷積層更容易設計。

池化層

除了卷積層,卷積網絡也經常使用池化層來縮減模型的大小,提高計算速度,同時提高所提取特徵的魯棒性。

  • Max pooling

最大池化功能就是只要在任何一個象限內提取到某個特徵,它都會保留在最大化的池化輸出裏。也就是說,如果在過濾器中提取到某個特徵,那麼保留其最大值。值得注意的一點是,一旦確定了𝑓和𝑠,最大池化就是一個固定運算,梯度下降無需改變任何值。如下圖所示爲二維輸入的最大池化,如果輸入是三維的,那麼輸出也是三維的,也就是說池化操作不改變通道數。

  • Average pooling

平均池化與最大池化唯一不同的是其選取的是小區域內的均值來代表該區域內的值,這種方法並不常用。

總結:池化的超級參數包括過濾器大小𝑓和步幅𝑠,常用的參數值爲𝑓 = 2,𝑠 = 2, 應用頻率非常高,其效果相當於高度和寬度縮減一半。最大池化時,往往很少用到超參數 padding。需要注意的一點是,池化過程中沒有需要學習的參數,只有這些設置過的超參數,可能是手動設置的,也可能是通過交叉驗證設置的。

卷積神經網絡示例

假設32×32×3 的 RGB 圖片中含有某個數字,我們想構建一個神經網絡來識別這個數字是 0-9 中的哪一個,如下圖所示。在卷積神經網絡文獻中,卷積有兩種分類,一類卷積是一個卷積層和一個池化層一起作爲一層,另一類是把卷積層作爲一層,而池化層單獨作爲一層。這裏,我們把 CONV1 和 POOL1 共同作爲一個卷積,並標記爲 Layer1。 兩次卷積後輸出的5×5×16 矩陣包含 400 個元素,將POOL2平整化爲一個大小爲 400 的一維向量,將平整化結果想象成這樣的一個神經元集合,然後利用這 400 個單元構建下一層,下 一層含有 120 個單元,這 400 個單元與 120 個單元緊密相連,最後輸出 120 個維度,這就是第一個全連接層,標記爲 FC3。然後對這個 120 個單元再添加一個全連接層,這層更小,假設它含有 84 個單元, 標記爲 FC4。最後,用這 84 個單元填充一個 softmax 單元(輸出層使用softmax激活函數) ,softmax 就會有 10 個輸出(識別0-9 這10 個數字)。 

根據下表可以看出,第一,隨着神經網絡深度的加深,提取的特徵圖片的高度𝑛𝐻 和寬度𝑛𝑊 通常都會減少,但同時通道數量應隨之增加;第二,在卷積神經網絡的參數中,卷積層僅有少量的參數,且逐漸減少,池化層沒有參數,但全連接層存在大量的參數;第三,隨着神經網絡的加深,激活值尺寸會逐漸變小。

使用卷積的原因

與普通的全連接神經網絡相比,卷積神經網絡的參數更少,主要原因有兩個:

  • 參數共享:一個特徵檢測器(filter)對圖片的一部分有用的同時也有可能對圖片的另外一部分有用;
  • 連接的稀疏性:在每一層中,每個輸出值只取決於少量的輸入。

神經網絡可以通過上述兩種機制減少參數,以便我們用更小的訓練集來訓練它,從而預防過度擬合。另外,卷積神經網絡善於捕捉平移不變,神經網絡的卷積結構使得即使移動幾個像素, 這張圖片依然具有非常相似的特徵,我們用同一個過濾器生成各層中圖片的所有像素值,希望網絡通過自動學習變得更加健壯,以便更好地取得所期望的平移不變屬性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章