Inception 系列 — InceptionV2, InceptionV3

李謦伊
謦伊的閱讀筆記
9 min readNov 7, 2020

之前有介紹過 InceptionV1 的架構,本篇將要來介紹 Inception 系列 — InceptionV2, InceptionV3 的模型

InceptionV2

InceptionV2 於2015年2月提出,基於 InceptionV1 做了兩項改進:

  1. 引入了 Batch Normalization,這部分在上篇文有介紹過: https://medium.com/@chingi071/batch-normalization-%E4%BB%8B%E7%B4%B9-135a24928f12
  2. 使用兩個 3x3 卷積層替代 5x5 卷積層,其操作就是採用小卷積核來代替大卷積核,論文連接: https://arxiv.org/pdf/1512.00567.pdf

在 VGG 中有提到使用多個較小的卷積核除了可以減少參數計算量外,還可以達到與大卷積核相同的感受野,因此 InceptionV2 使用兩個 3x3 卷積層替代 5x5 卷積層

下圖左邊是 Inception 原本的架構,而右邊是將 5x5 卷積層改為兩個 3x3 卷積層後的 InceptionV2 架構

InceptionV3 (2015)

InceptionV3 跟 InceptionV2 出自於同一篇論文,發表於同年12月,論文中提出了以下四個網路設計的原則

1. 在前面層數的網路架構應避免使用 bottlenecks,雖然 bottlenecks 可以有效的降低參數計算量,但同時也會失去特徵訊息。從輸入到輸出特徵的維度應緩慢的下降,避免維度過度地壓縮

2. 高維度的特徵更適合在網路的局部處理,並且在網路中增加非線性可以讓訓練更快

3. 空間聚合可以先通過低維度進行降維,不會影響模型能力

4. 增加網路的寬度與深度能夠提升效能,若是平衡兩者可以達到更好的效能

InceptionV3 基於 InceptionV2 做了以下這些改進

  • 將卷積分解為不對稱卷積

由 InceptionV2 得知將大卷積核拆解為多個 3x3 卷積核可以減少計算量,那如果再進一步分解成更小的卷積核效果會怎麼樣? 因此 InceptionV3 嘗試將卷積核分解成不對稱的卷積核並比較其計算量

若將 3x3 卷積層分解為 1x3 及 3x1 卷積層,可以減少 33% 的計算量;但若是分解為兩個 2x2 的卷積層,只能減少 11% 的計算量

作者在實驗中發現不對稱卷積不適合用於前面層的卷積,而是在中等的特徵圖效果比較好,其中中等特徵圖的尺寸範圍在 12~20 之間

InceptionV3 在中間層卷積的中等尺寸 17x17 特徵圖使用 1x7 及 7x1 的卷積核,在降低參數量的同時,也增加了模型深度,獲得了不錯的結果

除此之外,作者根據網路設計原則 — 高維度的特徵更容易處理、有利於訓練,因此在 8x8 卷積層中採用增加網路寬度的結構,以產生高維度的特徵

  • 輔助分類器的作用

InceptionV1 的架構有使用兩個輔助分類器為了提高模型的穩定性與收斂速度。但在實驗中,作者發現輔助分類器在訓練早期並沒有效果,而是在訓練後期,有輔助分類器的模型才開始超越未使用輔助分類器模型的準確度,達到穩定的效果

另外,作者拿掉較低層的輔助分類器,發現對模型並不會有負面的影響,因此作者推測輔助分類器有助於較低特徵的演變是不正確的。並且由於輔助分類器若具有 Batch Normalization 或是 Dropout 層,會使得模型效能更好,也因此認為輔助分類器有正則化的作用

下圖是 InceptionV3 用於 17x17 特徵圖的輔助分類器,有 Batch Normalization 層的話可以提升 0.4% 的 top-1 準確率

  • 縮小特徵圖

通常縮小特徵圖有兩種方法: 下圖右邊架構的方式是先進行 Inception,再通過池化層來下採樣,但是計算量是左圖的三倍;下圖左邊架構則是先進行池化層來下採樣,再進行 Inception,但這個操作就會產生網路設計原則第一點的問題 — 特徵圖應該要緩慢縮減,若是急遽縮減會導致丟失大量特徵訊息,導致模型較難訓練

