MobileNet v1
論文鏈接:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
創(chuàng)新點
輕量化體現(xiàn)在:
- 深度可分離卷積(Depthwise Separable Convolution)
- 兩個模型壓縮參數(shù)(寬度乘數(shù)和分辨率乘數(shù))
1征堪、深度可分離卷積
將常規(guī)卷積分為兩部分:一是深度卷積据块,n 個卷積核和 n 個輸入特征圖分別卷積跌榔,也就是分組卷積叉讥;二是 1x1 卷積,將第一步的卷積結(jié)果融合起來拄养。之所以使用1x1卷積离斩,是因為深度卷積導(dǎo)致信息流通不暢 银舱,即輸出的 feature map 僅包含輸入的 feature map 的一部分瘪匿,point-wise(1x1) convolution 幫助信息在通道之間流通。深度可分離卷積好處是可以減小計算量和模型尺寸寻馏。
如何減小計算量
如下圖所示棋弥。比如一個輸入特征圖的尺寸是,與 N 個的卷積核進行卷積诚欠,stride=1
和padding=same
顽染,那么輸出特性圖尺寸為『涿啵總計算量為粉寞,每個卷積核和特征圖的每個位置進行卷積;總參數(shù)量(不計偏置)左腔。
深度可分離卷積打破輸出通道數(shù)量和卷積核大小之間的相互作用唧垦。深度卷積對 M 個特征圖分別進行卷積,對應(yīng)的卷積核深度就變成了1液样,所以第一步的計算量為振亮,參數(shù)數(shù)量為巧还;第二步是1x1卷積,即 N 個尺寸為 1x1xM 的卷積核與第一步的 M 個特征圖卷積坊秸,這步的計算量為 麸祷,參數(shù)數(shù)量為 “Γ總的計算量 阶牍,總參數(shù)。計算量和參數(shù)變?yōu)樵瓉淼?img class="math-inline" src="https://math.jianshu.com/math?formula=1%2FN%2B1%2F(D_K)%5E2" alt="1/N+1/(D_K)^2" mathimg="1">星瘾。當(dāng)卷積核尺寸為3時荸恕,變?yōu)?/8或1/9。減小計算量的同時死相,準確率只會下降一點融求。
網(wǎng)絡(luò)結(jié)構(gòu)
除了第一個卷積層是普通卷積,后面的都是深度可分離卷積算撮。所有層(除了最后一個全連接層)后面都是一個BN層和ReLU層生宛,最后的全連接層后面是softmax層進行分類。此外肮柜,深度卷積和 1x1 卷積后面都分別有BN和ReLU陷舅。降采樣通過stride=2
的卷積進行(常規(guī)卷積和深度可分離卷積都有)。最后在全連接層前使用平均池化層將空間分辨率降低到1审洞,即壓縮成特征向量莱睁。如果將深度卷積和1x1卷積計為單獨的層,MobileNet有28層芒澜。網(wǎng)絡(luò)總降采樣倍數(shù)為32仰剿。
conv_dw
的Pytorch
實現(xiàn):
import torch.nn as nn
def conv_dw(inp, oup, stride):
return nn.Sequential(
# 深度卷積痴晦,輸入輸出通道數(shù)相同南吮,使用組卷積,個數(shù)等于輸入通道數(shù)
nn.Conv2d(inp,inp, kernel_size=3, stride=stride, padding=1, groups=inp, bias=False),
nn.BatchNorm2d(inp),
nn.ReLU(inplace=True),
# 1x1卷積
nn.Conv2d(inp, oup, 1, 1, 0, bias=False),
nn.BatchNorm2d(oup),
nn.ReLU(inplace=True) )
除此之外誊酌,MobileNet實現(xiàn)上也非常高效部凑。1×1卷積不需要在內(nèi)存中重新排序,并可以直接使用GEMM實現(xiàn)碧浊,GEMM是最優(yōu)化的數(shù)值線性代數(shù)算法之一涂邀。 MobileNet在1×1卷積中花費95%的計算時間,其中也有75%的參數(shù)箱锐。其他參數(shù)幾乎都在全連接層比勉。
MobileNet模型在TensorFlow使用RMSprop進行訓(xùn)練,與訓(xùn)練大型模型相反,使用較少的正則化敷搪、數(shù)據(jù)增強和參數(shù)衰減(L2正則)技術(shù)兴想,因為小型模型參數(shù)很少,在過擬合方面問題不大赡勘。
2嫂便、模型壓縮系數(shù)
寬度乘數(shù):更薄的模型
寬度乘數(shù) α 的作用是在每層均勻地稀疏網(wǎng)絡(luò)。對于給定層和α闸与,輸入通道的數(shù)量 M 變?yōu)?αM毙替,輸出通道的數(shù)量 N 變?yōu)?αN〖#總計算量變?yōu)椋?img class="math-inline" src="https://math.jianshu.com/math?formula=D_F%C2%B7D_F%C2%B7D_K%C2%B7D_K%C2%B7%CE%B1M%2BD_F%C2%B7D_F%C2%B7%CE%B1M%C2%B7%CE%B1N" alt="D_F·D_F·D_K·D_K·αM+D_F·D_F·αM·αN" mathimg="1">
α常用取值
分辨率乘數(shù):減少分辨率
分辨率乘數(shù) ρ 應(yīng)用于輸入圖像厂画,并且每個層的特征圖隨后被相同的乘數(shù)減少。在實踐中拷邢,一般通過設(shè)置輸入圖片分辨率隱式設(shè)置 ρ 袱院。ρ∈(0,1)通常隱式設(shè)置,使得網(wǎng)絡(luò)的輸入分辨率為 224瞭稼、192忽洛、160 或 128。分辨率乘數(shù)具有將計算成本降低 ρ2 的效果环肘。
現(xiàn)在網(wǎng)絡(luò)核心層深度可分離卷積的計算量表示為寬度乘數(shù) α 和分辨率乘數(shù) ρ 的公式:
兩個超參數(shù)和深度可分離卷積減小計算量對比欲虚,第一行顯示完整卷積層的Mult-Adds和參數(shù),其中輸入特征映射的大小為14×14×512悔雹,卷積核 K 的大小為 3×3×512×512复哆。下一行是在前一行的基礎(chǔ)改動。
實驗結(jié)果
- 與常規(guī)卷積相比腌零,計算量大幅減小梯找,準確率只略微減小
- 模型壓縮系數(shù)的影響
- 與經(jīng)典網(wǎng)絡(luò)比較
MobileNet v2
論文鏈接:MobileNetV2: Inverted Residuals and Linear Bottlenecks
創(chuàng)新點
- 反殘差(Inverted residuals)
- Linear bottlenecks
Inverted Residuals
MobileNet-V1 最大的特點是采用深度可分離卷積(DW)來減少運算量以及參數(shù)量,而在網(wǎng)絡(luò)結(jié)構(gòu)上莱没,沒有采用shortcut的方式初肉。Resnet 及 Densenet 等一系列采用 shortcut 的網(wǎng)絡(luò)的成功,表明了 shortcut 的好處饰躲,于是 MobileNet-V2 采用了 shortcut ,將輸入和輸出相加臼隔。
通常的 residuals block 是先經(jīng)過一個 1x1 的卷積層嘹裂,把特征圖的通道數(shù)壓縮,再通過 3x3 卷積層摔握,最后經(jīng)過一個 1x1 的卷積層將特征圖通道數(shù)擴張回去寄狼。而 inverted residuals 是 先“擴張”,后“壓縮”。原因是 MobileNet v2是將DW 卷積層替代 residuals block 的常規(guī)卷積泊愧,這樣做會碰到如下問題:DW 卷積層提取到的特征受限于輸入的通道數(shù)伊磺,若是采用以往的 residual block,先“壓縮”删咱,再卷積提特征屑埋,那么 DW 卷積層可提取得特征就太少了,因此MobileNetV2 反其道而行痰滋,一開始先“擴張”摘能,本文實驗“擴張”倍數(shù)為6。 通常residual block 里面是 “壓縮”→“卷積提特征”→“擴張”敲街,MobileNetV2 變成了 “擴張”→“卷積提特征”→ “壓縮”团搞,因此稱為Inverted residuals。
與 ResNet對比:
相同點
- 借鑒 ResNet多艇,都采用了 1x1 -> 3x3 -> 1x1的模式逻恐;
- 同樣使用 Shortcut 將輸出與輸入相加(未在上式畫出)
不同點
- ResNet 使用 標準卷積 提特征,MobileNet 使用 DW卷積 提特征峻黍;
- ResNet 先降維 (0.25倍)梢莽、卷積、再升維奸披,而 MobileNet V2 則是 先升維 (6倍)昏名、卷積、再降維
Linear bottlenecks
當(dāng)采用“擴張”→“卷積提特征”→ “壓縮”時阵面,在“壓縮”之后會碰到一個問題轻局,那就是 Relu 會破壞特征。為什么這里的Relu會破壞特征呢样刷?這得從 Relu 的性質(zhì)說起仑扑,Relu對于負的輸入,輸出全為零置鼻;而本來特征就已經(jīng)被“壓縮”镇饮,再經(jīng)過Relu的話,又要“損失”一部分特征箕母,因此這里不采用Relu储藐,實驗結(jié)果表明這樣做是正確的,這就稱為 Linear bottlenecks嘶是。
與MobileNet V1對比:
相同點
- 都采用深度可分離卷積提取特征
不同點
- V2 在 DW 卷積之前新加了一個 PW 卷積“擴張”層钙勃,目的是為了提升通道數(shù),獲得更多特征聂喇;
- V2 去掉了第二個 PW 的ReLU辖源,即 Linear Bottleneck,目的是防止Relu破壞特征
網(wǎng)絡(luò)結(jié)構(gòu)
注:文中提到共計采用19個bottleneck,但是這里只有17個克饶。
Conv2d 和 avgpool 和傳統(tǒng)CNN里的操作一樣酝蜒;最大的特點是 bottleneck,一個bottleneck由如下三個部分構(gòu)成:
一個 residuals bottleneck 結(jié)構(gòu)的 Multiply Add 為:
特別的矾湃,針對stride=1 和stride=2亡脑,在block上有稍微不同,主要是為了與shortcut的維度匹配洲尊,因此远豺,stride=2時,不采用shortcut坞嘀。 具體如下圖:
實驗結(jié)果
- MobileNet V2分類時的表現(xiàn)
注:這是在手機的CPU上跑出來的結(jié)果(Google pixel 1 for TF-Lite)躯护。
- 檢測時的表現(xiàn)
注:SSDLite是把SSD預(yù)測層中所有常規(guī)卷積用深度可分離卷替換。與常規(guī)SSD相比丽涩,SSDLite顯著降低了參數(shù)量和計算成本棺滞。
SqueezeNet
論文鏈接:SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE
在ImageNet上實現(xiàn)了和AlexNet相同的正確率,但是只使用了1/50的參數(shù)矢渊。更進一步继准,使用模型壓縮技術(shù),可以將SqueezeNet壓縮到0.5MB矮男,是AlexNet的1/510移必。
創(chuàng)新點
- Fire Moudle
- 使用模型壓縮方法進一步壓縮網(wǎng)絡(luò)
Fire Moudle
SqueezeNet 的核心在于 Fire module,F(xiàn)ire module 由兩層構(gòu)成毡鉴,分別是 squeeze 層和expand 層崔泵,如下圖所示。與 inception 系列的思想非常接近猪瞬,首先 squeeze 層憎瘸,就是 1x1 卷積,其卷積核數(shù)要少于上一層 feature map 數(shù)陈瘦,這個操作是“壓縮”幌甘; Expand 層分別用 1x1 和 3x3 卷積,然后 concat痊项,這個操作在 inception 系列里面也有锅风。
具體操作:
首先,HxWxM 的 feature map 經(jīng)過 Squeeze 層线婚,得到 S1 個 feature map遏弱,這里的 S1 均是小于 M 的,以達到壓縮的目的塞弊;然后,HxWxS1 的特征圖輸入到 Expand 層,分別經(jīng)過 1x1 卷積層和 3x3 卷積層進行卷積游沿,再將結(jié)果進行 concat饰抒,得到 Fire module 的輸出,為 HM(e1+e3) 的 feature map诀黍。三個可調(diào)參數(shù):S1袋坑,e1,e3眯勾,分別代表卷積核的個數(shù)枣宫,同時也表示對應(yīng)輸出 feature map 的維數(shù),在文中提出的 SqueezeNet 結(jié)構(gòu)中吃环,e1=e3=4s1也颤。
網(wǎng)絡(luò)結(jié)構(gòu)
網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計思想,同樣與 VGG 的類似郁轻,堆疊的使用卷積操作翅娶,只不過這里堆疊的是 Fire module(圖中用紅框部分)。
進一步壓縮
模型壓縮方法
為了得到一個參數(shù)非常少但同時保持準確性的模型好唯,一個明智的方法是采用現(xiàn)有的CNN模型并以有損的方式壓縮它竭沫。常用的模型壓縮技術(shù)有:
- 奇異值分解(singular value decomposition (SVD))預(yù)訓(xùn)練模型
- 網(wǎng)絡(luò)剪枝(Network Pruning):用零替換預(yù)訓(xùn)練模型低于某個閾值的參數(shù)以形成稀疏矩陣,并最終在稀疏CNN上執(zhí)行一些訓(xùn)練迭代
- 深度壓縮(Deep compression):使用網(wǎng)絡(luò)剪枝骑篙,量化和 huffman 編碼
- 使用硬件加速器(hardware accelerator)
注:標題中的0.5M參數(shù)是 Squeezenet 經(jīng)過 Deep compression 后的結(jié)果蜕提。
ShuffleNet V1
論文鏈接:ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
創(chuàng)新點
ShuffleNet 可以看作是ResNet的壓縮版本,主要思想是:
- 使用 group convolution
- 使用 channel shuffle
分組卷積(group convolution)
Group convolution 自 Alexnet 就有靶端,當(dāng)時因為硬件限制而采用分組卷積谎势;之后在 2016 年的 ResNeXt 中,表明采用 group convolution 可獲得高效的網(wǎng)絡(luò)躲查;再有 Xception 和 MobileNet 均采用 depth-wise convolution, 這些都是最近出來的一系列輕量化網(wǎng)絡(luò)模型它浅。
假設(shè)有輸入feature map,尺寸為 镣煮,與 k 個 的卷積核卷積姐霍,輸出尺寸為
而Group convolution的實質(zhì)就是將卷積分為 g 個獨立的組,分別計算典唇。即:
- 把 input feature 分為 g 組镊折,每組的大小為
- 把 kernel 也分為 g 組,每組有 k/g 個 的卷積核
- 按順序介衔,每組 input feature 和 kernel 分別做普通卷積恨胚,輸出 g 組 的特征圖,一共有 g 組炎咖,總輸出
注:深度可分離卷積的第一步的就是分組卷積的一個特例赃泡,分組數(shù)等于輸入通道數(shù)寒波。
于是可以把 pointwise convolution(1x1)用 pointwise group convolution 代替,將卷積運算限制在每個Group內(nèi)來降低計算量升熊。
Channel Shuffle
由于采用分組卷積俄烁,group與group之間的幾乎沒有聯(lián)系,影響了網(wǎng)絡(luò)的準確率级野。因此 Xception页屠,MobileNet等網(wǎng)絡(luò)采用密集的 1x1 卷積,因為要保證 group convolution之后不同組的特征圖之間的信息交流蓖柔。但是達到上面那個目的辰企,我們不一定非要采用 dense pointwise convolution,于是提出了 channel shuffle 來加強 group 之間的聯(lián)系况鸣。同時channel shuffle是可導(dǎo)的牢贸,可以實現(xiàn) end-to-end 一次性訓(xùn)練網(wǎng)絡(luò)。
具體方法為:把各組的 channel 平均分為 g(下圖 g=3)份懒闷,然后依次序的重新構(gòu)成 feature map十减。
在程序上實現(xiàn) channel shuffle 是非常容易的:假定將輸入層分為 g 組,總通道數(shù)為 愤估,首先將總通道數(shù)那個維度拆分為 兩個維度帮辟,然后將這兩個維度轉(zhuǎn)置變成 ,最后重新 reshape 成一個維度玩焰。
網(wǎng)絡(luò)結(jié)構(gòu)
ShuffleNet的基本單元是在一個殘差單元的基礎(chǔ)上改進而成的。如圖a所示昔园,這是一個包含3層的殘差單元:首先是1x1卷積蔓榄,然后是3x3的depthwise convolution(DWConv,主要是為了降低計算量)默刚,這里的3x3卷積是瓶頸層(bottleneck)甥郑,緊接著是1x1卷積,最后是一個短路連接荤西,將輸入直接加到輸出上±浇粒現(xiàn)在,進行如下的改進:將密集的1x1卷積替換成1x1的group convolution邪锌,不過在第一個1x1卷積之后增加了一個channel shuffle操作勉躺。值得注意的是3x3卷積后面沒有增加channel shuffle,按paper的意思觅丰,對于這樣一個殘差單元饵溅,一個channel shuffle操作是足夠了。還有就是3x3的depthwise convolution之后沒有使用ReLU激活函數(shù)妇萄。改進之后如圖b所示蜕企。對于殘差單元咬荷,如果stride=1時,此時輸入與輸出shape一致可以直接相加糖赔,而當(dāng)stride=2時萍丐,通道數(shù)增加轩端,而特征圖大小減小放典,此時輸入與輸出不匹配。一般情況下可以采用一個1x1卷積將輸入映射成和輸出一樣的shape基茵。但是在ShuffleNet中奋构,卻采用了不一樣的策略,如圖c所示:對原輸入采用stride=2的3x3 avg pool拱层,這樣得到和輸出一樣大小的特征圖弥臼,然后將得到特征圖與輸出進行連接(concat),而不是相加根灯。這樣做的目的主要是降低計算量與參數(shù)大小径缅。
代碼實現(xiàn):http://www.reibang.com/p/84b2a4590ec8
實驗結(jié)果
注:ShuffleNet s× 表示通道數(shù)放縮到s倍。
- 與MobileNet對比
- 倍數(shù)與分組數(shù)
缺點
- Shuffle channel在實現(xiàn)的時候需要大量的指針跳轉(zhuǎn)和Memory set烙肺,這本身就是極其耗時的纳猪;同時又特別依賴實現(xiàn)細節(jié),導(dǎo)致實際運行速度不會那么理想桃笙。
- Shuffle channel規(guī)則是人工設(shè)計出來的氏堤,不是網(wǎng)絡(luò)自己學(xué)出來的。這不符合網(wǎng)絡(luò)通過負反饋自動學(xué)習(xí)特征的基本原則搏明,又陷入人工設(shè)計特征的老路(如sift/HOG等鼠锈。
ShuffleNet V2
論文鏈接:Shu?eNet V2: Practical Guidelines for E?cient CNN Architecture Design
正如標題那樣,是實驗引導(dǎo)的高效CNN結(jié)構(gòu)設(shè)計星著,文章的觀點和實驗都比較新穎追驴。
高效CNN網(wǎng)絡(luò)設(shè)計
時間消耗分析
目前衡量模型復(fù)雜度的一個通用指標是FLOPs察净,具體指的是卷積層的 multiply-add 數(shù)量,但是這卻是一個間接指標,因為它不完全等同于速度扯旷。如上圖中的(c)和(d),可以看到相同F(xiàn)LOPs的兩個模型霸奕,其速度卻存在差異轴咱。這種不一致主要歸結(jié)為兩個原因:首先影響速度的不僅僅是FLOPs,如內(nèi)存使用量(memory access cost, MAC)剪廉,這不能忽略娃循,對于GPUs來說可能會是瓶頸;模型的并行程度也影響速度斗蒋,并行度高的模型速度相對更快捌斧。另外一個原因笛质,模型在不同平臺上的運行速度是有差異的,如GPU和ARM捞蚂,而且采用不同的庫也會有影響妇押。
下圖中分析了ShuffleNet v1與MobileNet v2這兩個移動端流行網(wǎng)絡(luò)在GPU/ARM兩種平臺下的時間消耗分布。
從上圖中可看出Conv等計算密集型操作占了其時間的絕大多數(shù)姓迅,但其它像Elemwise/Data IO等內(nèi)存讀寫密集型操作也占了相當(dāng)比例的時間敲霍,因此像以往那樣一味以FLOPs來作為指導(dǎo)準則來設(shè)計CNN網(wǎng)絡(luò)是不完備的,雖然它可以反映出占大比例時間的Conv操作丁存。
準則一:輸入輸出通道數(shù)目相同時肩杈,卷積計算所需的MAC最小
假設(shè)一個1x1卷積層的輸入特征通道數(shù)是c1,尺寸是h和w解寝,輸出特征通道數(shù)是c2扩然,那么這樣一個1x1卷積層的FLOPs就是下面式子所示:
。
假設(shè)內(nèi)存足夠大聋伦,那么內(nèi)存使用量:
夫偶,
分別是輸入特征圖、輸出特征圖觉增、卷積核權(quán)重的使用量兵拢。
根據(jù)均值不等式可以得到公式(1)。把MAC和B代入式子1抑片,就得到(c1-c2)2 >= 0卵佛,因此等式成立的條件是 c1=c2,也就是輸入特征通道數(shù)和輸出特征通道數(shù)相等時敞斋,在給定FLOPs前提下截汪,MAC取最小值。
實驗也證實了這個觀點植捎,改變c1, c2的比例衙解,固定FLOPs時,1:1時速度最快焰枢。
準則二:過多的分組卷積會加大MAC
像MobileNet蚓峦、ShuffleNet、Xception其實都借鑒了卷積的group操作來加速模型济锄,這是因為group操作可以大大減少FLOPs暑椰,因此即便適當(dāng)加寬網(wǎng)絡(luò)也不會使得FLOPs超過原來不帶group的卷積操作,這樣就能帶來比較明顯的效果提升(ResNeXt就是這樣的例子)荐绝。但是一汽,F(xiàn)LOPs不怎么增加并不代表速度變快,相同層數(shù)情況下低滩,ResNeXt的速度要慢許多召夹,差不多只有相同層數(shù)的ResNet速度的一半岩喷,但是相同層數(shù)的ResNeXt的參數(shù)量、FLOPs和ResNet是基本差不多的监憎。這就引出了group操作所帶來的速度上的影響纱意。
和前面同理,一個帶group操作的1x1卷積的FLOPs如下所示鲸阔,多了一個除數(shù)g偷霉,g表示group數(shù)量。這是因為每個卷積核都只和c1/g個通道的輸入特征做卷積隶债,一共c2/g個卷積核腾它,總輸出不變:
此時MAC為:
可見,在B不變時死讹,g越大,MAC也越大曲梗。實驗也證實:c表示c1+c2的和赞警,通過控制這個參數(shù)可以使得每個實驗的FLOPs相同,可以看出隨著g的不斷增大虏两,c也不斷增大愧旦,這和前面說的在基本不影響FLOPs的前提下,引入group操作后可以適當(dāng)增加網(wǎng)絡(luò)寬度吻合定罢。從速度上看笤虫,group數(shù)量的增加對速度的影響還是很大的,原因就是group數(shù)量的增加帶來MAC的增加祖凫,進而帶來速度的降低琼蚯。
準則三:網(wǎng)絡(luò)碎片化會降低并行度,即模型中的分支數(shù)量越多惠况,模型速度越慢
網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計上遭庶,文章用了一個詞:fragment,翻譯過來就是分裂的意思稠屠,可以簡單理解為網(wǎng)絡(luò)的支路數(shù)量峦睡。為了研究fragment對模型速度的影響,作者做了Table3這個實驗权埠,其中2-fragment-series表示一個block中有2個卷積層串行榨了,也就是簡單的疊加;4-fragment-parallel表示一個block中有4個卷積層并行攘蔽,類似Inception的整體設(shè)計龙屉。可以看出在相同F(xiàn)LOPs的情況下秩彤,單卷積層(1-fragment)的速度最快叔扼。因此模型支路越多(fragment程度越高)對于并行計算越不利事哭,這樣帶來的影響就是模型速度變慢,比如Inception瓜富、NASNET-A這樣的網(wǎng)絡(luò)鳍咱。
準則四:Element-wise(元素級)操作會消耗較多的時間
Element-wise類型操作雖然FLOPs非常低,但是帶來的時間消耗還是非常明顯的与柑。比如ReLU和Add谤辜,雖然FLOPs較小,但是卻需要較大的MAC价捧。這里實驗發(fā)現(xiàn)如果將ResNet中殘差單元中的ReLU和shortcut移除的話丑念,速度有20%的提升。
結(jié)論
- 1x1卷積平衡輸入和輸出的通道數(shù)结蟋;
- 組卷積要謹慎使用脯倚,注意分組數(shù);
- 避免網(wǎng)絡(luò)的碎片化嵌屎;
- 減少元素級運算
在ShuffleNet v1的操作中違反了四個設(shè)計準則:首先它使用了bottleneck 1x1 group conv與module最后的1x1 group conv pointwise模塊推正,使得input channels數(shù)目與output channels數(shù)目差別較大,違反了上述規(guī)則一與規(guī)則二宝惰;其次由于它整體網(wǎng)絡(luò)結(jié)構(gòu)中過多的group conv操作的使用從而違反了上述規(guī)則三植榕;最后類似于Residual模塊中的大量Element-wise sum的使用則進而違反了上述規(guī)則四。
ShuffleNet v2中棄用了1x1的group convolution操作尼夺,而直接使用了input/output channels數(shù)目相同的1x1普通conv尊残。它更是提出了一種ChannelSplit新的類型操作,將module的輸入channels分為兩部分淤堵,一部分直接向下傳遞寝衫,另外一部分則進行真正的向后計算。到了module的末尾粘勒,直接將兩分支上的output channels數(shù)目級連起來竞端,從而規(guī)避了原來ShuffleNet v1中Element-wise sum的操作。然后我們再對最終輸出的output feature maps進行RandomShuffle操作庙睡,從而使得各channels之間的信息相互交通事富。
網(wǎng)絡(luò)結(jié)構(gòu)
上圖是關(guān)于ShuffleNet v1和ShuffleNet v2的結(jié)構(gòu)對比,其中(a)和(b)是ShuffleNet v1的兩種不同block結(jié)構(gòu)乘陪,同理(c)和(d)是ShuffleNet v2的兩種不同block結(jié)構(gòu)统台。從(a)和(c)的對比可以看出首先(c)在開始處增加了一個channel split操作,這個操作將輸入特征的通道分成c-c’和c’啡邑,c’在文章中采用c/2贱勃,這主要是和前面第1點發(fā)現(xiàn)對應(yīng)。然后(c)中取消了1x1卷積層中的group操作,這和前面第2點發(fā)現(xiàn)對應(yīng)贵扰,同時前面的channel split其實已經(jīng)算是變相的group操作了仇穗。其次,channel shuffle的操作移到了concat后面戚绕,和前面第3點發(fā)現(xiàn)對應(yīng)纹坐,同時也是因為第一個1x1卷積層沒有g(shù)roup操作,所以在其后面跟channel shuffle也沒有太大必要舞丛。最后是將element-wise add操作替換成concat耘子,這個和前面第4點發(fā)現(xiàn)對應(yīng)。多個(c)結(jié)構(gòu)連接在一起的話球切,channel split谷誓、concat和channel shuffle是可以合并在一起的。(b)和(d)的對比也是同理吨凑,只不過因為(d)的開始處沒有channel split操作捍歪,所以最后concat后特征圖通道數(shù)翻倍,可以結(jié)合后面Table5的具體網(wǎng)絡(luò)結(jié)構(gòu)來看怀骤。
Table5是ShuffleNet v2的具體網(wǎng)絡(luò)結(jié)構(gòu)示意圖费封,不同stage的輸出通道倍數(shù)關(guān)系和前面描述的吻合,每個stage都是由Figure3(c)(d)所示的block組成蒋伦,block的具體數(shù)量對于Figure5中的Repeat列。
實驗結(jié)果
明顯看到ShuffleNet v2在精度和速度上的優(yōu)勢焚鹊。