EfficientNet
單獨適當增大深度、寬度或解析度都可以提高網路的精確性,但隨著模型的增大,其精度增益卻會降低。此外,這三個維度並不是獨立的(如:高解析度影像需要更深的網路來獲取更細粒度特徵等),需要我們協調和平衡不同尺度的縮放,而不是傳統的一維縮放。EfficientNet 的設想就是能否設計一個標準化的卷積網路擴充套件方法,既可以實現較高的準確率,又可以充分的節省算力資源。其通過 NAS(Neural Architecture Search)技術來搜尋網路的影像輸入解析度 r,網路的深度 depth 以及 channel 的寬度 width 三個引數的合理化配置。
- 增加網路的深度 depth 能夠得到更加豐富、複雜的特徵並且能夠很好的應用到其它任務中。但網路的深度過深會面臨梯度消失,訓練困難的問題
- 增加網路的 width 夠獲得更高細粒度的特徵並且也更容易訓練,但對於 width 很大而深度較淺的網路往往很難學習到更深層次的特徵
- 增加輸入網路的影像解析度能夠潛在地獲得更高細粒度的特徵模板,但對於非常高的輸入解析度,準確率的增益也會減小。並且大解析度影像會增加計算量
注:\(F_i^{L_i}\) 表示在 \(stage^{(i)}\) 中 \(F_i\) 被重複執行了 \(L_i\) 次,X 表示輸入 \(stage^{(i)}\) 的特徵矩陣,其維度是 \(<H_i,W_i,C_i>\)。
為了探究 d, r, w 這三個因子對最終準確率的影響,則將 d, r, w 加入到公式中,我們可以得到抽象化後的優化問題
注:d 用來縮放深度 \(\hat{L_i}\);\(r\) 用來縮放解析度即影響 \(\hat{H_i}\) 和 \(\hat{W_i}\);\(\omega\) 用來縮放特徵矩陣的 channel 即 \(\hat{C_i}\)。
接著作者又提出了一個混合縮放方法 ( compound scaling method) 在這個方法中使用了一個混合因子 ϕ 去統一的縮放 width,depth,resolution 引數,具體的計算公式如下:
注:FLOPs(理論計算量)=> depth 翻倍,也翻倍(一次);width 或 resolution 翻倍,則翻四倍(平方)。總的FLOPs倍率可以用近似用 \((\alpha, \beta^2, \gamma^2)^\phi\) 來表示,當限制 \(\alpha \cdot \beta^2 \cdot \gamma^2 \approx 2\) 時,對於任意一個 \(\phi\) 而言 FLOPs 相當增加了 \(2^{\phi}\) 倍。對於不同的基準網路搜尋出的 \(\alpha, \beta, \gamma\) 也不一定相同。
網路結構
下表為EfficientNet-B0的網路框架(B1-B7就是在B0的基礎上修改 Resolution、Channels 和 Layers),第一個 Stage 就是一個卷積核大小為 3x3 步距為 2 的普通卷積層(包含 BN 和啟用函式 Swish),Stage2~Stage8 都是在重複堆疊 MBConv 結構(最後一列的 Layers 表示該 Stage 重複 MBConv 結構多少次),而 Stage9 由一個普通的 1x1 的卷積層(包含 BN 和啟用函式 Swish)、一個平均池化層和一個全連線層組成。表格中每個 MBConv 後會跟一個數字 1 或 6,這裡的 1 或 6 就是倍率因子 n 即 MBConv 中第一個 1x1 的卷積層會將輸入特徵矩陣的 channels 擴充為 n 倍,其中 k3x3 或 k5x5 表示 MBConv 中 Depthwise Conv 所採用的卷積核大小。Channels 表示通過該 Stage 後輸出特徵矩陣的 Channels。
MBConv 結構
如圖所示,MBConv 結構主要由一個 1x1 的普通卷積(升維作用),一個 kxk 的 Depthwise Conv 卷積。k 的具體值主要有 3x3 和 5x5 兩種情況,一個 SE 模組,一個 1x1 的普通卷積(降維作用),一個 Droupout 層構成
- 第一個升維的 1x1 卷積層,它的卷積核個數是輸入特徵矩陣 channel 的 n 倍,n ∈ { 1 , 6 }
- 當 n = 1 時,不要第一個升維的 1x1 卷積層,即 Stage2 中的 MBConv 結構都沒有第一個升維的 1x1 卷積層?
- 僅當輸入 MBConv 結構的特徵矩陣與輸出的特徵矩陣 shape 相同時才存在 shortcut 連線
- 在原始碼實現中只有使用 shortcut 的時候才有 Dropout 層
Model | input_size | width_coefficient | depth_coefficient | drop_connect_rate | dropout_rate |
---|---|---|---|---|---|
EfficientNetB0 | 224x224 | 1.0 | 1.0 | 0.2 | 0.2 |
EfficientNetB1 | 240x240 | 1.0 | 1.1 | 0.2 | 0.2 |
EfficientNetB2 | 260x260 | 1.1 | 1.2 | 0.2 | 0.3 |
EfficientNetB3 | 300x300 | 1.2 | 1.4 | 0.2 | 0.3 |
EfficientNetB4 | 380x380 | 1.4 | 1.8 | 0.2 | 0.4 |
EfficientNetB5 | 456x456 | 1.6 | 2.2 | 0.2 | 0.4 |
EfficientNetB6 | 528x528 | 1.8 | 2.6 | 0.2 | 0.5 |
EfficientNetB7 | 600x600 | 2.0 | 3.1 | 0.2 | 0.5 |
- width_coefficient 代表 channel 維度上的倍率因子,比如在 EfficientNetB0 中 Stage1 的 3x3 卷積層所使用的卷積核個數是 32,那麼在 B6 中就是 32 × 1.8 = 57.6,接著取整到離它最近的 8 的整數倍即 56
- depth_coefficient 代表 depth 維度上的倍率因子(僅針對Stage2到Stage8),比如在 EfficientNetB0 中 Stage7 的 \hat{L_i} = 4,那麼在 B6 中就是 4 × 2.6 = 10.4 接著向上取整即 11
- drop_connect_rate 是在 MBConv 結構中 dropout 層使用的 drop_rate
- dropout_rate 是最後一個全連線層前的 dropout 層
補充:EfficientNet、EfficientNet網路詳解、【一看就懂】EfficientNet詳解。憑什麼EfficientNet號稱當今最強?、Depthwise卷積與Pointwise卷積