我很長一段時間一直都在做自動駕駛的物體檢測性能調優,所以想總結整理一些小網絡和檢測框架的經驗。
文章會分成三個部分:
第一部分將參照知乎@YaqiLYU 對小網絡(經典網絡)的分析並且結合的自己的理解。
第二部分詳細介紹目前state-of-art的主流檢測框架。
第三部分介紹了目標檢測的問題及解決方案,目標檢測在其他領域的拓展應用
---------------------------------------------------------------------------------------------------------------------------
第一部分 經典小網絡性能分析
---------------------------------------------------------------------------------------------
對於早期經典模型SqueezeNet, MobileNet(V1), 和CVPR 2018最新模型ShuffleNet, IGCV2, MobileNetV2, 探究短小精悍的秘密,學習設計理念和技術。
問題:
通過一張ncnn框架的高端ARM高通820和低端ARM海思3519硬件實測速度對比。ImageNet上的top-1准確率 vs 理論計算量 vs 模型大小的對比提出
1 MobileNetV2到底優化了什么,能做到比MobileNetV1既好又快?
2 為什么理論計算很高的SqueezeNet反而非常快?為什么ShuffleNet要比架構技術接近的MobileNetV1和MobileNetV2快那么多?
背景介紹:
首先介紹CNN中不同層的參數數量和理論計算量,簡單起見小寫代表下標,卷積核Kh*Kw,輸入通道數Cin,輸出通道數Cout,輸出特征圖的分辨率為寬H高W。
參數數量:用params表示,關系到模型大小,單位通常為M,通常參數用float32表示,所以模型大小是參數數量的4倍。
理論計算量:用FLOPs或者M-Adds表示,這里用FLOPs寫起來簡單,關系到算法速度,大模型的單位通常為G,小模型通道為M。注意兩點:
- 理論計算量通常只考慮乘加操作(Multi-Adds)的數量,而且只考慮CONV和FC等參數層的計算量,忽略BatchNorm和PReLU等等。一般情況,CONV和FC層也會忽略僅純加操作的計算量,如bias偏置加和shotcut殘差加等,目前技術有BN的CNN可以不加bias。
- 理論計算量通常和實際ARM實測速度會有不一致,主要是理論計算量太過理論化,沒有考慮不同硬件IO速度和計算力差異,最重要的是inference framework部署框架優化水平和程度差異,不同框架的優化的關注點不一樣,同一框架對不同層的優化程度也不一樣。Inference Framework以的ncnn為代表。
CONV標准卷積層:
- #params:
,沒有bias為
- #FLOPs:
FC全連接層,卷積核k=1:
- #params:
,沒有bias為
- #FLOPs:
*H*W
CONV和FC是經典CNN架構(如VGGNet和ResNet)中最重要的組件,CONV一般位於前面,作用類似特征提取,FC位於后面,作用類似分類決策。我們還需要兩個卷積的變種。
首先在比較流行的高效卷積核(GCONV和DWCONV)上做個對比
GCONV分組(Group)卷積層,輸入按通道數划分為g組,每小組獨立分別卷積,結果聯結到一起作為輸出,如圖中上面部分,Output channels作為GCONV的輸入,分了3組分別CONV3x3,組內有信息流通,但不同分組之間沒有信息流通。
- #params:
- #FLOPs:
(Xception版本)DWCONV深度分離(DepthWise)卷積層,是GCONV的極端情況,分組數量等於輸入通道數量,即每個通道作為一個小組分別進行卷積,結果聯結作為輸出,Cin = Cout = g,沒有bias項,如圖中上面部分,Output channels作為DWCONV的輸入,划分了輸入通道數量相等的分組,通道之間完全沒有信息流通。
- #params:
- #FLOPs:
- 注意:Xception的DW組織方式和MobileNet的設計稍微不同,這里會首先將1x1的卷積提到depthwise convolution之前。
綜合對比:
- CONV層主要貢獻了計算量,如VGGNet第二個CONV層貢獻了1.85G的計算量,參數數量僅37k
- FC層主要貢獻了參數數量,如VGGNet第一個FC層25088-4096就有接近98M參數,貢獻模型大小392M,計算量僅103M
- GCONV和DWCONV層參數量和計算量都非常小,GCONV參數數量減少g倍,計算量降低g倍,g越大壓縮加速越明顯;DWCONV是g=Cin的極端情況,壓縮加速比是Cin倍,如MobileNet中第一個DWCONV層參數數量不到0.3k,計算量僅3.2M,這兩者是高效CNN的核心構成要素。
Block分析:設計CNN目前都采用堆block的方式,后面對每個模型只集中分析其block的設計。堆Block簡化了網絡設計問題:只要設計好block結構,對於典型224x224輸入,設計CNN只需要考慮112x112、56x56、28x28、14x14、7x7 這5個分辨率階段(stage)的block數量和通道數量就可以了。
CNN加深度一般都選擇14x14這個分辨率階段,多堆幾個block,這一層的參數數量和計算量占比最大,所以我們選這一層作為特例分析每種block的參數數量和計算量,量化說明選擇14x14x該層通道數的輸入和輸出情況。
傳統網絡分析:
NIN(net in network)
最早的的小網絡要從Network in Network說起,NiN是Shuicheng Yan組ICLR 2014的論文,提出在CONV3x3中插入CONV1x1層,和Global Average Pooling (GAP)層,雖然論文並沒有強調這兩個組件對減小CNN體積的作用,但它們確實成為CNN壓縮加速的核心:
- 同等輸入CONV1x1比CONV3x3參數數量少9倍,理論計算量降低9倍(可以去看1*1卷積核對於減少參數量的作用,升維,降維,跨通道的信息融合等等)
- GAP層沒有參數,計算量可以忽略不計,是壓縮模型的關鍵技術
GoogLeNet
就大量使用層和GAP,與同時期性能相近的VGG-19相比,22層GoogLeNet模型參數少20倍以上,速度快10倍以上。GoogLeNet是最早的高效小網絡,Inception系列沿襲這一架構理念,在均衡網絡深度和模型大小方面都比較優秀。
(提問:截止2018.5.27,VGGNet論文的引用量是11499,GoogLeNet的應用量是7440次,同一時期的兩個經典結構,看起來明顯更好的GoogLeNet影響力為何反而不如VGGNet?早期檢測、跟蹤和分割等方向的經典方法,如SSD, C-COT, FCN,骨架網絡BackBone默認都是VGGNet,為什么都沒有選更小更快的GoogLeNet?)
(模型的推理速度也就是計算量其實不僅僅和參數量有關,計算次數,還和MAC內存帶寬的交互,以及GPU的底層支持的友好程度都相關,再其次更深的網絡在imagenet上的訓練效果會更好一些)
Resnet:
除了conv1*1 和GAP,ResNet還采用了另一項常用技術:
- 用CONV/s2(步進2的卷積)代替CONV+MaxPool,將Pool層合並到上一個CONV層,近似減少一半參數數量和計算量
綜合以上技術,即使152層的ResNet,也比VGGNet小7倍,快12倍以上。目標檢測的YOLO系列中,YOLOv2中提出的DarkNet-19采用了CONV1x1和GAP設計,YOLOv3的DarkNet-53加入了CONV/s2設計,兩個CNN都是以上壓縮加速技術的實例。
SqueezeNet
論文非常的標題黨:同等精度比AlexNet小50倍,<0.5M的模型大小。SqueezeNet的核心設計理念是模型可以不快但一定要小,分析三個設計策略:
- 用CONV1x1代替CONV3x3,大量CONV3x3被替換,大幅減少參數和計算量
- 用squeeze層減少輸入到CONV3x3的通道數,繼續減少剩余CONV3x3層的參數數量和計算量
- 延遲下采樣,保持激活的分辨率較大,同等參數數量效果更好,但這樣會嚴重增加計算量
此外,保證conv10的通道數是1000,這樣GAP后直接是1000個輸出,這樣連接到輸出的最后一個FC層也省了,僅0.5M參數就完成了收尾部分,簡直喪心病狂,但這種做法非常低效,僅conv10這一層的計算量就有100M。
SqueezeNet共8個Fire Module,2個CONV和4個POOL,沒有BN,最終模型4.8M,在ImageNet上top-1 acc 57.5%, top-5 acc 80.3%,性能是AlexNet水平,經過DeepCompression進一步壓縮后模型大小可以達到逆天的0.47M,但DeepCompression方法也是僅關心壓縮不關心加速的。最后實驗還測試了shotcut,證明類似ResNet那樣最簡單的shotcut最好,top-1和top-5分別提升2.9%和2.2%,性能提升明顯且不會增加參數數量,幾乎不會影響計算量 (ResNet賽高)
論文描述的模型是SqueezeNet v1.0,后來代碼又更新了SqueezeNet v1.1,模型大小和性能不變的情況下快了2.4倍:
主要修改了第一層的卷積核大小和通道數,把下采樣提前了,即拋棄了策略3。
SqueezeNet的計算量在MobileNet論文中是1700M,在ShuffleNet論文中是833,根據最新論文結果,SqueezeNet v1.0的理論計算量是837M,SqueezeNet v1.1的理論計算量是352M,ncnn-benchmark中所用測試模型就是SqueezeNet v1.1,所以在benchmark中SqueezeNet確實應該比MobileNet和AlexNet快。
stage的通道數量:【128 256 384-512 0】
stage的block數量:【2 2 4 0】
Block分析:加shotcut的一個典型SqueezeNet block,即論文中的Fire module
- #params:
- #FLOPs:
- (C*C/8*1*1 + C/8*C/2*3*3 + C/8 * C/2 * 1*1 ) = 3/4 * C^2
第一個CONV1x1將輸入通道數壓縮(squeeze)到1/8送給CONV3x3,上下兩路CONV擴展(expand)四倍后聯結,還原輸入通道數量。block中CONV1x1和CONV3x3的參數數量之比是1:3,計算量之比也是1:3。
SqueezeNet中雖然大量使用CONV1x1,但CONV3x3占比依然在75%以上,inferece framework中CONV3x3的優化對速度影響更大。
在part2 中會介紹作者最新的SqueezeDet
MobileNet
MobileNet是第一個面向移動端的小網絡,設計兼顧模型小和速度快,提出了Depthwise Separable Convolution深度分離卷積,由DWCONV3x3 + CONV1x1組成,DWCONV3x3將CONV3x3的計算量降低到恐怖程度,后面的CONV1x1幫助信息在通道之間流通。這種結構非常高效,代替CONV后性能微小下降換取速度數倍提升。
MobileNet參數數量4.2M,計算量569M,top-1 70.6%,性能是GoogLeNet和VGG16水平,比最龐大的VGG16模型小32倍,計算量低27倍,比設計高效的GoogLeNet模型更小,計算量低2.5倍。
第一層是CONV,之后堆疊DWCONV3x3 + CONV1x1, 每層都加BN沒有shotcut,DWCONV/S2方式下采樣,GAP后連FC到1000個分類輸出,僅這個1024-1000的FC層就有1M參數。
論文提供了兩個用戶定制參數:
- Width Multiplier寬度乘子:所有層的通道數乘
,即CNN變瘦,模型大小近似下降
倍,計算量下降
倍
- Resolution Multiplier分辨率乘子:輸入分辨率乘
,等價於所有層的分辨率乘
,模型大小不變,計算量下降
倍
減少網絡的層數也可以減少模型大小和計算量,即CNN變淺,實驗給出同等參數和計算量,變淺比邊瘦性能要差很多,強烈建議不要減深度!
(提問:很多論文都證明,同等參數和計算量,深度模型比寬度模型更好,深度也是一種正則方式?)
論文統計了不同類型層的計算量和參數數量,僅一個CONV一個FC,計算量可以忽略,前面也提到FC層參數占比較大,重點關注,大量使用的DWCONV33計算量僅3%,參數數量僅1%,其貌不揚的CONV1x1竟然是罪魁禍首,CONV1x1計算量占95%,參數數量占75%,所以MobileNet速度快不快,與inferece framework中CONV1x1的優化程度密切相關(其實是因為depthwise的3*3卷積只計算一次,而pointwise層會瘋狂的計算Cout次和sequeezenet 不同,seq雖然1*1卷積核很多,但本質還是由於3*3與1*1的占比所導致)。
Block分析:MobileNet雖然沒有明確指出,Depthwise Separable Convolution也可以看做block
- #params:
- #FLOPs:
DWCONV3x3以極低代價卷積產生特征,CONV1x1輔助通道信息流通,兩者完美配合。block中CONV1x1和DWCONV3x3的計算量、參數數量比例是C:9,以瘋狂加深度層14x14x512為例,二者比例是512:9=56.89,依然很震驚有木有,SqueezeNet中核心壓縮加速手段CONV1x1,在MobileNet中反倒成了開銷大戶。
進一步優化MobileNet,降低CONV1x1的占比是關鍵,在mobilenetV2中針對於conv1*1的占比進行了優化。
DWCONV-bottleneck block
MobileNet的結構是類似VGGNet的直筒形式,目前ResNet已經取代了VGGNet,我們是不是按照ResNet中比較高效的bottleneck block構建更先進的DWCONV-bottleneck block呢?當然很簡單,按照ResNet論文,CONV3x3換成DWCONV3x3就完成了。
- #params:
- #FLOPs:
ResNet代替VGGNet的歷史告訴我們,這樣做一定比MobileNet更好,要試一試嗎?別着急,仔細看參數數量和計算量都增加了數倍(約8倍),block中CONV1x1和DWCONV3x3的計算量、參數數量比例是8C:9,還是以深度層14x14x512為例,二者比例高達8*512:9=455.11,再次震驚,這樣做性能是上去了,但模型大小和速度都嚴重下降了,對於移動端這是我們最不願看到的結果。
ShuffleNet
繼MobileNet掛出來之后三個月,曠世科技掛出了ShuffleNet:解決了DWCONV-bottleneck block中CONV1x1占比高、計算量大的問題;但是並沒有開源代碼。
類似DWCONV-bottleneck block中DWCONV3x3代替CONV3x3,其中的CONV1x1是標准卷積,這部分是否也能通過分組卷積或深度分離卷積來加速壓縮呢?ShuffleNet第一步就是把block中的CONV1x1變成了分組卷積GCONV1x1降低計算量和參數數量,按照分組數量(g=2,3,4,8)加速g倍。但這帶來一個很嚴重的問題,通道之間信息不能流通:DWCONV3x3沒有通道間信息流通,而GCONV1x1信息只在分組內部流通,會嚴重影響性能。ShuffleNet給出解決方案,就是題目中'Shuffle'代表的Channel Shuffle操作,交錯重排,混疊通道以輔助(強制)信息流通。
從理論計算量的公式可以看出,feature map的分辨率對計算量影響非常大,所以一般CNN結構都有輸入圖像快速降維模塊,常用CONV3x3s2+CONV3x3s2階梯降維,或CONV7x7s2 + MaxPools2,實現輸入圖像快速降維4倍。在ShuffleNet中采用了非常非常激進的CONV3x3s2 + MaxPools2結構,雖然這樣參數更少速度更快,但CONV3x3的感受野不足以支撐4倍降維,會造成信息丟失(猜測這可能是ShuffleNet難以復現的原因之一)。
ShuffleNet發現深度分離卷積雖然參數數量和計算量都很低,但與其他密集操作相比計算/內存訪問比很差,在實際硬件上較難優化,所以采用了大量GCONV1x1加少量DWCONV3x3的設計方式,后面MobileNetV2中會看到截然不同的處理方式。
分組數量g越大,對應壓縮加速比率越大,論文增加通道數量以保持不同g設置的計算量接近,公平對比性能;用戶定制參數僅通道乘子s,壓縮加速 倍。常用兩個版本是ShuffleNetx1g8和ShuffleNetx2g3:
- ShuffleNetx1g8版本參數數量1.4M(?),計算量140M,top-1 67.6%,優於0.5-MobileNet-224,僅比GoogLeNet低1.1%但快10倍以上
- ShuffleNetx2g3版本(2**2=4,大約是x1g8的4倍) 參數數量5.4M,計算量524M,top-1 73.7%,優於1.0MobileNet-224,計算量低45M,性能超出3.1%
- ShuffleNet還嘗試了最新技術,與同為CVPR 2018 SENet中的SE modules結合,在幾乎不影響理論計算量的同時能大幅提升性能,但,實測在移動設備上減速了25%~40%,這就很可怕了
(提問:還有哪些類似SE的“黑科技”,能在基本保持理論計算量不變的情況下能大幅提升性能,表面上看起來非常“便宜”,但實際上大幅降低了部署速度)
ncnn-benchmark中ShuffleNet是x1g8版本,理論計算量140,當然比理論計算量352M的SqueezeNet v1.1和理論計算量569M的MobileNet更快。
為保持公平比較,接下來分析x2g3版本:
每個stage的通道數量:【0 480 960 1920】
每個stage的block數量:【0 4 8 4】
Block分析:shuffle block即論文中的ShuffleNet Unit,非stride=2版本
- #params:
- #FLOPs:
block中CONV1x1和DWCONV3x3的計算量、參數數量比例是8/3C:9,以深度層14x14x960 (c=240)為例,二者比例8/3*240:9=71.11,比DWCONV-bottleneck block中的455.11,GCONV1x1依然是主力但占比已經降低很多很多了。與MobileNet相比,DWCONV3x3的通道數少了很多(猜測是難以復現的原因之二),但GCONV1x1通道數多了很多,所以上面4C-C-C4的通道數表示不一定客觀。
其他需要注意的:ShuffleNet Unit中,僅第一個GCONV1x1后面加了Channel Shuffle,DWCONV3x3后面沒有ReLU,stride=2版本用聯結輸入AVGPools2的方式實現通道翻倍。
(HELP:有能完美復現CVPR版本ShuffleNet論文結果的同學,歡迎慷慨分享你的模型和訓練方式,功德無量!)
IGCV2
看到這個很多同學第一時間都會想:這個和Channel Shuffle好像啊,而且是今年4月才掛出來。。其核心部分的交錯分組卷積Interleaved Group Convolutions發表在ICCV 2017,所以是ShuffleNet同時期的工作(或更早)。交錯分組卷積IGC,把CONV1x1變成分組卷積,然后加上交錯重排操作Permutation,作用類似Channel Shuffle。
IGCV2在MobileNet的基礎上改進,兩個GCONV1x1中間加Permutation,分組數量g=8,每層的通道數量都翻倍,這樣參數數量和計算量都基本保持不變(更胖)。IGCV2和MobileNet對比,1.0版本的參數、計算量和性能都非常相似,但0.5和0.25版本IGCV2優勢非常明顯。
每個stage的通道數量:【256 512 1024 2048】
每個stage的block數量:【2 2 6 2】
Block分析:IGCV2 block,類似MobileNet沒有加shotcut
- #params:
- #FLOPs:
block中CONV1x1和DWCONV3x3的計算量、參數數量比例是1/4C:9,以深度層14x14x1024為例,二者比例1/4*1024:9=28.44,比MobileNet block中的56.89的占比降低。網絡設計方面,IGCV2只在MobileNet的基礎上改進,驗證了IGC的可行性,沒有太大的結構變動。
MobileNetV2
降低DWCONV-bottleneck block中CONV1x1的占比,除了ShuffleNet和IGCV2用GCONV+shuffle/permutation方法,還有其他好辦法嗎?MobileNet采用了兩種新技術來解決這個問題,按照論文來說:
- Inverted Residuals 逆殘差:把原來兩頭大中間小的bottleneck block變成兩頭小中間大的形式,強行降低了CONV1x1與DWCONV3x3的比例,這里有個超參數expansion factor擴展因子t,推薦是5~10,參數設置小網絡小一點,大網絡大一點,V2中是t=6。
- Linear Bottlenecks 線性瓶頸:去掉了第二個CONV1x1后面的ReLU,改為線性神經元,其實就是沒有非線性激活函數,論文解釋是在低維度空間ReLU會破壞信息。
沒有分組卷積,那MobileNetV2到底優化了什么?觀察網絡發現,bottleneck的輸出通道數非常小[24 32 64-96 160-320],這在以前的結構中容量是遠遠不夠的。再來看經expand layer擴展以后的DWCONV3x3層,baseline版本通道數是[144 192 384-576 960-1920],比較接近ShuffleNetx2的配置,略高於V1,從這個角度來看,MobileNetV2設計上是保持DWCONV3x3層通道數基本不變或輕微增加,將bottleneck的輸入和輸出通道數直接減小t倍,擴展因子其實更像是壓縮因子,將CONV1x1層的參數數量和計算量直接減小t倍,輕微增加DWCONV3x3的通道數以保證的網絡容量。ShuffleNet中標准卷積更多、深度分離卷積更少的優化思路完全相反,MobileNetV2中標准卷積更少、深度分離卷積更多(相對的,計算量占比CONV1x1依然絕對優勢)。
- baseline版本MobileNetV2,參數數量3.4M,計算量300M,top-1 72%,這個理論計算量與SqueezeNet是同一等級,比MobileNetV1更好更小更快
- MobileNetV2-1.4版本(1.4**2=1.96,大約是baseline的2倍)參數數量6.9M,計算量585M,top-1 74.7%,這個計算量與1.0-MobileNet-224和ShuffleNetx2g3同一等級,性能超過ShuffleNet 1%
- 甚至超過了NASNet,是目前最好的高效小網絡結構,更重要的是開源了模型和代碼,github上有各個平台的模型復現
(溫馨提示:由於論文arXiv第一版有幾處筆誤,導致之前github上復現的模型結構都或多或少有錯誤,請仔細對照tensorflow官方代碼和模型結構。比如:
發現第一個t=1的bottleneck結構實際上是dwconv3x3-conv1x1,沒有前面expansion layer的conv1x1,對照代碼驗證確實如此)
結構方面,每個bottleneck里面兩個ReLU6,方便量化;輸入圖像以s2方式逐階平滑降維;用戶定制依然是寬度乘子和分辨率乘子,同MobileNetV1;通道數量分布前期少后期多,在14x14和7x7階段通道數量額外增加了一次,分別上升50%和100%。
ncnn-benchmark中MobileNetV2是caffe復現的baseline,但由於標准卷積比深度分離卷積優化更好,且CONV3x3比CONV1x1優化更好,導致部分ARM上MobileNetV2與MobileNet速度接近,但性能差距還是存在的,期待進一步優化后能接近SqueezeNetv1.1速度。
每個stage的通道數量:【24 32 64-96 160-320】*6
每個stage的block數量:【2 3 7 4】
Block分析:MobileNetV2 block,類似MobileNet沒有加shotcut
- #params:
- #FLOPs:
block中CONV1x1和DWCONV3x3的計算量、參數數量比例是C:27,以深度層14x14x64(C=384)或14x14x96(C=576)為例,二者比例為14.22或21.33 ,這個占比是目前最低的,所以MobileNetV2是目前能看到的最好的小網絡結構。
IGCV3
MobileNetV2中直接壓縮CONV1x1的方法與前面GCONV+Shuffle/Permutation的方法能否結合優化呢?IGCV3在MobileNetV2的基礎上改進,block中兩個GCONV1x1后面都加了Permutation,分組數量g=2,通道數量保持不變,但深度大幅增加,多了15個block(更高)。
1.0和1.4版本IGCV3都比同樣條件復現的MobileNetV2分別高了接近0.9%和0.8%,但如果與論文中MobileNetV2結果相比,優勢就不明顯了。消融實驗表明,同等參數,加深度版本的性能比加寬度版本更好(同等質量,高比胖要好。。恍然大悟),block中僅在DWCONV3x3后面加ReLU更好。
每個stage的通道數量:【24 32 64-96 160-320】
每個stage的block數量:【4 6 14 7】
block分析略,g=2的block非常相似,主要變化是增加了深度。
SqueezeNext
DWCONV這種壓縮加速“大殺器”在某些移動設備上很難優化,並不總是像理論上那么高效,SqueezeNext延續SqueezeNet模型小的優良傳統,但這次更加注重硬件部署速度,采用兩級sqeeze+分解CONV3x3的方式壓縮加速,兩級CONV1x1壓縮輸入通道數,類似Inception-v3將CONV3x3分解為CONV3x1和CONV1x3,加了ResNet類型的shotcut(避開了DenseNet類型連接,會增加通道數和需要費時耗能的聯結激活)。最后通過硬件模擬找到瓶頸,優化調整網絡結構。
硬件模擬的結果很有參考價值:降維模塊中CONV7x7的計算量占比非常高,即使改成了5x5后總計算量仍然比14x14這一深度層14個block的總計算量還高;分組卷積可以進一步減少模型參數,但會損失性能;同樣21個block,不同分布[6 6 8 1], [4 8 8 1], [2 10 8 1], [2 4 14 1]計算量和參數數量非常接近,實驗結果表明[2 4 14 1]這種在14x14深度層加block的方式性能最好、更快更節能,符合以前所有模型的設計趨勢(加深度層名副其實,我不是亂叫的)。
(提問:DWCONV已證明確實是不好優化,但非對稱卷積CONV1x3和CONV3x1就很好優化嗎?)
- 最小版本1.0-G-SqNxt-23是23個block,CONV1x1加分組卷積優化的結構,僅0.54M參數,top-1 56.88%, top-5 80.83%,接近AlexNet水平,這次比 AlexNet小112倍(上一版SqueezeNet小51倍)
- baseline版本1.0-SqNxt-23v5僅0.94M參數,228M計算量,top-1 59.24%,比AlexNet高2%,比SqueezeNetv1.1更好更小更快
- 加寬版本2.0-SqNxt-23v5是3.23M參數,708M計算量,top-1 67.44%,接近復現版本的MobileNet(論文模型是70.6%),模型小1M但優勢不明顯。
每個stage的通道數量:【32 64 128 256】
每個stage的block數量:【2 4 14 1】
Block分析:
- #params:
- #FLOPs:
block中CONV1x1和CONV3x1+CONV1x3的計算量、參數數量比例是1:1。總體上,通道數較少,體積小是優勢,但性能水平不高,且部署速度還需要良好優化的CONV3x1和CONV1x3支撐。
未完待續--