深度學習經典網絡: Inception 系列網絡(Inception v3)

Inception v3:https://arxiv.org/abs/1512.00567
pytorch代碼:https://github.com/pytorch/vision/blob/master/torchvision/models/inception.py
keras代碼:https://github.com/keras-team/keras-applications/blob/master/keras_applications/inception_v3.py

前言:

  Google家的Inception系列模型提出的初衷主要爲了解決CNN分類模型的兩個問題,其一是如何使得網絡深度增加的同時能使得模型的分類性能隨着增加,而非像簡單的VGG網絡那樣達到一定深度後就陷入了性能飽和的困境(Resnet針對的也是此一問題);其二則是如何在保證分類網絡分類準確率提升或保持不降的同時使得模型的計算開銷與內存開銷充分地降低。在這兩個問題中,他們尤其關注第二個問題,畢竟在移動互聯網大行天下的今天,如何將複雜的CNN模型部署在計算與存儲資源均有限的移動端,並使之有效地運行有着更大的實際價值。

一、模型通用設計準則

慎用Bottleneck:
在模型的早期階段,儘量避免使用bottleneck模塊。作者們認爲CNN模型本質上是一個DAG(有向無環圖),其上信息自底向上流動,而每一個bottleneck的使用都會損失一部分信息,因此當我們出於計算與存儲節省而使用bottleneck時,一定要下手輕些(不要一下子使用1x1 conv縮減過多的feature maps的channels數目,如果一定要用reduction模塊也要在模型較靠後的幾層使用)。
增加網絡的寬度是有用的:
撇開計算與內存開銷增加的負面因素不談,每個Conv層的kernels數目增加對於模型處理局部信息,進而更有效地對其表達還是有好處的。竟多些參數就可使得每層獲得多些的表達能力,它還可使得模型收斂得更快。
適當的維度的壓縮不會損失特徵表達能力:
對於網絡後面的feature maps可以使用像bottleneck那樣的模塊對其進行channels數目縮減再進行3x3 conv這樣的較大計算。在其中1x1 conv reduction op的使用不僅不會影響模型精度,反而還能使其收斂速度加快。他們給出的猜測性解釋是,後期較小size的feature maps之上的相鄰units(即channels)之間具有更加的關聯性(即冗餘信息不少),因此可使輸出的channels變少, 而不擔心信息丟失(反而信息被梳理的更清晰、有效)。
平衡網絡的深度和寬度:
一個成功的CNN網絡設計一定要將深度與寬度同時增加,瘦高或矮胖的CNN網絡都不如一個身材勻稱的網絡的效果好。但要考慮計算複雜度的問題。

二、較大卷積核因子分解(factorizing)

  GoogLeNet 網絡優異的性能主要源於大量使用降維處理。這種降維處理可以看做通過分解卷積來加快計算速度的手段。在一個計算機視覺網絡中,相鄰激活響應的輸出是高度相關的,所以在聚合前降低這些激活影響數目不會降低局部表示能力。因此可以利用這些省下來的計算跟存儲資源來增加捲積核的尺寸同時保持可以在一臺電腦訓練每一個模型的能力。
分解成更小的卷積:
首先試着將一個5x5的conv分解爲了兩個累加在一塊的3x3 conv。如此可以有效地只使用約(3x3 + 3x3)/(5x5)=72%的計算開銷(假設輸入和輸出濾波器數量一致)。同時作者實驗發現,兩個3×3的卷積都採用Relu比第一個採用線性激活,第二個採用Relu的效果好。作者認爲在激活前採用BN的前提下,前者增強了網絡學習到空間的多樣性。Inception v1中的Inception模塊可被替換爲如下結構:
在這裏插入圖片描述

圖 1 5×5分解爲兩個3×3

非對稱卷積分解:
將一個3x3的conv分解爲了兩個分別爲1x3與3x1的conv計算。這樣同樣可以只使用約(1x3 + 3x1) / (3x3) = 67%的計算開銷。下圖是此替換的有效性。作者更進一步發揮想象,認爲任一個nxn conv都可通過替換爲兩個分別爲1xn與nx1的convs層來節省計算與內存。作者通過實驗發現,這種分解在網絡早期階段效果不好,在中等grid-sizes階段效果較好(即對於m×n的特徵圖,m和n在 12與20之間). 作者在17×17的特徵圖中將7×7的卷積核進行分解。
在這裏插入圖片描述

圖 2 不對稱卷積分解

在這裏插入圖片描述
圖 3 不對稱inception 模塊(爲了增加filter bank, 只在8×8特徵圖上使用)

三、 輔助分類器的引入

Inception v1引入輔助分類器爲了防止梯度消失加快收斂用的,作者通過實驗發現輔助分類器在訓練前期沒什麼用,後期會比沒有分類器得高一點。最下面的輔助分類器去掉也沒什麼影響,作者猜測輔助分類器主要用來增強模型正則化,因爲輔助分類器加上BN層以及dropout也會增強主分類器性能。

四、更有效的grid-size reduction

深度CNN網絡中一般會不斷使用Pool層來減少feature maps size。這必然意味着傳遞信息的不斷丟失。一般爲了減少信息的過度丟失,在加入Pool層減少feature maps size的同時都會同比例擴大它的channels數目.
真正實行可以有兩個辦法,其一先將channels數目擴大(採用步長爲1的 conv),然後再使用pool層來減少feature map size,不過其中1x1 conv的計算顯然會有非常大的計算開銷, 如圖3右;其二則是先做Pooling減少feature map size,然後再使用conv對其channels數目放大,不過顯然首先使用Pooling的話會造成信息丟失,如圖3左。
在這裏插入圖片描述

圖 4 減少特徵圖尺寸通用的兩種方法

作者提出了一種並行的結構,使用兩個並行的步長爲2的模塊,P 和 C。P是一個池化層,C是一個卷積層,分別使用pool與conv直接減少feature map size的做法分別計算,完了後再將兩者算出的feature maps組合起來.
在這裏插入圖片描述
圖 5 減小grid-size 增加filer banks模塊

五、Inception v3網絡結構

論文中稱該結構爲Inception v2,實際在源碼中稱爲Inception v3, 另外論文描述和實際代碼中有細微差別,以源碼爲準。
keras:https://github.com/keras-team/keras-applications/blob/master/keras_applications/inception_v3.py
pytorch:https://github.com/pytorch/vision/blob/master/torchvision/models/inception.py
主要有以下改動,結構如圖6(跟代碼有差別):
在這裏插入圖片描述

圖 6 Inception v3網絡結構

  • 將7×7卷積分解爲3個3×3的卷積。
  • 35×35的Inception模塊採用圖1所示結構,之後採用圖5類似結構進行下采樣
  • 17×17的Inception模塊採用圖2所示結構,也是採用圖5類似結構下采樣
  • 8×8的Inception模塊採用圖3所示結構,進行較大維度的提升。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章