目錄
- 1?什么是 CNN
- 2?輸入層
- 3?卷積層
- 3.1?卷積操作
- 3.2?Padding 零填充
- 3.3?處理彩色圖像
- 4?池化層
- 4.1?池化操作
- 4.2?池化的平移不變性
- 5?全連接層
- 6?輸出層
前言
- 這篇博客不夠詳細,因為沒有介紹卷積操作的具體計算;
- 但是它介紹了 CNN 各層次的功能,提供了一個全局的視野。
參考博客
- 卷積神經網絡(CNN)詳細介紹及其原理詳解
1?什么是 CNN
卷積神經網絡 CNN 通常被用于圖像處理,比如下圖的手寫數字辨識過程:
可以看出,整個過程由以下幾層組成:
- 輸入層:輸入圖像等信息;
- 卷積層:用于提取圖像的底層特征;
- 池化層:防止過擬合,即將數據的維度減小;
- 全連接層:匯總卷積層和池化層得到的圖像的底層特征和信息;
- 輸出層:根據全連接層的信息得到概率最大的結果。
其中最重要的就是卷積層,這也是卷積神經網絡名稱的由來。接下來,我們將對這些層進行詳細的介紹。
個人理解:上圖中的紅色方框表明,黑色線所指向位置的元素是由紅色方框內的元素計算出來的。
2?輸入層
CNN 的輸入層用于將輸入的圖像轉換為由像素值構成的二維矩陣,并存儲該二維矩陣以等待后續操作。與人眼不同,計算機能夠處理的圖像是一個二維矩陣,該二維矩陣是由圖像的每一個像素的像素值組成的。如下圖所示,手寫數字 8 8 8 的圖像被計算機讀取為一個二維矩陣:
圖 (a) 是一個灰度圖像,這是因為其每個像素值的范圍在 [ 0 , 255 ] [0,255] [0,255] 之間,表示其顏色的強弱程度。除灰度圖像外還有黑白圖像,黑白圖像的每個像素值要么是 0 0 0,要么是 255 255 255。而日常生活中最常見的是 R G B \mathrm{RGB} RGB 圖像,這種圖像有三個通道,分別是:紅色、綠色、藍色。每個通道的每個像素值的范圍也是在 [ 0 , 255 ] [0,255] [0,255] 之間,表示其顏色的強弱程度。
由于灰度圖像的值范圍較小、顏色較單一,因此比較好操作,所以我們通常處理的都是灰度圖像。在某些情況下, R G B \mathrm{RGB} RGB 圖像在輸入神經網絡之前也會被轉化為灰度圖像,這就是因為處理三個通道的計算量非常大。不過隨著計算機性能的高速發展,現在有些神經網絡也可以直接處理 R G B \mathrm{RGB} RGB 圖像。
3?卷積層
一旦圖片被輸入網絡,它將被轉換成一個二維矩陣。為了提取該矩陣中的特征,卷積操作被應用于該矩陣。該操作通過計算每個像素與卷積核(Convolution Kernel)的點積,為圖像中具有特征的區域賦予高值,為不具有特征的區域賦予低值。
注意:想要提取什么樣的特征,就要使用什么樣的卷積核。比如:想要提取原始圖像中眼睛這一特征,就要使用具有眼睛特征的卷積核。
3.1?卷積操作
卷積核本質上也是一個二維矩陣,其尺寸通常小于或等于輸入圖像的二維矩陣。在卷積操作中,卷積核在輸入圖像矩陣上逐像素移動,并在每次移動后執行像素值的點積運算。將所有這些點積的和賦予當前卷積核位置對應的輸出矩陣中的相應像素值。如下圖所示:
通過卷積核不斷地移動和計算(逐元素相乘再相加),我們得到了一個新的二維矩陣,該二維矩陣被稱為特征圖(Feature Map),也就是圖像中最有用的特征。此外,不難看出卷積操作是一個降維的過程,因為特征圖的維度比原始圖像的二維矩陣小。
在上圖中,紅色矩陣是圖像的二維矩陣,藍色矩陣是卷積核,紫色矩陣是特征圖。
為了進行更加生動形象的說明,我們以提取人臉圖像中的眼睛為例,選取眼睛作為卷積核,并在整個頭部圖像上移動,以識別和定位眼睛的位置。如下圖 (a)(b)(c) 所示:
為了強調我們提取到的人眼特征,我們可以假設高值為白色,低值為黑色,并對特征圖進行上色處理,如上圖 (d) 所示。說明:由于黑色實在是太辣眼睛了,因此我實際上用的是灰色。
由向量乘法的幾何意義可知,兩個向量越相似,其乘積結果越大。因此當卷積核移動到眼睛部分時,它們的卷積結果較大,即上圖中的 100 100 100。
3.2?Padding 零填充
可以從上一節的動圖看出,邊緣的像素只被計算了一次,而中間的像素被計算了多次,從而造成了邊緣特征的丟失。為了克服這一問題,通常在原始輸入圖像的二維矩陣周圍添加額外的邊緣像素,即進行零填充(Padding)。如此一來,每個像素都能夠獲得相同的計算機會,確保了特征圖不會丟失邊緣區域的重要特征。
P a d d i n g = 1 \mathrm{Padding = 1} Padding=1,即擴展 1 1 1 圈
P a d d i n g = 2 \mathrm{Padding = 2} Padding=2,即擴展 2 2 2 圈
注意:上面兩張動圖中,藍色矩陣是圖像的二維矩陣,透明灰色矩陣是卷積核,綠色矩陣是特征圖。
3.3?處理彩色圖像
已知每張彩色圖像都有三個通道,即三個二維矩陣。假設我們使用兩組卷積核來提取圖像特征,如下圖所示:
其中一組卷積核對應提取出一個特征圖,每組中的一個卷積核對應提取一個通道的特征。不難看出,有多少組卷積核就會有多少個特征圖。特征圖中的一個元素,等于三個通道的卷積結果之和,再加上偏置項。比如:上圖中的 1 1 1 等于 1 + ( ? 1 ) + 0 + 1 1+(-1)+0+1 1+(?1)+0+1。偏置項 b i a s \mathrm{bias} bias 就是每組最后的那個 1 × 1 1\times 1 1×1 矩陣。
注意:特征圖的個數等于卷積核的組數,而不是卷積核的個數!
4?池化層
在上一節中,我們講到有多少組卷積核就會有多少個特征圖。但是隨著特征圖的增多,我們必須考慮一個重要的問題:并非所有的特征圖都是必需的。而且多余的特征圖可能會帶來如下兩個問題:
- 過擬合
- 維度過高
為了解決這個問題,我們使用了池化層。
4.1?池化操作
池化層又稱為下采樣,其作用在于在卷積操作之后對特征圖進行降維,通過提取最顯著的特征信息來減少數據量,從而起到減小過擬合和降低維度的作用。
池化過程類似于卷積過程,也是讓一個固定大小的窗口在圖片上進行移動,每次我們選取窗口內最具代表性的特征。那么如何提取出最具代表性的特征呢?通常有以下兩種方法。
最大池化
最大池化是指每次選取窗口內所有值的最大值,認為這個最大值就是當前位置最具代表性的特征。該過程如下圖所示:
參數說明:
- ① k e r n e l ? s i z e = 2 \mathrm{kernel_{-}size} = 2 kernel??size=2:是指窗口的維度為 2 × 2 2\times2 2×2;
- ② s t r i d e = 2 \mathrm{stride} = 2 stride=2:是指窗口每次移動兩格位置;
- ③ p a d d i n g = 0 \mathrm{padding} = 0 padding=0:是指零填充的圈數,如果值為 0 0 0 則表明沒有擴展。
平均池化
平均池化是指每次選取窗口內所有值的平均值,即考慮了每個位置的值對該位置特征的影響。該過程如下圖所示:
池化層的優點總結如下:
- 減少參數量的同時保留圖像的原始特征;
- 有效地防止過擬合;
- 為 CNN 帶來平移不變性;
前兩個優點我們之前已經介紹過了,那么什么又是平移不變性呢?
4.2?池化的平移不變性
如圖 (a) 所示,兩張圖片的內容都是人臉,但是下圖的人臉稍稍左移了一點。如圖 (b) 所示,經過卷積操作后得到各自的特征圖。
其中上圖的眼睛特征的位置正常,下圖的眼睛特征的位置稍稍左移了一點。盡管人類能夠識別出眼睛的位置,但是當通過神經網絡進行計算時,可能會引入誤差,原因是網絡未能在預期位置上正確地識別出眼睛。針對這種情況,應當采取何種措施呢?
如圖 (c) 所示,使用池化層執行池化處理后,觀察到盡管在池化前兩張圖像的眼睛特征位于不同位置,但經過池化處理后,這些特征的位置均統一。這極大地便利了后續神經網絡的計算,并且體現了池化操作的平移不變性。
5?全連接層
假設在上述頭部圖像示例中,我們已經通過卷積操作和池化操作提取了眼睛、鼻子和嘴巴的特征。若要利用這些特征來判斷圖像是否為人體頭部,需要對所有提取出的特征圖進行 “展平” 操作,即將其維度轉換為 1 × n 1\times n 1×n 的形式,該過程被稱為全連接。如下圖所示:
也就是說,全連接層將提取出的特征圖展開成一維向量。隨后通過計算產生一個概率值,該值表示原始圖像是人體頭部圖像的概率。
個人理解:上圖中每個特征圖的維度是 5 × 5 5\times 5 5×5,展開成一維向量后的維度是 1 × 25 1\times 25 1×25,拼接起來送入神經元時的維度是 1 × 75 1\times 75 1×75。
6?輸出層
輸出層用于對全連接層輸出的一維向量進行計算,如下圖所示:
其中的計算可能是線性的,也可能是非線性的。在深度學習中,鑒于通常需要處理多分類任務,輸出層每個位置都會產生一個概率值,代表屬于當前位置對應類別的概率。選擇概率值最大的類別作為最終的識別結果。在訓練過程中,通過不斷調整網絡的參數,提高識別的準確率。