--- tags: Deep learning --- # 論文閱讀: GoogLeNet/Inception(Going deeper with convolutions) [論文](https://arxiv.org/pdf/1409.4842.pdf) ## Introduction 縱使VGG在ImageNet的比賽(ILSVRC14)上表現優異,然而它也只能屈於亞軍,在當時擊敗它的即是此次要討論的GoogLeNet。 在GoogLeNet出來之前,主流的網路結構突破大致是網路更深(即層數增加),網路更寬(即神經元數目增多),但這樣做存在一些缺點: * 當訓練集有限時,引數過多,模型會出現過擬合 * 網路越大,計算複雜度越大,設計起來越困難 * 當層數增多時,梯度越往後越容易消失 於是,當是GoogLeNet提出了一種核心架構: Inception。Inception從提出至今,歷經不斷的修改已經從V1來到V4。相對於VGG,GoogLeNet考量到有限的資源,優化模型使其需要的記憶體或計算量更少,然而,與此同時卻還能超越VGG的performance。 ## Related Work 主要提及對GoogLeNet的設計帶來啟發的相關論文,包含了LeNet、1×1 的convolutional layers、R-CNN等等(有興趣可以直接參考論文內容) ## Motivation and High Level Considerations 增加CNN的深度顯然是增加其performance的"簡單"方法,尤其是針對龐大的train資料時更是如此。然而這會帶來兩個主要的問題。 * 使用大量的參數過多,容易出現overfitting * 計算資源的有限性: 每兩個convolutional layers串在一起,隨著filer數量的增加,導致計算量的增加。然而增加的capacity使用效率不高(舉例來說,大多數weight最終接近於零)便產生了浪費。 如果將fully-connected換成sparsely connected architectures,理想上就能夠節省使用的參數。然而即使減少arithmetic operations,受限於硬體的限制,由於大部分硬體是針對dense matrix而非sparse計算優化的,並不能顯著的提升速度。 於是論文提出了另一個的想法: 是否有方法可以保持network的sparsity,同時又能利用dense matrix的高計算效能呢?答案是肯定的。這便造就了Inception的誕生,往下將深入研究其中的架構細節。 ## Architectural Details  最原始的Inception module中,1×1 conv, 3×3 conv, 5×5 conv, 與3×3 max pooling 會對輸入一起作用,並且將所有結果串接在一起作為output。換句話說,輸入的影像會經過不同尺寸的conv/max pooling,因此能擷取出的多元的特徵。 然而,所有的conv的輸入都是基於前一層的所有輸出,明顯對於計算量有很大的負擔(何況還有5x5的conv)。並且,通過max-pooling的影像channel是會維持不變的,這將導致隨著CNN的深度更深,特徵的channel變得更大。  因此,論文對原本的Inception module做了調整,如上圖。使用了1x1 conv,這不僅能對特徵影像降維,同時也增加網路的non-linearity。(可以參考此連結:[卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼](https://medium.com/@chih.sheng.huang821/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-convolutional-neural-network-cnn-1-1%E5%8D%B7%E7%A9%8D%E8%A8%88%E7%AE%97%E5%9C%A8%E5%81%9A%E4%BB%80%E9%BA%BC-7d7ebfe34b8)) 整體而言,Inception Network便是堆疊上面的module,中間某些層結合stride=2的max-pooling降低解析度。 考量到memory的使用,論文表示在網路最初使用Inception module,在深層則使用傳統的convolution layer,是比較好的做法(但並非必要)。 ## GoogLeNet 如下表/圖。為GoogLeNet的基本架構。   架構的細節如下: * 所有的conv(包含Inception內的)都接續一層ReLu * 原始輸入影像為224x224x3,並且影像的每個pixel value減平均值處理 * 表中的"#3x3 reduce","#5x5 reduce"表示在3x3,5x5 conv操作之前使用了1x1 conv的數量。"pool proj"則表示在max pooling後的1x1 conv數量。 * 參考了論文"Network in network"([細節可以看這篇筆記](https://allen108108.github.io/blog/2019/10/07/%5B%E8%AB%96%E6%96%87%5D%20Network%20In%20Network/)),在網路的最後使用了average pooling來代替原本比較常見的fully-connected layer(不過考量到網路的彈性,方便應用在不同的label set,最後仍加了一層fully-connected)。 average pooling大致有幾個好處: 1. 增強了 feature map 與類別之間的關係 2. Global Average Pooling 中沒有參數需要優化,因此可減少參數的使用,並且避免 overfitting 3. Global Average Pooling 將空間資訊結合,對輸入特徵的空間轉換具有更好的強健性。 * 隨著網路的加深,gradient vanishing的問題也需要被解決。GoogLeNet的作法是在中間branch出兩個輔助分類器,這兩個分類器僅在training階段被使用。目的是在網路中間就做分類,並將計算出的loss(weighted x0.3)加到total loss(我認為就是中間式監督的概念)。藉此,loss就不會隨著傳遞越深而完全消失。 ## Result ILSVRC 2014 Classification Challenge 的結果如下:  GoogLeNet訓練了7種模型(差別在於sampling的方法、以及資料input的order有所差異)來做ensemble learning testing階段使用了multi-scale與multi-crop: * Multi-scale testing: 將短邊scale到256, 288, 320, 352. (4種scale) * Multi-crop testing: 對於每種scale,切分成左、中、右或者上、中、下(3塊矩形),對於每塊矩形,從四個角或者中間計算起的224x224範圍作crop,加上直接把該矩形resize到224x224的結果(6種),加上水平翻轉的版本(2種)。 因此可以產生出4x3x6x2個crop image。 實驗的結果如下圖。我們可以看到,除了深度學習模型架構之外,**ensemble方法、scale/crop的方法對於預測結果也將有影響**(換句話說,如何輸入testing image也是一門學問,根據適當的調整也許能得到更好的預測結果)  此外,GoogLeNet也可以用在產生bounding box的detection任務。ILSVRC 2014 Detection Challenge 的結果如下(產生bounding box的作法細節有興趣可以參考論文):  ## Conclusion GoogLeNet通過其設計減少了運算單元的使用量,同時兼顧其模型的預測能力。此外,也可以看到GoogLeNet被應用在detection的任務上的潛力。 ## Reference [CNN經典模型:GoogLeNet(從Inception v1到v4的演進) ](https://www.itread01.com/content/1544969366.html) [Review: GoogLeNet (Inception v1)— Winner of ILSVRC 2014 (Image Classification)](https://medium.com/coinmonks/paper-review-of-googlenet-inception-v1-winner-of-ilsvlc-2014-image-classification-c2b3565a64e7)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up