前文傳送門:
深度學習筆記1:利用numpy從零搭建一個神經網絡
深度學習筆記2:手寫一個單隱層的神經網絡
深度學習筆記3:手動搭建深度神經網絡(DNN)
深度學習筆記4:深度神經網絡的正則化
深度學習筆記5:正則化與dropout
深度學習筆記6:神經網絡優化算法之從SGD到Adam
深度學習筆記7:Tensorflow入門
深度學習筆記8:利用Tensorflow搭建神經網絡
深度學習筆記9:卷積神經網絡(CNN)入門
深度學習筆記10:三維卷積、池化與全連接
深度學習筆記11:利用numpy搭建一個卷積神經網絡
深度學習筆記12:卷積神經網絡的Tensorflow實現
深度學習筆記13:Tensorflow實戰之手寫mnist手寫數字識別
深度學習筆記14:CNN經典論文研讀之Le-Net5及其Tensorflow實現
深度學習筆記15:ubuntu16.04 下深度學習開發環境搭建與配置
深度學習筆記16:CNN經典論文研讀之AlexNet及其Tensorflow實現
深度學習第17講:keras入門和快速上手指南
深度學習第18講:CNN經典論文研讀之VGG網絡及其tensorflow實現
深度學習第19講:CNN經典論文研讀之殘差網絡ResNet及其keras實現
在 2014 年 ILSVRC 比賽中,VGGNet 獲得了當時的第二名的成績,那麼第一名是誰呢?當時的 VGGNet 就已經很厲害了,難得同屆選手還有更厲害的?很不巧,還真有。當年度取得冠軍的方案網絡由谷歌團隊研發,並且為了致敬 Yann Lecun 的 LeNet-5,將其命名為 GoogLeNet。GoogLeNet 在借鑑 1x1 卷積思想的基礎上,通過濾波器組合構建 Inception 模塊,使得網絡可以走向更深且表達能力更強。從 2014 年獲得當屆 ILSVRC 冠軍的 Inception v1 到現在,光 Inception 網絡就已經更新到 v4 了,而後基於 Inception 模塊和其他網絡結構的組合而成的網絡就更多了,比如說 Inception Resnet。
1x1 卷積通過前面的學習大家都知道卷積操作是卷積神經網絡的核心操作了,在之前我們通常會用到各種尺寸的卷積核,比如說 3x3 卷積、5x5 卷積、7x7 卷積等等。但今天我們需要提一下 1x1 卷積。這似乎有些蠢,直觀上理解 1x1 卷積好像沒什麼用,就是簡單的數字相乘而已,對於通道數較小的圖片確實如此,但如果我們考慮一個 6x6x32 的圖片呢?
考慮用一個 1x1x32 的卷積核對 6x6x32 的圖片進行卷積。如下圖所示,具體而言就是計算左圖中 32 個數字和卷積核中 32 個數字對應元素乘積之和,然後進行激活操作。
濾波器中的通道數 32 可以這麼理解:一個神經元的輸入是 32 個數字,對輸入圖像做一個切片的話,即相同高度和寬度上某一切片上的 32 個數字具有不同的通道數,乘以濾波器的 32 個數字權重,然後應用激活函數得到 1x1 卷積結果。所以從這個角度看我們可以將 1x1 卷積理解為對這個不同通道上的 32 個數字應用一個全連接層,這個全連接層輸入 32 個數字,輸入為 6x6x濾波器個數。
所以 1x1 卷積的一個重要作用就是縮減通道數,對於一個 28x28x192 的輸入,我們如何將其壓縮成 28x28x32 的大小呢?利用 1x1 卷積的話就是使用 32 個大小為 1x1x192 的卷積核進行卷積,卷積結果大小為 28x28x32。這樣就起到了壓縮通道的作用了,這種壓縮或保持通道數不變的方法在接下來我們要講的 GoogLeNet 中的 Inception 模塊中很有用,我們接著往下看。
Inception 模塊通常在構建卷積結構時,我們需要考慮是使用 1x1 卷積、3x3 卷積還是 5x5 卷積及其是否需要添加池化操作。而 GoogLeNet 的 Inception 模塊就是幫你決定採用什麼樣的卷積結構。簡單而言,Inception 模塊就是分別採用了 1x1 卷積、3x3 卷積和 5x5 卷積構建了一個卷積組合然後輸出也是一個卷積組合後的輸出。如下圖所示:
對於 28x28x192 的像素輸入,我們分別採用 1x1 卷積、3x3 卷積和 5x5 卷積以及最大池化四個濾波器對輸入進行操作,將對應的輸出進行堆積,即 32+32+128+64=256,最後的輸出大小為 28x28x256。所以總的而言,Inception 網絡的基本思想就是不需要人為的去決定使用哪個卷積結構或者池化,而是由網絡自己決定這些參數,決定有哪些濾波器組合。
Inception 模塊有兩種形式,一種是原始模塊,另一種是帶有維度削減的模塊。其結構如下圖所示:
第二個版本的 Inception 模塊採用了大量的 1x1 卷積,目的就是起到通道壓縮作用。
構建好 Inception 模塊後,將多個類似結構的Inception模塊組合起來便是一個Inception 網絡,類似下圖:
一個完整的 Inception 網絡結構如下所示:
以上便是 Inception 網絡的基本構造。這是當年獲得冠軍的 Inception V1 版本,可以看到模型層數很深了,網絡更深提取各種層級的特徵更加充分。除此之外,Inception V1 在最後兩個全連接層中採取了一個全局平均池化層來代替全連接層。因為全連接層的參數數量龐大,通常是導致過擬合的直接原因,這裡用全局平均池化來代替,可以很大程度上緩解過擬合的情況。完整的 Inception V1 的結構信息如下表所示:
至於 Inception V1 的效果,當然是收割各種冠軍和頭名啦。
Inception V1 之後,又在其基礎上出現了 V2 V3 和 V4 版本以及 Xception,總之以 Inception 網絡為主體的 GoogLeNet 不斷優化和改進,稱為深度卷積網絡的一大重要分支。至於如何使用 Tensorflow 實現 Inception V1網絡,GitHub 上有眾多開源,筆者就不在此寫了。
註:本深度學習筆記系作者學習 Andrew NG 的 deeplearningai 五門課程所記筆 記,其中代碼為每門課的課後assignments作業整理而成。
參考資料:
https://www.deeplearning.ai/
Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[J]. 2014:1-9.
作者最新課程,限時優惠中
掃碼或點擊閱讀原文了解詳情&報名