輕量化模型:MobileNet/SqueezeNet/ShuffleNet

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 幫助信息在通道之間流通。深度可分離卷積好處是可以減小計算量和模型尺寸寻馏。

如何減小計算量

如下圖所示棋弥。比如一個輸入特征圖的尺寸是D_F×D_F×M,與 N 個D_K×D_K×M的卷積核進行卷積诚欠,stride=1padding=same顽染,那么輸出特性圖尺寸為D_F×D_F×N『涿啵總計算量為D_F×D_F×D_K×D_K×M×N粉寞,每個卷積核和特征圖的每個位置進行卷積;總參數(shù)量(不計偏置)D_K×D_K×M×N左腔。

深度可分離卷積打破輸出通道數(shù)量和卷積核大小之間的相互作用唧垦。深度卷積對 M 個特征圖分別進行卷積,對應(yīng)的卷積核深度就變成了1液样,所以第一步的計算量為D_F×D_F×D_K×D_K×M振亮,參數(shù)數(shù)量為D_K×D_K×M巧还;第二步是1x1卷積,即 N 個尺寸為 1x1xM 的卷積核與第一步的 M 個特征圖卷積坊秸,這步的計算量為 D_F×D_F×M×N麸祷,參數(shù)數(shù)量為 M×N “Γ總的計算量 D_F×D_F×D_K×D_K×M+D_F×D_F×M×N阶牍,總參數(shù)D_K×D_K×M+M×N。計算量和參數(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。減小計算量的同時死相,準確率只會下降一點融求。

圖1 常規(guī)卷積與深度可分離卷積過程對比
網(wǎng)絡(luò)結(jié)構(gòu)

除了第一個卷積層是普通卷積,后面的都是深度可分離卷積算撮。所有層(除了最后一個全連接層)后面都是一個BN層和ReLU層生宛,最后的全連接層后面是softmax層進行分類。此外肮柜,深度卷積和 1x1 卷積后面都分別有BN和ReLU陷舅。降采樣通過stride=2的卷積進行(常規(guī)卷積和深度可分離卷積都有)。最后在全連接層前使用平均池化層將空間分辨率降低到1审洞,即壓縮成特征向量莱睁。如果將深度卷積和1x1卷積計為單獨的層,MobileNet有28層芒澜。網(wǎng)絡(luò)總降采樣倍數(shù)為32仰剿。

圖2 常規(guī)卷積和深度可分離卷積都需要BN層、ReLU層

conv_dwPytorch實現(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">
α常用取值[1, 0.75, 0.5, 0.25]

分辨率乘數(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ù) ρ 的公式:

ρD_F·ρD_F·D_K·D_K·αM+ρD_F·ρD_F·αM· αN

兩個超參數(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對比:

圖3 與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對比:

圖4 與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 為:
h*w*1*1*k*tk + h/s*w/s* 3*3*1*tk + h/s*w/s*1*1*tk*k'

特別的矾湃,針對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ù)有:

  1. 奇異值分解(singular value decomposition (SVD))預(yù)訓(xùn)練模型
  2. 網(wǎng)絡(luò)剪枝(Network Pruning):用零替換預(yù)訓(xùn)練模型低于某個閾值的參數(shù)以形成稀疏矩陣,并最終在稀疏CNN上執(zhí)行一些訓(xùn)練迭代
  3. 深度壓縮(Deep compression):使用網(wǎng)絡(luò)剪枝骑篙,量化和 huffman 編碼
  4. 使用硬件加速器(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ò)模型它浅。

常規(guī)卷積

假設(shè)有輸入feature map,尺寸為 H*W*C镣煮,與 k 個 h*w*C 的卷積核卷積姐霍,輸出尺寸為 H'*W'*k

分組卷積

而Group convolution的實質(zhì)就是將卷積分為 g 個獨立的組,分別計算典唇。即:

  • 把 input feature 分為 g 組镊折,每組的大小為 H*W*C/g
  • 把 kernel 也分為 g 組,每組有 k/g 個 h*w*C/g 的卷積核
  • 按順序介衔,每組 input feature 和 kernel 分別做普通卷積恨胚,輸出 g 組 H'*W'*k/g 的特征圖,一共有 g 組炎咖,總輸出 H'*W'*k

注:深度可分離卷積的第一步的就是分組卷積的一個特例赃泡,分組數(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ù)為 g*n愤估,首先將總通道數(shù)那個維度拆分為 g*n 兩個維度帮辟,然后將這兩個維度轉(zhuǎn)置變成 n*g ,最后重新 reshape 成一個維度玩焰。

網(wǎng)絡(luò)結(jié)構(gòu)

(a) 加入Depthwise的ResNet bottleneck結(jié)構(gòu)由驹,(b)和(c)是加入Group convolution和Channel Shuffle的ShuffleNet的結(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è)計星著,文章的觀點和實驗都比較新穎追驴。

ShuffleNet v2 的優(yōu)異性能

高效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就是下面式子所示:
B=1*1*c_1*c_2*h*w=hwc_1c_2

假設(shè)內(nèi)存足夠大聋伦,那么內(nèi)存使用量:
MAC=h*w*c_1+h*w*c_2+1*1*c_1*c_2夫偶,
分別是輸入特征圖、輸出特征圖觉增、卷積核權(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個卷積核腾它,總輸出不變:
B=1*1*c_1/g*c_2/g*h*w*g=hwc_1c_2/g

此時MAC為:
MAC = h*w*c_1+h*w*c_2+1*1*c_1/g*c_2 \\ = hw(c_1 + c_2) +c_1c_2/g \\ = hwc_1 +Bg/c_1+B/hw

可見,在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)勢焚鹊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末痕届,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子末患,更是在濱河造成了極大的恐慌研叫,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璧针,死亡現(xiàn)場離奇詭異嚷炉,居然都是意外死亡,警方通過查閱死者的電腦和手機探橱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門申屹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隧膏,你說我怎么就攤上這事哗讥。” “怎么了胞枕?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵杆煞,是天一觀的道長。 經(jīng)常有香客問我,道長决乎,這世上最難降的妖魔是什么队询? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮构诚,結(jié)果婚禮上蚌斩,老公的妹妹穿的比我還像新娘。我一直安慰自己唤反,他們只是感情好凳寺,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彤侍,像睡著了一般肠缨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盏阶,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天晒奕,我揣著相機與錄音,去河邊找鬼名斟。 笑死脑慧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砰盐。 我是一名探鬼主播闷袒,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岩梳!你這毒婦竟也來了囊骤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤冀值,失蹤者是張志新(化名)和其女友劉穎也物,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體列疗,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡滑蚯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抵栈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片告材。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竭讳,靈堂內(nèi)的尸體忽然破棺而出创葡,到底是詐尸還是另有隱情,我是刑警寧澤绢慢,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布灿渴,位于F島的核電站洛波,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骚露。R本人自食惡果不足惜蹬挤,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棘幸。 院中可真熱鬧焰扳,春花似錦、人聲如沸误续。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹋嵌。三九已至育瓜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栽烂,已是汗流浹背躏仇。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腺办,地道東北人焰手。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像怀喉,于是被迫代替她去往敵國和親书妻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容