Inception 系列 — InceptionV4, Inception-ResNet-v1, Inception-ResNet-v2
上篇文介紹了 InceptionV2 及 InceptionV3,本篇將接續介紹 Inception 系列 — InceptionV4, Inception-ResNet-v1, Inception-ResNet-v2 模型
InceptionV4, Inception-ResNet-v1, Inception-ResNet-v2 來自於同一篇論文,作者討論了兩種方式改善網路架構: 純粹使用 Inception 架構、將 Inception 與 ResNet 結合,並比較其效能
論文連接: https://arxiv.org/pdf/1602.07261.pdf
InceptionV4 (2016)
首先討論 InceptionV4 的架構,由好幾個 Inception module 組成,並且在最後 softmax 輸出之前加入了 Dropout (keep 設定值為 0.8),防止過擬合
接下來看 InceptionV4 的子模塊
- Stem module
Stem 就是替代 InceptionV3 前面層的 3x3 卷積層 (Inception module 前的網路層),並且將結構變得更複雜,輸出的維度也更多 (InceptionV3: 35x35x288,InceptionV4: 35x35x384)
結構中使用了 InceptionV3 提出的池化層與卷積層的併行結構、不對稱卷積核,在減少計算量的同時,不丟失大量特徵訊息。另外也使用 1x1 卷積層來降低維度。其中 module 中的 V 指的是 valid padding,而其餘網路層則是使用 same padding
- Inception module
InceptionV4 使用與 InceptionV3 一樣的 Inception module 架構,只是個數不同:InceptionV3 分別為 3、5、2個,而 InceptionV4 則是 4 個 Inception-A、7 個 Inception-B、3 個 Inception-C
由於 Inception module 架構更深,因此加入了 Reduction-A 和 Reduction-B 以降低 feature map 尺寸,結構中也是使用併行、不對稱卷積層、1x1 卷積層來降低計算量
Inception-ResNet-v1 (2016)
接著來看 Inception 與 ResNet 結合後的網路架構,作者討論了兩種架構 Inception-ResNet-v1、Inception-ResNet-v2,兩者的整體結構一樣,差別在於 module 結構不太一樣
以下是 Inception 與 ResNet 結合的整體架構
接下來一一討論 Inception-ResNet-v1 內部 module 的結構
- Stem
結構與 InceptionV3 前面層的卷積層類似,只是將其中一層 3x3 卷積層改為 1x1,並且維度有些不同
- Inception-ResNet module
這裡的 module 就是將Inception 與 ResNet 結合,而且比 InceptionV4 更多數量,分別有 5 個 Inception-ResNet-A、10 個 Inception-ResNet-B、5 個 Inception-ResNet-C,並且在每一個 Inception-ResNet module 前都加入 Batch Normalization 層
從圖中可以發現 Inception 部分的結構一樣使用不對稱卷積層、1x1 卷積層,但比之前精簡,然後在最後一層使用 1x1 卷積層用來處理維度不一致的問題
Inception-ResNet-v1 一樣也有使用 Reduction-A 和 Reduction-B 來降低 feature map 的尺寸,Reduction-A 使用的跟 InceptionV4 一樣,而 Reduction-B 則是使用以下結構
介紹完 Inception-ResNet-v1 的架構後,來比較看看 Inception-ResNet-v2 的結構~
Inception-ResNet-v2 (2016)
前面有說到 Inception-ResNet-v1、Inception-ResNet-v2 的整體結構一樣,差別在於內部 module 有所不同。Inception-ResNet-v2 中 Stem、Reduction-A 使用跟 InceptionV4 一樣的架構,其中 Reduction-A 的參數數目不同,下表為 InceptionV4、Inception-ResNet-v1、Inception-ResNet-v2 中的Reduction-A 個別參數所使用的數量
- Inception-ResNet module
大致架構與 Inception-ResNet-v1 差不多,差別在於維度不同
而用來降低 feature map 尺寸的 Reduction-B 也只差在維度的不同
另外,作者在使用 ResNet 時發現當 filter 的個數太多 (超過 1000) 時,網路除了會處於不穩定,也會在訓練早期就產生了網路輸出為0的狀態,就算降低學習率或是增加 Batch Normalization 層都沒辦法解決
因此作者在 ResNet 最後的相加之前使用 activation scaling,將輸出做縮放後再做相加,可以使網路在訓練過程中更穩定,其中 activation scaling 的值設定為 0.1~0.3
最後來看 InceptionV3, InceptionV4, Inception-ResNet-v1, Inception-ResNet-v2 的比較結果
- 模型的訓練方式
1. 使用 TensorFlow 分佈式的機器學習系統在 20 片 NVidia Kepler GPU 上進行訓練
2. 最好的模型使用 RMSProp,設定 decay=0.9, ε=1
3. Learning rate 設定0.045,並且於每兩個 epoch 使用 0.94 的指數率衰減
4. 將訓練中不同時刻的模型取其預測值,並進行平均作為評估模型的方法
由以下結果可以得知 InceptionV3 與 Inception-ResNet-v1 的準確率相當,同時兩者的計算量也差不多;而 InceptionV4 與 Inception-ResNet-v2 的準確率也很接近,兩者的計算量也是差不多的,但是 Inception-ResNet-v1 跟 Inception-ResNet-v2 的收斂速度比 InceptionV3, InceptionV4 還要來的快
由此篇論文的結論來看結構更複雜的 InceptionV4 可以達到更好的準確率,同時也使用了很多技巧來降低計算量,主要以 InceptionV3 提出的併行、不對稱卷積、1x1 卷積層來實現。此外,將 Inception 與 ResNet 結合能夠加快收斂速度,更令人驚豔的是使用更深、層數更多的模型架構,但是計算量跟純粹只有 Inception 的模型差不多