EfficientNet 簡介

貴志發表於2021-12-23

EfficientNet

單獨適當增大深度、寬度或解析度都可以提高網路的精確性,但隨著模型的增大,其精度增益卻會降低。此外,這三個維度並不是獨立的(如:高解析度影像需要更深的網路來獲取更細粒度特徵等),需要我們協調和平衡不同尺度的縮放,而不是傳統的一維縮放。EfficientNet 的設想就是能否設計一個標準化的卷積網路擴充套件方法,既可以實現較高的準確率,又可以充分的節省算力資源。其通過 NAS(Neural Architecture Search)技術來搜尋網路的影像輸入解析度 r,網路的深度 depth 以及 channel 的寬度 width 三個引數的合理化配置。
image

  • 增加網路的深度 depth 能夠得到更加豐富、複雜的特徵並且能夠很好的應用到其它任務中。但網路的深度過深會面臨梯度消失,訓練困難的問題
  • 增加網路的 width 夠獲得更高細粒度的特徵並且也更容易訓練,但對於 width 很大而深度較淺的網路往往很難學習到更深層次的特徵
  • 增加輸入網路的影像解析度能夠潛在地獲得更高細粒度的特徵模板,但對於非常高的輸入解析度,準確率的增益也會減小。並且大解析度影像會增加計算量

\[\begin{aligned} &第 i 個層的操作可以看成對映函式:Y_i = F_i(X_i) \\ &若網路 N 由 k 個層組成的,則可表示為:N = F_k \bigodot ... \bigodot F_2 \bigodot F_1(X_1) = \bigodot_{j=1...k}F_i(X_1) \\ &論文中對整個網路的運算進行抽象:N = \bigodot_{i=1...s}F_i^{L_i}(X_{<H_i, W_i, C_i>}) \\ \end{aligned} \]

\(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 加入到公式中,我們可以得到抽象化後的優化問題

\[\begin{aligned} &\max_{d, w, r}Accuracy(N(d, w, r))\\ &s.t.\quad N(d, w, r) = \bigodot_{i=1...s}\hat{F_i^{d \cdot \hat{L_i}}}(X_{<r \cdot \hat{H_i}, r \cdot \hat{W_i}, \omega \cdot \hat{C_i}>}) \\ &Memory(N) \leq target\_memory \\ &FLOPS(N) \leq target\_flops \\ \end{aligned} \]

:d 用來縮放深度 \(\hat{L_i}\)\(r\) 用來縮放解析度即影響 \(\hat{H_i}\)\(\hat{W_i}\)\(\omega\) 用來縮放特徵矩陣的 channel 即 \(\hat{C_i}\)

接著作者又提出了一個混合縮放方法 ( compound scaling method) 在這個方法中使用了一個混合因子 ϕ 去統一的縮放 width,depth,resolution 引數,具體的計算公式如下:

\[\begin{aligned} &depth: d = \alpha^\phi \\ &width: w = \beta^\phi \\ &resolution: r = \gamma^\phi \\ &s.t. \quad \alpha \cdot \beta^2 \cdot \gamma^2 \approx 2 \qquad \alpha \geq1, \beta \geq 1, \gamma \geq 1 \\ \end{aligned} \]

: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。
image

MBConv 結構

image

如圖所示,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 層

補充EfficientNetEfficientNet網路詳解【一看就懂】EfficientNet詳解。憑什麼EfficientNet號稱當今最強?Depthwise卷積與Pointwise卷積