PP-LCNet-A Lightweight CPU Convolutional Neural Network
一、Introduction
動機
由于MKLDNN庫的限制,現有的NN在速度上無法在Inter-CPU上得到最大的提升,本文設計了一種專為Inter CPU準備的輕量級網絡,設計這個網絡的時候,我們主要考慮了一下幾個問題
如何讓網絡獲取更強的特征表達而不增加推理時延?
到底是什么因素/模塊幫助CPU端的輕量級網絡提高accuracy?
設計基于CPU的輕量級網絡的時候,如何有效的結合不同的策略?
貢獻
總結了一系列的方法,來提升accuracy但是不增加inference time
給出了如何結合這些方法來最終獲得一個好結果
二、Approach
2.1 BaseNet
很多輕量級CNN在ARM上速度很快,但是在Interl-CPU上表現一般,大部分原因是因為沒有充分利用MKLDNN庫。
-
我們使用MobileNet V1里面的DepthSepConv作為基礎模塊。這個模塊,無add,無cat 操作,不僅會拖累模型的速讀,而且對于輕量級模型的accuracy提升無用(暫時無法理解為什么add,cat這種類似于特征融合的操作對于輕量級模型無用)
-
DepthSepConv這個模塊在Inter CPU 加速庫中已經被高度優化過了,因此比inverted block和shufflenet-block更快
-
我們基于DepthSepConv堆疊形成了BaseNet,然后添加了一些現有的成熟的技術,構建了PP-LCNet
個人總結:已知Inter CPU的加速快對于 DepthSepConv做了深度優化,且add,cat幾乎無收益,進而設計了一個專用于Inter CPU的網絡
2.2 激活函數使用H-Swish
EfficientNet使用Swish獲得了比ReLU更好的性能;
MobileNet V3使用Hard Swish獲得了比Swish更好的性能,
我們也在BaseNet中使用Hard Swish替換了原先的ReLu,也獲得了更好的accuracy,而且不增加inference time
2.3 把SE模塊插入到合適的位置
SE模塊確實很有效,但是基于Inter CPU上,SE會增加推理時間
經過大量實驗證明,位于NN深層的SE模塊比其他位置的SE模塊起到了更重要的作用,因此我們僅在NN的深層加入了SE模塊(這個幾乎就是印證了微軟的動態卷積的結論,注意力機制在深層更有效)
2.4 使用更大的卷積核
在MixNet中,作者證明了使用不同大小的kernel的組合可以獲得更好的效果,但這明顯會增加推理時間。所以我們決定,每一層卷積僅使用一種大小的kernel,并且確保使用大kernel的時候既能提升accuracy也不能增加latency。(這其實言外之意就是在小的feature map上才使用大的kernel-size)
經過,本文在NN的尾部使用5×5的kernel size替代了3×3的kernel,可以獲得與替換所有卷積層近似的效果,這個結論和SE的替換很像。
2.5 在GAP之后使用一個高維的1×1卷積
在PP-LCNet中,最后一個卷積是512維度,如果直接在GAP(輸出為512維向量)之后接上classification layer會導致丟失特征的結合(??????)。為了使網絡具有更好的擬合能力,我們在GAP之后添加了一個1280的1×1卷積(等價于一個FC),這使得具有更好的能力,同時增加的inference time很少
三、實驗
實驗配置:基于paddlepaddle框架,基于4卡V100訓練,基于Intelr Xeonr Gold 6148
處理器 batch size=1 ,使用MKLDNN 加速.
-
不同scale下的PP-LCNet表現,帶*的表示使用了蒸餾算法進一步優化
-
和其它網絡進行對比
-
作為backbone進行目標檢測
-
作為backbone進行分割
- Acti, SE, Large-kernel 最后額外增加的全連接,各個模塊的作用與時延
-
SE 模塊添加位置的消融實驗
-
Large-kernel添加位置的消融實驗
總結
以上是生活随笔為你收集整理的PP-LCNet-A Lightweight CPU Convolutional Neural Network的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统截图有快捷键吗,Linux
- 下一篇: 夏天的羊肉汤