TorchVision 的 MobileNetV3 實現(xiàn)你需要知道的一切
在 TorchVision v0.9 中,我們發(fā)布了一系列適用于移動設備的新模型,可用于分類、對象檢測和語義分割。在本文中,我們將深入研究模型的代碼,分享重要的實現(xiàn)細節(jié),解釋我們?nèi)绾闻渲煤陀柧毸鼈儯娬{(diào)我們在調(diào)整過程中所做的重要權(quán)衡。我們的目標是披露通常在原始論文和模型存儲庫中未記錄的技術(shù)細節(jié)。
網(wǎng)絡架構(gòu)
MobileNetV3 架構(gòu)的實現(xiàn)與原始論文密切相關(guān)。它是可定制的,并為構(gòu)建分類、對象檢測和語義分割主干提供不同的配置。它被設計為遵循與 MobileNetV2 類似的結(jié)構(gòu),并且兩者共享共同的構(gòu)建塊。
現(xiàn)成的,我們提供了論文中描述的兩種變體:Large和Small。兩者都是使用相同的代碼構(gòu)建的,唯一的區(qū)別在于它們的配置描述了塊的數(shù)量、大小、激活函數(shù)等。
配置參數(shù)
盡管可以編寫自定義 InvertedResidual 設置并將其直接傳遞給 MobileNetV3 類,但對于大多數(shù)應用程序,我們可以通過將參數(shù)傳遞給模型構(gòu)建方法來調(diào)整現(xiàn)有配置。一些關(guān)鍵的配置參數(shù)如下:
該
width_mult參數(shù)是影響模型通道數(shù)的乘數(shù)。默認值為 1,通過增加或減少它可以改變所有卷積的過濾器數(shù)量,包括第一層和最后一層的過濾器。該實現(xiàn)確保過濾器的數(shù)量始終是8的倍數(shù)。這是一個硬件優(yōu)化技巧,可以更快地向量化操作。該
reduced_tail參數(shù)將網(wǎng)絡最后一個塊上的通道數(shù)減半。這個版本被一些對象檢測和語義分割模型使用。這是一種速度優(yōu)化,在MobileNetV3 論文中有所描述,據(jù)報道可將延遲減少 15%,而不會對準確性產(chǎn)生顯著的負面影響。該
dilated參數(shù)影響模型的最后 3 個InvertedResidual 塊,并將它們的正常深度卷積轉(zhuǎn)換為 Atrous Convolutions。這用于控制這些塊的輸出步幅,并對語義分割模型的準確性產(chǎn)生顯著的積極影響。
實施細則
下面我們提供有關(guān)該架構(gòu)一些值得注意的實現(xiàn)細節(jié)的附加信息。該MobileNetV3類是負責建網(wǎng)出提供配置。以下是該類的一些實現(xiàn)細節(jié):
最后一個卷積塊將最后一個 InvertedResidual 塊的輸出擴展了6 倍。該實現(xiàn)與論文中描述的 Large 和 Small 配置一致,可以適應 multiplier 參數(shù)的不同值。
與 MobileNetV2 等其他模型類似,在分類器的最后一個線性層之前放置了一個 dropout 層。
該InvertedResidual類是網(wǎng)絡的主要組成部分。以下是該塊的一些值得注意的實現(xiàn)細節(jié)以及來自論文圖 4 的可視化:
如果輸入通道和擴展通道相同,則沒有擴展步驟。這發(fā)生在網(wǎng)絡的第一個卷積塊上。
即使擴展通道與輸出通道相同,也始終存在投影步驟。
depthwise 塊的激活方法放置在Squeeze-and-Excite 層之前,因為這略微提高了準確性。

分類
在本節(jié)中,我們提供了預訓練模型的基準以及有關(guān)如何配置、訓練和量化它們的詳細信息。
基準
以下是初始化預訓練模型的方法:
large = torchvision.models.mobilenet_v3_large(pretrained=True, width_mult=1.0, reduced_tail=False, dilated=False)
small = torchvision.models.mobilenet_v3_small(pretrained=True)
quantized = torchvision.models.quantization.mobilenet_v3_large(pretrained=True)
下面我們有新型號和選定的舊型號之間的詳細基準。正如我們所看到的,MobileNetV3-Large 是 ResNet50 的可行替代品,適用于愿意犧牲一點準確性以獲得大約 6 倍加速的用戶:
| 模型 | 帳戶@1 | 加速度@5 | CPU 推斷(秒) | # 參數(shù) (M) |
|---|---|---|---|---|
| MobileNetV3-Large | 74.042 | 91.340 | 0.0411 | 5.48 |
| MobileNetV3-小 | 67.668 | 87.402 | 0.0165 | 2.54 |
| 量化的 MobileNetV3-Large | 73.004 | 90.858 | 0.0162 | 2.96 |
| 移動網(wǎng)絡V2 | 71.880 | 90.290 | 0.0608 | 3.50 |
| ResNet50 | 76.150 | 92.870 | 0.2545 | 25.56 |
| ResNet18 | 69.760 | 89.080 | 0.1032 | 11.69 |
請注意,推理時間是在 CPU 上測量的。它們不是絕對的基準,但它們允許模型之間的相對比較。
培訓流程
所有預訓練模型的寬度乘數(shù)都配置為 1,具有完整的尾部,未膨脹,并安裝在 ImageNet 上。Large 和 Small 變體都使用相同的超參數(shù)和腳本進行訓練,這些超參數(shù)和腳本可以在我們的參考文件夾中找到。下面我們提供有關(guān)培訓過程中最顯著方面的詳細信息。
實現(xiàn)快速穩(wěn)定的訓練
正確配置 RMSProp對于實現(xiàn)具有數(shù)值穩(wěn)定性的快速訓練至關(guān)重要。該論文的作者在他們的實驗和運行中使用了 TensorFlow,他們報告說與默認值相比使用了相當高 rmsprop_epsilon的值。通常,此超參數(shù)采用較小的值,因為它用于避免零分母,但在此特定模型中,選擇正確的值對于避免損失中的數(shù)值不穩(wěn)定性似乎很重要。
另一個重要的細節(jié)是,盡管 PyTorch 和 TensorFlow 的 RMSProp 實現(xiàn)的行為通常相似,但在我們的設置中最顯著的是 epsilon 超參數(shù)的處理方式存在一些差異。更具體地說,PyTorch 將 epsilon 添加到平方根計算之外,而 TensorFlow將其添加到 內(nèi)。這個實現(xiàn)細節(jié)的結(jié)果是,在移植論文的超參數(shù)時需要調(diào)整epsilon值。可以使用公式進行合理的近似PyTorch_eps = sqrt(TF_eps)。
通過調(diào)整超參數(shù)和改進我們的訓練配方來提高我們的準確性
配置優(yōu)化器實現(xiàn)快速穩(wěn)定訓練后,我們轉(zhuǎn)而優(yōu)化模型的準確率。有一些技術(shù)可以幫助我們實現(xiàn)這一目標。首先,為了避免過度擬合,我們使用 AutoAugment 算法擴充了數(shù)據(jù),然后是 RandomErasing。此外,我們使用交叉驗證調(diào)整了權(quán)重衰減等參數(shù)。我們還發(fā)現(xiàn)在訓練結(jié)束后在不同時期檢查點之間執(zhí)行權(quán)重平均是有益的。最后,雖然未在我們發(fā)布的訓練配方中使用,但我們發(fā)現(xiàn)使用標簽平滑、隨機深度和 LR 噪聲注入將整體準確度提高了1.5 點以上。
圖表和表格描述了用于提高 MobileNetV3 Large 變體準確性的最重要迭代的簡化摘要。請注意,訓練模型時完成的實際迭代次數(shù)要大得多,并且準確性的進步并不總是單調(diào)增加。另請注意,圖表的 Y 軸從 70% 開始,而不是從 0% 開始,以使迭代之間的差異更加明顯:

| 迭代 | 帳戶@1 | 加速度@5 |
|---|---|---|
| 使用“MobileNetV2 風格”超參數(shù)的基線 | 71.542 | 90.068 |
| + RMSProp 與默認 eps | 70.684 | 89.38 |
| + RMSProp 調(diào)整后的 eps 和 LR 方案 | 71.764 | 90.178 |
| + 數(shù)據(jù)增強和調(diào)整超參數(shù) | 73.86 | 91.292 |
| + 檢查點平均 | 74.028 | 91.382 |
| + 標簽平滑和隨機深度和 LR 噪聲 | 75.536 | 92.368 |
請注意,一旦我們達到可接受的精度,我們就會在之前未用于訓練或超參數(shù)調(diào)整的保持測試數(shù)據(jù)集上驗證模型性能。此過程可幫助我們檢測過擬合,并且始終在所有預訓練模型發(fā)布之前執(zhí)行。
量化
我們目前為MobileNetV3-Large 變體的 QNNPACK 后端提供量化權(quán)重,可提供 2.5 倍的加速。為了量化模型,使用了量化感知訓練 (QAT)。用于訓練模型的超參數(shù)和腳本可以在我們的參考文件夾中找到。
請注意,QAT 允許我們對量化的影響進行建模并調(diào)整權(quán)重,以便我們可以提高模型的準確性。與簡單的訓練后量化相比,這意味著準確度提高了 1.8 個點:
| 量化狀態(tài) | 帳戶@1 | 加速度@5 |
|---|---|---|
| 非量化 | 74.042 | 91.340 |
| 量化意識訓練 | 73.004 | 90.858 |
| 訓練后量化 | 71.160 | 89.834 |
物體檢測
在本節(jié)中,我們將首先提供已發(fā)布模型的基準,然后討論如何在特征金字塔網(wǎng)絡中使用 MobileNetV3-Large 主干和 FasterRCNN 檢測器來執(zhí)行對象檢測。我們還將解釋網(wǎng)絡是如何訓練和調(diào)整的,以及我們必須做出的任何權(quán)衡。我們不會詳細介紹它如何與SSDlite一起使用,因為這將在以后的文章中討論。
基準
以下是模型的初始化方式:
high_res = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_fpn(pretrained=True)
low_res = torchvision.models.detection.fasterrcnn_mobilenet_v3_large_320_fpn(pretrained=True)
以下是新型號和選定的舊型號之間的一些基準。正如我們所看到的,對于那些愿意犧牲少量精度點以獲得 5 倍加速的用戶來說,帶有 MobileNetV3-Large FPN 主干的高分辨率 Faster R-CNN 似乎是等效 ResNet50 模型的可行替代品:
| 模型 | 地圖 | CPU 推斷(秒) | # 參數(shù) (M) |
|---|---|---|---|
| Faster R-CNN MobileNetV3-Large FPN(高分辨率) | 32.8 | 0.8409 | 19.39 |
| Faster R-CNN MobileNetV3-Large 320 FPN(低分辨率) | 22.8 | 0.1679 | 19.39 |
| 更快的 R-CNN ResNet-50 FPN | 37.0 | 4.1514 | 41.76 |
| RetinaNet ResNet-50 FPN | 36.4 | 4.8825 | 34.01 |
實施細則
檢測器使用 FPN 風格的主干,從 MobileNetV3 模型的不同卷積中提取特征。默認情況下,預訓練模型使用第 13 個 InvertedResidual 塊的輸出和池化層之前的卷積的輸出,但實現(xiàn)支持使用更多階段的輸出。
從網(wǎng)絡中提取的所有特征圖的輸出都被 FPN 塊投影到256 個通道,因為這大大提高了網(wǎng)絡的速度。FPN主干提供的這些特征圖被FasterRCNN檢測器用來提供不同尺度的box和class預測。
訓練和調(diào)優(yōu)過程
我們目前提供兩種能夠以不同分辨率進行目標檢測的預訓練模型。兩個模型都使用相同的超參數(shù)和腳本在 COCO 數(shù)據(jù)集上進行訓練,這些超參數(shù)和腳本可以在我們的參考文件夾中找到。
在高分辨率檢測用的800-1333px圖像的訓練,而移動友好的低分辨率檢測用的320-640px圖像訓練。我們提供兩組單獨的預訓練權(quán)重的原因是,與將小圖像傳遞給預訓練的高分辨率模型相比,直接在較小的圖像上訓練檢測器會導致精度提高 5 mAP。兩個主干都使用適合 ImageNet 的權(quán)重進行初始化,并且在訓練過程中對其權(quán)重的最后 3 個階段進行了微調(diào)。
通過調(diào)整 RPN NMS 閾值,可以在移動友好模型上應用額外的速度優(yōu)化。通過僅犧牲 0.2 mAP 的精度,我們能夠?qū)⒛P偷?CPU 速度提高大約 45%。優(yōu)化細節(jié)見下圖:
| 調(diào)整狀態(tài) | 地圖 | CPU 推斷(秒) |
|---|---|---|
| 前 | 23.0 | 0.2904 |
| 后 | 22.8 | 0.1679 |
下面我們提供了一些可視化 Faster R-CNN MobileNetV3-Large FPN 模型預測的示例:

