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 ∈
- 當 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卷積