1. 程式人生 > >深度學習三:卷積神經網路

深度學習三:卷積神經網路

# 卷積神經網路 **卷積神經網路(Convolutional Neural Network,CNN)**又叫**卷積網路(Convolutional Network)**,是一種專門用來處理具有類似網格結構的資料的神經網路。卷積神經網路一詞中的卷積是一種特殊的線性運算。卷積網路是指那些至少在網路的一層中使用卷積運算來代替一般的矩陣乘法的神經網路。 卷積神經網路的出現,極大的緩解了全連線神經網路中存在的一個典型的問題:資料的波形被忽視了!眾所周知,全連線神經網路在進行資料輸入的時候,需要將一個二維或者三維的資料展平為一維的資料。而我們知道在計算機中圖形是一個三維的資料,因為需要儲存一些類似 RGB 各個通道之間關聯性的空間資訊,所以三維形狀中可能隱藏有值得提取的本質模式。而全連線展平會導致形狀的忽視。因此需要利用卷積神經網路來保持形狀的不變。 典型應用場景:影象識別、語音識別等。 典型結構如下圖所示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002215856485-2084724829.png) ## 神經網路中的各層 ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002215911663-1122067096.png) - **輸入層(Input Layer)**:主要是對原始的影象資料進行預處理 - **卷積層(Convolution Layers)**:從前一層提取移位不變特徵。即當輸入資料是影象的時候,卷積層會以3維資料的形式接收輸入資料,並同樣以3維資料的形式輸出至下一層。因此,在CNN中,可以(有可能)正確理解影象等具有形狀的資料。注:卷積層的輸入和輸出資料通常又被稱為特徵圖(Feature Map)。卷積層的輸入資料稱為輸入特徵圖(Input Feature Map),輸出資料稱為輸出特徵圖(Output Feature Map)。 - **池化層(Pooling Layers)**:將前一層的多個單元的啟用組合為一個單元。池化是縮小高、長方向上的空間的運算,通常減小一半。 - **全連線層(Fully Connected Layers)**:收集空間擴散資訊 - **輸出層(Output Layer)**:選擇類 # 卷積操作 卷積運算相當於影象處理中的“濾波器運算”。卷積運算會對輸入資料應用**濾波器(Filter)**。 假設,一個初始的影象大小為 $J*K$, 同時有 $L$ 個管道,如下圖所示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002215928440-1066946880.png) 我們應用一個 $M*N$ 大小的濾波器。圖中綠色的格子就是一個 3*3 的濾波器。卷積運算的整個操作為:將各個位置上濾波器的元素和輸入的對應元素相乘,然後再求和(整個操作也被稱為乘積累加運算),然後,將這個結果儲存到輸出的對應位置。 將計算過程公式化,公式如下: $$ Z_{j,k} = b + \sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K_{m,n}V_{j+m,k+n} $$ 其中 $K_{m,n}$ 表示濾波器的 $m,n$ 位置的資料,$V_{j+m,k+n}$ 表示影象的 $j+m,k+n$ 位置的資料,$b$ 是偏置項。 將計算過程影象化,如下圖所示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002215944050-1737099845.png) 其中,濾波器的**引數**就是**權重(Weights)**,同時還有有個**偏置項(Bias)**,這個偏置項會被加到濾波器最後的輸出上。 ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002215952829-1620792349.png) ## 權重共享 我們可以根據上圖看到,對一層中的每一個 $M×N$ 塊輸入應用相同的權值,計算卷積層中的下一個隱藏單元,這就是個**權重共享(Weight Sharing)**的概念。 ## 填充 **填充(Padding)**:在進行卷積操作之前,有時候要向周圍填入固定的資料,比如用數值 0 進行填充,也叫**零填充(Zero Padding)**。 應用填充之後,卷積層的輸出大小將會和卷積之前的層一樣,如圖所示,其中粉色的 6 * 7 的格子是原始的影象尺寸,我們在周圍加上一圈數值為 0 的格子,用白色表示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220006597-728327103.png) 以步幅 1 進行卷積,如下圖所示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220019588-571164480.png) 最終我們得到了一個大小為 6 * 7 的藍色的卷積層,和原始影象的尺寸相同,如下圖所示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220030726-1618510749.png) 這主要也是為了避免卷積過程中過一個典型的問題:如果每次驚醒卷積運算都會縮小空間,那麼在某個時刻輸出大小就有可能變成 1,導致無法再應用卷積運算。為了避免這個情況的出現,就需要使用填充。 ## 步幅 **步幅(Stribe)**:應用濾波器間隔的位置稱為步幅。在上面的例子中,採用的步幅為 1。 我們可以將步幅改為 2,那麼卷積過程就會變成下圖所示的: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220040795-1556095509.png) 可以看到應用濾波器的視窗的間隔變成了 2 個元素,如下圖所示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220054288-215075995.png) 最終,新的一層的尺寸變為一個 3 * 4 的層。用公式表示為(設步長為$s$): $$ (1+\frac{(J-M)}{s}), (1+\frac{(K-N)}{s}) $$ ## 3 維資料的卷積運算 在一開始,雖然我們假設了一個初始的影象大小為 $J*K$, 同時有 $L$ 個管道。但是我們討論的卷積操作一直只在單層上進行的,下面我們就討論一下在 3 維情況下的卷積運算。 ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220107574-1603722015.png) 當在通道方向上有多個特徵圖的時候,會按照通道進行輸入資料濾波器的卷積運算,並將結果相加,從而得到輸出。計算步驟如下圖所示: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220118554-1585605933.png) 至此,我們的公式可以總結為: $$ Z^i_{j,k} = b^i + \sum_l\sum_{m=0}^{M-1}\sum_{n=0}^{N-1}K^i_{m,n}V^l_{j+m,k+n} $$ 其中 $K^i_{m,n}$ 表示第 $i$ 個濾波器的 $m,n$ 位置的資料,$V^l_{j+m,k+n}$ 表示影象第 $l$ 層通道的 $j+m,k+n$ 位置的資料,$b^i$ 是第 $i$ 個偏置項。根據之前的權重共享的概念,我們可以知道,每一層通道是共用一個濾波器的相同權重的,同樣也共用相同的偏置。 # 池化 **池化(Pooling)**是縮小高、長方向上的空間的運算。 最典型的池化過程叫做**最大池化(Max Pooling)**,如下圖所示,這是一個單層的池化: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220130052-1804774961.png) 圖中所示的步驟是,我們劃定一個 $2 * 2$ 的視窗,找出這個視窗中最大的那個值,作為下一層的資料,這個視窗以步幅 2 進行移動。一般來說,池化的視窗大小會和步幅設定成相同的值。 除了 Max Pooling 之外,還有 **Average Pooling/Mean Pooling**,即**平均池化**,是計算目標區域的平均值。在影象識別領域中,主要使用 Max Pooling。 ## 重疊池化 **重疊池化(Overlapping Pooling)**是 AlexNet 中的一個概念。Overlapping Pooling 的概念和 No-Overlapping Pooling的概念相對。 - Overlapping Pooling:當步幅大於視窗寬度,會使池化視窗產生重疊區域。可以提升預測精度、緩解過擬合。 - No-Overlapping Pooling:步幅和視窗寬度相同,池化視窗沒有重疊區域。如上圖的展示。又叫一般池化,General Pooling ## 池化層的特徵 - 沒有要學習的引數:池化層和卷積層不同,沒有要學習的引數。池化層只是從目標區域中取最大值或平均值。 - 通道數不發生變化:經過池化運算,輸入資料和輸出資料的通道數不會發生變化。即計算是按照通道獨立進行的。 - 對微小的位置變化具有魯棒性(健壯):輸入資料發生微小偏差時,池化仍會返回相同的結果。 # 典型的CNN ## LeNet LeNet 是在 1998 年提出的進行手寫數字識別的網路。具有連續的卷積層和池化層(準確的講是隻抽取元素的子取樣層),最後經全連線層輸出結果。基本結構如下: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220146125-1823227667.png) - C1:第一個卷積層的 5×5 的視窗從原始的 32×32 的影象中提取出 28×28 的特徵陣列。 - S2:然後再進行子抽樣,將其大小減半為14×14。 - C3:第二個卷積層使用另一個 5×5 的視窗提取一個 10×10 的特徵陣列。 - S4:第二個子取樣層將其簡化為 5×5。 - C5、F6:這些啟用然後通過兩個全連線層進入對應數字 ‘0’ 到 ‘9’ 的10個輸出單元。 和現在的 CNN 相比,LeNet 有幾個**不同點**: - 啟用函式:LeNet中使用 Sigmoid 函式,而現在的 CNN 中主要使用 ReLU 函式。 - 池化/子取樣:LeNet 中使用子取樣縮小中間資料的大小,而現在的 CNN 中 Max Pooling 是主流。 ## AlexNet AlexNet 是一個引發深度學習熱潮的導火索。基本結構如下: ![](https://img2020.cnblogs.com/blog/1378215/202010/1378215-20201002220157193-1767915935.png) AlexNet 疊有多個卷積層和池化層,最後經由全連線層輸出: - 5 個卷積層和 3 個全連線層 - 利用重疊步幅的最大池化層 - 1000 個類的 Softmax - 兩個只在特定層進行互動的 GPU。上圖中就是利用了兩個 GPU,在第二個 Max Pooling 層進行互動,一直到最後進行輸出兩個 GPU 一直是在並行運算。 AlexNet 雖然在結構上和 LeNet 沒有很大的不同,但是也有一些細節上的**差異**: - AlexNet 的啟用函式使用的是 ReLU - 使用進行區域性正規化的 LRN(Local Response Normalization)層 - 使用 Dropout # 面試常見問題 - 神經網路中的權重共享是什麼? - $1 * 1$ 卷積的作用 - 卷積層和池化層有什麼區別 - LeNet-5 結構 - AlexNe