輕量化模型: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的卷積核進(jìn)行卷積,stride=1padding=same,那么輸出特性圖尺寸為D_F×D_F×N??傆嬎懔繛?img class="math-inline" src="https://math.jianshu.com/math?formula=D_F%C3%97D_F%C3%97D_K%C3%97D_K%C3%97M%C3%97N" alt="D_F×D_F×D_K×D_K×M×N" mathimg="1">,每個卷積核和特征圖的每個位置進(jìn)行卷積;總參數(shù)量(不計偏置)D_K×D_K×M×N。

深度可分離卷積打破輸出通道數(shù)量和卷積核大小之間的相互作用。深度卷積對 M 個特征圖分別進(jìn)行卷積,對應(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。減小計算量的同時,準(zhǔn)確率只會下降一點。

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

除了第一個卷積層是普通卷積,后面的都是深度可分離卷積。所有層(除了最后一個全連接層)后面都是一個BN層和ReLU層,最后的全連接層后面是softmax層進(jìn)行分類。此外,深度卷積和 1x1 卷積后面都分別有BN和ReLU。降采樣通過stride=2的卷積進(jìn)行(常規(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進(jìn)行訓(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ī)卷積相比,計算量大幅減小,準(zhǔn)確率只略微減小
  • 模型壓縮系數(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ù)擴(kuò)張回去。而 inverted residuals 是 先“擴(kuò)張”,后“壓縮”。原因是 MobileNet v2是將DW 卷積層替代 residuals block 的常規(guī)卷積,這樣做會碰到如下問題:DW 卷積層提取到的特征受限于輸入的通道數(shù),若是采用以往的 residual block,先“壓縮”,再卷積提特征,那么 DW 卷積層可提取得特征就太少了,因此MobileNetV2 反其道而行,一開始先“擴(kuò)張”,本文實驗“擴(kuò)張”倍數(shù)為6。 通常residual block 里面是 “壓縮”→“卷積提特征”→“擴(kuò)張”,MobileNetV2 變成了 “擴(kuò)張”→“卷積提特征”→ “壓縮”,因此稱為Inverted residuals

與 ResNet對比:

圖3 與ResNet對比

相同點

  • 借鑒 ResNet,都采用了 1x1 -> 3x3 -> 1x1的模式;
  • 同樣使用 Shortcut 將輸出與輸入相加(未在上式畫出)

不同點

  • ResNet 使用 標(biāo)準(zhǔn)卷積 提特征,MobileNet 使用 DW卷積 提特征;
  • ResNet 先降維 (0.25倍)、卷積、再升維,而 MobileNet V2 則是 先升維 (6倍)、卷積、再降維
Linear bottlenecks

當(dāng)采用“擴(kuò)張”→“卷積提特征”→ “壓縮”時,在“壓縮”之后會碰到一個問題,那就是 Relu 會破壞特征。為什么這里的Relu會破壞特征呢?這得從 Relu 的性質(zhì)說起,Relu對于負(fù)的輸入,輸出全為零;而本來特征就已經(jīng)被“壓縮”,再經(jīng)過Relu的話,又要“損失”一部分特征,因此這里不采用Relu,實驗結(jié)果表明這樣做是正確的,這就稱為 Linear bottlenecks。

與MobileNet V1對比:

圖4 與MobileNet v1對比

相同點

  • 都采用深度可分離卷積提取特征

不同點

  • V2 在 DW 卷積之前新加了一個 PW 卷積“擴(kuò)張”層,目的是為了提升通道數(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ù)。更進(jìn)一步,使用模型壓縮技術(shù),可以將SqueezeNet壓縮到0.5MB,是AlexNet的1/510。

創(chuàng)新點

  • Fire Moudle
  • 使用模型壓縮方法進(jìn)一步壓縮網(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 的,以達(dá)到壓縮的目的;然后,HxWxS1 的特征圖輸入到 Expand 層,分別經(jīng)過 1x1 卷積層和 3x3 卷積層進(jìn)行卷積,再將結(jié)果進(jìn)行 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(圖中用紅框部分)。

進(jìn)一步壓縮
模型壓縮方法

為了得到一個參數(shù)非常少但同時保持準(zhǔn)確性的模型,一個明智的方法是采用現(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)

注:標(biāo)題中的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ò)的準(zhǔn)確率。因此 Xception,MobileNet等網(wǎng)絡(luò)采用密集的 1x1 卷積,因為要保證 group convolution之后不同組的特征圖之間的信息交流。但是達(dá)到上面那個目的,我們不一定非要采用 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ǔ)上改進(jìn)而成的。如圖a所示,這是一個包含3層的殘差單元:首先是1x1卷積,然后是3x3的depthwise convolution(DWConv,主要是為了降低計算量),這里的3x3卷積是瓶頸層(bottleneck),緊接著是1x1卷積,最后是一個短路連接,將輸入直接加到輸出上?,F(xiàn)在,進(jìn)行如下的改進(jìn):將密集的1x1卷積替換成1x1的group convolution,不過在第一個1x1卷積之后增加了一個channel shuffle操作。值得注意的是3x3卷積后面沒有增加channel shuffle,按paper的意思,對于這樣一個殘差單元,一個channel shuffle操作是足夠了。還有就是3x3的depthwise convolution之后沒有使用ReLU激活函數(shù)。改進(jìn)之后如圖b所示。對于殘差單元,如果stride=1時,此時輸入與輸出shape一致可以直接相加,而當(dāng)stride=2時,通道數(shù)增加,而特征圖大小減小,此時輸入與輸出不匹配。一般情況下可以采用一個1x1卷積將輸入映射成和輸出一樣的shape。但是在ShuffleNet中,卻采用了不一樣的策略,如圖c所示:對原輸入采用stride=2的3x3 avg pool,這樣得到和輸出一樣大小的特征圖,然后將得到特征圖與輸出進(jìn)行連接(concat),而不是相加。這樣做的目的主要是降低計算量與參數(shù)大小。

代碼實現(xiàn):http://m.itdecent.cn/p/84b2a4590ec8

實驗結(jié)果

注:ShuffleNet s× 表示通道數(shù)放縮到s倍。

  • 與MobileNet對比
  • 倍數(shù)與分組數(shù)

缺點

  • Shuffle channel在實現(xiàn)的時候需要大量的指針跳轉(zhuǎn)和Memory set,這本身就是極其耗時的;同時又特別依賴實現(xiàn)細(xì)節(jié),導(dǎo)致實際運行速度不會那么理想。
  • Shuffle channel規(guī)則是人工設(shè)計出來的,不是網(wǎng)絡(luò)自己學(xué)出來的。這不符合網(wǎng)絡(luò)通過負(fù)反饋自動學(xué)習(xí)特征的基本原則,又陷入人工設(shè)計特征的老路(如sift/HOG等。

ShuffleNet V2

論文鏈接:Shu?eNet V2: Practical Guidelines for E?cient CNN Architecture Design

正如標(biāo)題那樣,是實驗引導(dǎo)的高效CNN結(jié)構(gòu)設(shè)計,文章的觀點和實驗都比較新穎。

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

高效CNN網(wǎng)絡(luò)設(shè)計

時間消耗分析

目前衡量模型復(fù)雜度的一個通用指標(biāo)是FLOPs,具體指的是卷積層的 multiply-add 數(shù)量,但是這卻是一個間接指標(biāo),因為它不完全等同于速度。如上圖中的(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)準(zhǔn)則來設(shè)計CNN網(wǎng)絡(luò)是不完備的,雖然它可以反映出占大比例時間的Conv操作。

準(zhǔn)則一:輸入輸出通道數(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時速度最快。

準(zhǔn)則二:過多的分組卷積會加大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的增加,進(jìn)而帶來速度的降低。

準(zhǔn)則三:網(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è)計??梢钥闯鲈谙嗤現(xiàn)LOPs的情況下,單卷積層(1-fragment)的速度最快。因此模型支路越多(fragment程度越高)對于并行計算越不利,這樣帶來的影響就是模型速度變慢,比如Inception、NASNET-A這樣的網(wǎng)絡(luò)。

準(zhǔn)則四:Element-wise(元素級)操作會消耗較多的時間

Element-wise類型操作雖然FLOPs非常低,但是帶來的時間消耗還是非常明顯的。比如ReLU和Add,雖然FLOPs較小,但是卻需要較大的MAC。這里實驗發(fā)現(xiàn)如果將ResNet中殘差單元中的ReLU和shortcut移除的話,速度有20%的提升。

結(jié)論
  • 1x1卷積平衡輸入和輸出的通道數(shù);
  • 組卷積要謹(jǐn)慎使用,注意分組數(shù);
  • 避免網(wǎng)絡(luò)的碎片化;
  • 減少元素級運算

在ShuffleNet v1的操作中違反了四個設(shè)計準(zhǔn)則:首先它使用了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的使用則進(jìn)而違反了上述規(guī)則四。

ShuffleNet v2中棄用了1x1的group convolution操作,而直接使用了input/output channels數(shù)目相同的1x1普通conv。它更是提出了一種ChannelSplit新的類型操作,將module的輸入channels分為兩部分,一部分直接向下傳遞,另外一部分則進(jìn)行真正的向后計算。到了module的末尾,直接將兩分支上的output channels數(shù)目級連起來,從而規(guī)避了原來ShuffleNet v1中Element-wise sum的操作。然后我們再對最終輸出的output feature maps進(jìn)行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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容