語義分割
在本節(jié)中,我們將首先提供已發(fā)布的預訓練模型的一些基準。然后我們將討論如何將 MobileNetV3-Large 主干與LR- ASPP、DeepLabV3和FCN等分割頭結(jié)合起來進行語義分割。我們還將解釋網(wǎng)絡是如何訓練的,并為速度關(guān)鍵應用提出一些可選的優(yōu)化技術(shù)。
基準
這是初始化預訓練模型的方法:
lraspp = torchvision.models.segmentation.lraspp_mobilenet_v3_large(pretrained=True)
deeplabv3 = torchvision.models.segmentation.deeplabv3_mobilenet_v3_large(pretrained=True)
以下是新模型和選定現(xiàn)有模型之間的詳細基準。正如我們所看到的,對于大多數(shù)應用程序,帶有 MobileNetV3-Large 主干網(wǎng)的 DeepLabV3 是 FCN 和 ResNet50 的可行替代品,因為它以 8.5 倍的速度實現(xiàn)了類似的精度。我們還觀察到 LR-ASPP 網(wǎng)絡在所有指標中取代了等效的 FCN:
| 模型 | 米歐 | 全局像素加速 | CPU 推斷(秒) | # 參數(shù) (M) |
|---|---|---|---|---|
| LR-ASPP MobileNetV3-大 | 57.9 | 91.2 | 0.3278 | 3.22 |
| DeepLabV3 MobileNetV3-Large | 60.3 | 91.2 | 0.5869 | 11.03 |
| FCN MobileNetV3-Large(未發(fā)布) | 57.8 | 90.9 | 0.3702 | 5.05 |
| DeepLabV3 ResNet50 | 66.4 | 92.4 | 6.3531 | 39.64 |
| FCN ResNet50 | 60.5 | 91.4 | 5.0146 | 32.96 |
實施細則
在本節(jié)中,我們將討論經(jīng)過測試的分段頭的重要實現(xiàn)細節(jié)。請注意,本節(jié)中描述的所有模型都使用擴張的 MobileNetV3-Large 主干。
LR-ASPP
LR-ASPP 是 MobileNetV3 論文的作者提出的 Reduced Atrous Spatial Pyramid Pooling 模型的 Lite 變體。與 TorchVision 中的其他分割模型不同,它不使用輔助損失。相反,它使用輸出步幅分別為 8 和 16 的低級和高級特征。
與使用具有可變步幅的 49x49 AveragePooling 層的論文不同,我們的實現(xiàn)使用一個AdaptiveAvgPool2d層來處理全局特征。這是因為該論文的作者為 Cityscapes 數(shù)據(jù)集量身定制了頭部,而我們的重點是提供可以在多個數(shù)據(jù)集上工作的通用實現(xiàn)。最后,我們的實現(xiàn)在返回輸出之前總是有一個雙線性插值,以確保輸入和輸出圖像的大小完全匹配。
DeepLabV3 & FCN
MobileNetV3 與 DeepLabV3 和 FCN 的組合緊跟其他模型的組合,并且這些方法的階段估計與 LR-ASPP 相同。唯一顯著的區(qū)別是,我們沒有使用高級和低級特征,而是將正常損失附加到輸出步長為 16 的特征圖上,并在輸出步長為 8 的特征圖上附加一個輔助損失。
最后我們應該注意到模型的 FCN 版本沒有發(fā)布,因為它在速度和準確性方面都被 LR-ASPP 完全取代。該預訓練的權(quán)重仍然可用,可以用最小的變化代碼中使用。
訓練和調(diào)優(yōu)過程
我們目前提供兩種能夠進行語義分割的 MobileNetV3 預訓練模型:LR-ASPP 和 DeepLabV3。模型的主干用 ImageNet 權(quán)重初始化并進行端到端訓練。兩種架構(gòu)都使用具有相似超參數(shù)的相同腳本在 COCO 數(shù)據(jù)集上進行訓練。他們的詳細信息可以在我們的參考文件夾中找到。
通常,在推理過程中,圖像被調(diào)整為 520 像素。一個可選的速度優(yōu)化是通過使用高分辨率預訓練權(quán)重并將推理調(diào)整大小減少到 320 像素來構(gòu)建模型的低分辨率配置。這將把 CPU 執(zhí)行時間提高大約 60%,同時犧牲幾個 mIoU 點。可以在下表中找到此優(yōu)化的詳細數(shù)字:
| 低分辨率配置 | 千差萬別 | 速度提升 | 米歐 | 全局像素加速 | CPU 推斷(秒) |
|---|---|---|---|---|---|
| LR-ASPP MobileNetV3-大 | -2.1 | 65.26% | 55.8 | 90.3 | 0.1139 |
| DeepLabV3 MobileNetV3-Large | -3.8 | 63.86% | 56.5 | 90.3 | 0.2121 |
| FCN MobileNetV3-Large(未發(fā)布) | -3.0 | 57.57% | 54.8 | 90.1 | 0.1571 |
以下是一些可視化 LR-ASPP MobileNetV3-Large 模型預測的示例:

