机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理
卷積神經網絡(Convolutional Neural Network,CNN)CNN 被用于圖像識別、語音識別等各種場合,在圖像識別的比賽中,基于深度學習的方法幾乎都以 CNN 為基礎。
1. 全連接層
1.1 全連接層網絡結構
之前介紹的神經網絡中,相鄰層的所有神經元之間都有連接,這稱為全連接(fully-connected )。另外,我們用 Affine 層實現了全連接層。如果使用這個 Affine 層,一個 5 層的全連接的神經網絡就可以通過圖7-1 所示的網絡結構來實現。
 Affine 層后面跟著激活函數 ReLU 層(或者 Sigmoid 層)。這里堆疊了4 層Affine-ReLU 組合,然后第 5 層是 Affine 層,最后由 Softmax 層輸出最終結果(概率)。
全連接層的主要作用是將輸入圖像在經過卷積和池化操作后提取的特征進行壓縮,并且根據壓縮的特征完成模型的分類功能。如圖4-6所示是一個全連接層的簡化流程。
 其實全連接層的計算比卷積層和池化層更簡單,如圖 4-6 所示的輸入就是我們通過卷積層和池化層提取的輸入圖像的核心特征,與全連接層中定義的權重參數相乘,最后被壓縮成僅有的10個輸出參數,這10個輸出參數其實已經是一個分類的結果,再經過激活函數的進一步處理,就能讓我們的分類預測結果更明顯。將 10個參數輸入到 Softmax 激活函數中,激活函數的輸出結果就是模型預測的輸入圖像對應各個類別的可能性值。
1.2 全連接層缺陷
在全連接層中,相鄰層的神經元全部連接在一起,輸出的數量可以任意決定。
全連接層存在什么問題呢?那就是數據的形狀被“忽視”了。比如,輸入數據是圖像時,圖像通常是高、長、通道方向上的 3 維形狀。但是,向全連接層輸入時,需要將 3 維數據拉平為 1 維數據。實際上,前面提到的使用了 MNIST 數據集的例子中,輸入圖像就是 1 通道、高 28 像素、長 28 像素的(1, 28, 28)形狀,但卻被排成1 列,以 784 個數據的形式輸入到最開始的 Affine 層。
圖像是3 維形狀,這個形狀中應該含有重要的空間信息。比如,空間上鄰近的像素為相似的值、RBG 的各個通道之間分別有密切的關聯性、相距較遠的像素之間沒有什么關聯等,3 維形狀中可能隱藏有值得提取的本質模式。
但是,因為全連接層會忽視形狀,將全部的輸入數據作為相同的神經元(同一維度的神經元)處理,所以無法利用與形狀相關的信息。
2. 卷積神經網絡
卷積層(Convolution Layer)的主要作用是對輸入的數據進行特征提取,而完成該功能的是卷積層中的卷積核(Filter)。
我們可以將卷積核看作一個指定窗口大小的掃描器,掃描器通過一次又一次地掃描輸入的數據,來提取數據中的特征。如果我們輸入的是圖像數據,那么在通過卷積核的處理后,就可以識別出圖像中的重要特征了。
那么,在卷積層中是如何定義這個卷積核的呢?卷積層又是怎樣工作的呢?下面通過一個實例進行說明。
假設有一張 32×32×3 的輸入圖像,其中 32×32 指圖像的高度×寬度,3 指圖像具有 R、G、B 三個色彩通道,即紅色(Red)、綠色(Green)和藍色(Blue),我們定義一個窗口大小為 5×5×3 的卷積核,其中 5×5 指卷積核的高度×寬度,3 指卷積核的深度,對應之前輸入圖像的 R、G、B 三個色彩通道,這樣做的目的是當卷積核窗口在輸入圖像上滑動時,能夠一次在其三個色彩通道上同時進行卷積操作。
注意,如果我們的原始輸入數據都是圖像,那么我們定義的卷積核窗口的寬度和高度要比輸入圖像的寬度和高度小,較常用的卷積核窗口的寬度和高度大小是 3×3 和 5×5。
在定義卷積核的深度時,只要保證與輸入圖像的色彩通道一致就可以了,如果輸入圖像是3個色彩通道的,那么卷積核的深度就是3;如果輸入圖像是單色彩通道的,那么卷積核的深度就是1,以此類推。如圖4-1所示為單色彩通道的輸入圖像的卷積過程。
如圖 7-2 所示,CNN 中新增了 Convolution (卷積層) 層和 Pooling (池化層) 層。CNN 的層的連接順序是 Convolution - ReLU -(Pooling)(Pooling 層有時會被省略)。這可以理解為之前的 Affi ne - ReLU 連接被替換成了 Convolution -ReLU -(Pooling) 連接。
 
 還需要注意的是,在圖7-2 的 CNN 中,靠近輸出的層中使用了之前的 Affine - ReLU 組合。此外,最后的輸出層中使用了之前的 Affine -Softmax 組合。這些都是一般的CNN 中比較常見的結構。
2.1 卷積比全連接層的優勢
卷積層可以保持形狀不變。當輸入數據是圖像時,卷積層會以3 維數據的形式接收輸入數據,并同樣以 3 維數據的形式輸出至下一層。
因此,在 CNN 中,可以(有可能)正確理解圖像等具有形狀的數據。
2.2 卷積運算
卷積層進行的處理就是卷積運算。卷積運算相當于圖像處理中的“濾波器運算”。
 
 濾波器在有的文獻中也稱作為 “卷積核”。
計算過程如下:
1 * 2 + 2 * 0 + 3 * 1 + 0 * 0 + 1 * 1 + 2 * 2 + 3 * 1 + 0 * 0 + 1 * 2 = 15
2 * 2 + 3 * 0 + 0 * 1 + 1 * 0 + 2 * 1 + 3 * 2 + 0 * 1 + 1 * 0 + 2 * 2 = 16
圖 7-4 中展示了卷積運算的計算順序。對于輸入數據,卷積運算以一定間隔滑動濾波器的窗口并應用。這里所說的窗口是指圖7-4 中灰色的3 × 3 的部分。如圖7-4 所示,將各個位置上濾波器的元素和輸入的對應元素相乘,然后再求和(有時將這個計算稱為乘積累加運算)。然后,將這個結果保存到輸出的對應位置。將這個過程在所有位置都進行一遍,就可以得到卷積運算的輸出。
 CNN 中,濾波器的參數就對應之前的權重。并且,CNN 中也存在偏置。包含偏置的卷積運算的處理流如圖7-5 所示。
如圖7-5 所示,向應用了濾波器的數據加上了偏置。偏置通常只有1 個(1 × 1)(本例中,相對于應用了濾波器的4 個數據,偏置只有1 個),這個值會被加到應用了濾波器的所有元素上。
2.3 填充
在進行卷積層的處理之前,有時要向輸入數據的周圍填入固定的數據(比如0 等),這稱為填充(padding),是卷積運算中經常會用到的處理。
比如,在圖7-6 的例子中,對大小為(4, 4) 的輸入數據應用了幅度為 1 的填充?!胺葹? 的填充”是指用幅度為 1 像素的 0 填充周圍。
 如圖 7-6 所示,通過填充,大小為 (4, 4) 的輸入數據變成了 (6, 6) 的形狀。然后,應用大小為 (3, 3) 的濾波器,生成了大小為 (4, 4) 的輸出數據。這個例子中將填充設成了 1,不過填充的值也可以設置成 2、3 等任意的整數。
使用填充主要是為了調整輸出的大小。比如,對大小為 (4, 4) 的輸入數據應用 (3, 3) 的濾波器時,輸出大小變為 (2, 2),相當于輸出大小比輸入大小縮小了 2 個元素。這在反復進行多次卷積運算的深度網絡中會成為問題。
為什么呢?因為如果每次進行卷積運算都會縮小空間,那么在某個時刻輸出大小就有可能變為 1,導致無法再應用卷積運算。為了避免出現這樣的情況,就要使用填充。
在剛才的例子中,將填充的幅度設為 1,那么相對于輸入大小 (4, 4),輸出大小也保持為原來的 (4, 4)。因此,卷積運算就可以在保持空間大小不變的情況下將數據傳給下一層。
2.4 步幅
應用濾波器的位置間隔稱為步幅(stride)。之前的例子中步幅都是 1,如果將步幅設為 2,則如圖 7-7 所示,應用濾波器的窗口的間隔變為 2 個元素。
 在圖 7-7 的例子中,對輸入大小為 (7, 7) 的數據,以步幅 2 應用了濾波器。通過將步幅設為 2,輸出大小變為 (3, 3)。像這樣,步幅可以指定應用濾波器的間隔。
