機器學習入門(15)— 全連接層與卷積層的區別、卷積神經網絡結構、卷積運算、填充、卷積步幅、三維數據卷積、多維卷積核運算以及批處理

卷積神經網絡(Convolutional Neural Network,CNNCNN 被用於圖像識別、語音識別等各種場合,在圖像識別的比賽中,基於深度學習的方法幾乎都以 CNN 爲基礎。

1. 全連接層

1.1 全連接層網絡結構

之前介紹的神經網絡中,相鄰層的所有神經元之間都有連接,這稱爲全連接(fully-connected )。另外,我們用 Affine 層實現了全連接層。如果使用這個 Affine 層,一個 5 層的全連接的神經網絡就可以通過圖7-1 所示的網絡結構來實現。

全連接層
Affine 層後面跟着激活函數 ReLU 層(或者 Sigmoid 層)。這裏堆疊了4 層Affine-ReLU 組合,然後第 5 層是 Affine 層,最後由 Softmax 層輸出最終結果(概率)。

1.2 全連接層缺陷

在全連接層中,相鄰層的神經元全部連接在一起,輸出的數量可以任意決定。

全連接層存在什麼問題呢?那就是數據的形狀被“忽視”了。比如,輸入數據是圖像時,圖像通常是高、長、通道方向上的 3 維形狀。但是,向全連接層輸入時,需要將 3 維數據拉平爲 1 維數據。實際上,前面提到的使用了 MNIST 數據集的例子中,輸入圖像就是 1 通道、高 28 像素、長 28 像素的(1, 28, 28)形狀,但卻被排成1 列,以 784 個數據的形式輸入到最開始的 Affine 層。

圖像是3 維形狀,這個形狀中應該含有重要的空間信息。比如,空間上鄰近的像素爲相似的值、RBG 的各個通道之間分別有密切的關聯性、相距較遠的像素之間沒有什麼關聯等,3 維形狀中可能隱藏有值得提取的本質模式。

但是,因爲全連接層會忽視形狀,將全部的輸入數據作爲相同的神經元(同一維度的神經元)處理,所以無法利用與形狀相關的信息。

2. 卷積神經網絡

如圖 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 的填充”是指用幅度爲 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 個元素。

步幅爲2
在圖 7-7 的例子中,對輸入大小爲 (7, 7) 的數據,以步幅 2 應用了濾波器。通過將步幅設爲 2,輸出大小變爲 (3, 3)。像這樣,步幅可以指定應用濾波器的間隔。

綜上,增大步幅後,輸出大小會變小。而增大填充後,輸出大小會變大。

如果將這樣的關係寫成算式,會如何呢?接下來,我們看一下對於填充和步幅,如何計算輸出大小。

這裏,假設輸入大小爲 (H,W) ,濾波器大小爲 (FH, FW) ,輸出大小爲 (OH,OW) ,填充爲 P ,步幅爲 S 。此時,輸出大小可通過式 (7.1) 進行計算。
式 7.1
計算示例如下:
計算例子
如果式 7.1 中當輸出大小無法除盡時(結果是小數時),需要採取報錯等對策。順便說一下,根據深度學習
的框架的不同,當值無法除盡時,有時會向最接近的整數四捨五入,不進行報錯而繼續運行。

2.5 三維數據的卷積運算

圖7-8 是卷積運算的例子,圖7-9 是計算順序。這裏以 3 通道的數據爲例,展示了卷積運算的結果。和 2 維數據時(圖7-3 的例子)相比,可以發現縱深方向(通道方向)上特徵圖增加了。通道方向上有多個特徵圖時,會按通道進行輸入數據和濾波器的卷積運算,並將結果相加,從而得到輸出。

圖 7.8
在這裏插入圖片描述
需要注意的是,在 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.10
如果要在通道方向上也擁有多個卷積運算的輸出,就需要用到多個濾波器(權重)。用圖表示的話,如圖7-11 所示。
圖 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
圖 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
圖7-13 的批處理版的數據流中,在各個數據的開頭添加了批用的維度。像這樣,數據作爲 4 維的形狀在各層間傳遞。這裏需要注意的是,網絡間傳遞的是 4 維數據,對這 N 個數據進行了卷積運算。也就是說,批處理將 N 次的處理彙總成了 1 次進行。

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