因此 InceptionV3 採用了新的方法,使用 stride=2 的卷積層與池化層併行操作以縮小特徵圖,減少參數量的同時,還能避免使用 bottlenecks

  • InceptionV3 的架構

InceptionV3架構有三個 Inception module,分別採用不同的結構 (figure5, 6, 7),而縮小特徵圖的方法則是用剛剛講的方法 (figure 10),並且將輸入尺寸更改為 299x299

與 InceptionV2 不同的是,InceptionV3 的第一個 Inception module (figure 5) 是將 7x7 卷積層替代為三個 3x3 卷積層,而 InceptionV2 則是將兩個 5x5 卷積層改為兩個 3x3 卷積層

  • Label Smoothing Regularization (LSR)

作者提出了一個正則化的機制 LSR,在輸出加入噪聲 (noise) 以對模型進行約束,主要是為了緩解 label 不夠 soft 而導致 overfitting 的問題

原本模型的 loss 計算是採用 cross-entropy,其中 K 為類別數、p(x) 為預測概率、q(x) 為真實值的分佈

每個訓練資料 x 的輸出通常會經過 softmax 進行歸一化,因此在每個類別 k 的預測概率 p(k|x) 為

對於 ground truth 則是採用 one-hot-to-vec 將 label 進行編碼,因此真實值的分佈為

而這樣的方式會存在兩個問題:

1. 可能會導致過擬合的現象,因為模型會傾向於訓練集類別數量多的去預測,而不考慮預測分類錯誤的問題,導致模型泛化能力較差

2. 使模型過於自信,因為模型會鼓勵預測最大值與其他預測值的差距拉大,因而將預測值的信心程度放大,但如此一來反而會降低模型的適應能力,並且若是標註樣本有誤,容易對訓練產生負面影響

為了解決這兩個問題,在真實分佈中加入一個關於 label 但獨立於訓練資料 x 的已知分佈,也就是對模型進行了正則化,讓模型不那麼自信

其中 δ 函數是指當預測類別等於真實類別時,δ為1;兩者不相等時,δ為0,也就是指 one-hot-to-vec 的意思

而作者使用均勻分佈 u(k)=1/K 作為已知分佈

因此加入正則化方法 Label Smoothing Regularization (LSR),loss function 變為

  • 模型的訓練方法

1. 使用 TensorFlow 分佈式的機器學習系統在 50 片 NVidia Kepler GPU 上進行訓練,設定 batch size=32, epoch=100

2. 最好的模型使用 RMSProp,設定 decay=0.9, ε=1

3. Learning rate 設定0.045,並且於每兩個 epoch 使用 0.94 的指數率衰減

4. 使用梯度裁減 (Gradient Clipping),閾值設定為2,有利於訓練的穩定

梯度裁減 https://kexue.fm/archives/7469

5. 將訓練中不同時刻的模型取其預測值,並進行平均作為評估模型的方法

  • 測試低分辨率輸入圖像的效能

作者想測試在相同的計算量下,使用較高分辨率的圖像對於模型預測會有多少幫助,因此使用以下三種不同的分辨率的圖像作為輸入

1. 79x79 的感受野、stride=1、第一層不使用池化層

2. 151x151 的感受野、stride=1、第一層使用最大池化層

3. 299x299 的感受野、stride=2、第一層使用最大池化層

由圖下可以得知在相同計算量下,這三種不同分辨率圖像輸入的 Top-1 準確率是差不多的,但是較低分辨率的模型需要較長的訓練時間。因此可以將高成本低分辨率的模型用於小物件的偵測中

  • InceptionV3 與其他模型的結果比較

在 144x144 的輸入上,InceptionV3 可以達到 Top-1 error 17.2%、Top-5 error 3.58%。其中 BN-Inception 指的是 InceptionV2

Inception 文章

Inception 系列 — InceptionV4, Inception-ResNet-v1, Inception-ResNet-v2

Inception 系列 — Xception

--

--