綜上,增大步幅后,輸出大小會變小。而增大填充后,輸出大小會變大。
如果將這樣的關系寫成算式,會如何呢?接下來,我們看一下對于填充和步幅,如何計算輸出大小。
這里,假設輸入大小為 (H,W) ,濾波器大小為 (FH, FW) ,輸出大小為 (OH,OW) ,填充為 P ,步幅為 S 。此時,輸出大小可通過式 (7.1) 進行計算。
 
 計算示例如下:
 
 如果式 7.1 中當輸出大小無法除盡時(結果是小數時),需要采取報錯等對策。順便說一下,根據深度學習的框架的不同,當值無法除盡時,有時會向最接近的整數四舍五入,不進行報錯而繼續運行。
2.5 三維數據的卷積運算
圖7-8 是卷積運算的例子,圖7-9 是計算順序。這里以 3 通道的數據為例,展示了卷積運算的結果。和 2 維數據時(圖7-3 的例子)相比,可以發現縱深方向(通道方向)上特征圖增加了。通道方向上有多個特征圖時,會按通道進行輸入數據和濾波器的卷積運算,并將結果相加,從而得到輸出。
 
 需要注意的是,在 3 維數據的卷積運算中,輸入數據和濾波器的通道數要設為相同的值。在這個例子中,輸入數據和濾波器的通道數一致,均為 3。
濾波器大小可以設定為任意值(不過,每個通道的濾波器大小要全部相同)。這個例子中濾波器大小為 (3, 3),但也可以設定為 (2, 2)、(1, 1)、(5, 5) 等任意值。
再強調一下,通道數只能設定為和輸入數據的通道數相同的值(本例中為3)。
2.6 多濾波器(卷積核)運算
將數據和濾波器結合長方體的方塊來考慮,3 維數據的卷積運算會很容易理解。
方塊是如圖7-10 所示的 3 維長方體。把 3 維數據表示為多維數組時,書寫順序為 (channel, height, width)。比如,通道數為 C 、高度為 H 、長度為 W 的數據的形狀可以寫成 (C,H,W) 。濾波器也一樣,要按(channel,height, width) 的順序書寫。比如,通道數為 C 、濾波器高度為 FH(Filter Height) 、長度為 FW(Filter Width) 時,可以寫成 (C, FH, FW) 。
 如果要在通道方向上也擁有多個卷積運算的輸出,就需要用到多個濾波器(權重)。用圖表示的話,如圖7-11 所示。
 
 圖 7-11 中,通過應用 FN 個濾波器,輸出特征圖也生成了 FN 個。如果將這 FN 個特征圖匯集在一起,就得到了形狀為 (FN, OH,OW) 的方塊。將這個方塊傳給下一層,就是 CNN 的處理流。
如圖 7-11 所示,關于卷積運算的濾波器,也必須考慮濾波器的數量。因此,作為 4 維數據,濾波器的權重數據要按 (output_channel, input_channel, height, width) 的順序書寫。比如,通道數為 3、大小為 5 × 5 的濾波器有20 個時,可以寫成 (20, 3, 5, 5)。
卷積運算中(和全連接層一樣)存在偏置。在圖7-11 的例子中,如果進一步追加偏置的加法運算處理,則結果如下面的圖7-12 所示。
 
 圖 7-12 中,每個通道只有一個偏置。這里,偏置的形狀是 (FN, 1, 1) ,濾波器的輸出結果的形狀是 (FN, OH,OW) 。這兩個方塊相加時,要對濾波器的輸出結果 (FN, OH,OW) 按通道加上相同的偏置值。另外,不同形狀的方塊相加時,可以基于 NumPy 的廣播功能輕松實現。
2.7 批處理
通過批處理,能夠實現處理的高效化和學習時對 mini-batch 的對應。
我們希望卷積運算也同樣對應批處理。為此,需要將在各層間傳遞的數據保存為 4 維數據。具體地講,就是按 (batch_num, channel, height, width) 的順序保存數據。比如,將圖 7-12 中的處理改成對 N 個數據進行批處理時,數據的形狀如圖7-13 所示。
 
 圖7-13 的批處理版的數據流中,在各個數據的開頭添加了批用的維度。像這樣,數據作為 4 維的形狀在各層間傳遞。這里需要注意的是,網絡間傳遞的是 4 維數據,對這 N 個數據進行了卷積運算。也就是說,批處理將 N 次的處理匯總成了 1 次進行。
總結
以上是生活随笔為你收集整理的机器学习入门(15)— 全连接层与卷积层的区别、卷积神经网络结构、卷积运算、填充、卷积步幅、三维数据卷积、多维卷积核运算以及批处理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 欲盖弥彰下一句是什么呢?
- 下一篇: 机器学习入门(16)— CNN 池化层概
