轻量模型简介
輕量化模型
- 1. 卷積
- 深度可分離卷積(Depthwise separable Convolution)
- 分組卷積(Group Convolution)
- 2. MobileNet
- 一個(gè)問(wèn)題
- 3. ShuffleNet
- channel shuffle
- pointwise group convolutions
- ShuffleNet unit
- ShuffleNet
- 4. SE模塊
- Squeeze操作
- Excitation操作
- SE模塊的加載
- SE Block實(shí)現(xiàn)
1. 卷積
深度可分離卷積(Depthwise separable Convolution)
深度可分離卷積depthwise separable convolution較多的應(yīng)用在輕量級(jí)的網(wǎng)絡(luò),由depthwise(DW)和pointwise(PW)兩個(gè)部分結(jié)合起來(lái)提取特征feature map。相比常規(guī)的卷積操作,其參數(shù)數(shù)量和運(yùn)算成本比較低。
Depthwise separable convolution將卷積操作分為兩步,分別是逐點(diǎn)卷積(PointWise Convolution,PW)和逐通道卷積(DepthWise Convolution,DW)。
-
DepthWise Convolution
標(biāo)準(zhǔn)卷積操作將卷積核用于所有的輸入通道上,如輸入為3×224×224時(shí),一個(gè)卷積核在3個(gè)通道上同時(shí)卷積操作,最終一個(gè)卷積核對(duì)應(yīng)輸出一個(gè)feature map,而DepthWise Convolution不同,它針對(duì)每個(gè)輸入通道應(yīng)用不同的卷積核,一個(gè)卷積核對(duì)應(yīng)一個(gè)輸入通道。DW卷積完全在二維平面內(nèi)運(yùn)算,卷積核數(shù)量與上一層的通道數(shù)相同,如下圖所示
Depthwise Convolution完成后的Feature map數(shù)量與輸入層的通道數(shù)相同,無(wú)法擴(kuò)展Feature map。而且這種運(yùn)算對(duì)輸入層的每個(gè)通道獨(dú)立進(jìn)行卷積運(yùn)算,沒(méi)有有效的利用不同通道在相同空間位置上的特征信息。因此需要PointWise Convolution來(lái)將這些Feature map進(jìn)行組合生成新的Feature map。 -
PointWise Convolution
PointWise Convolution就是卷積核大小為1×1×M的標(biāo)準(zhǔn)卷積,M為上一層的輸出通道數(shù)。PW卷積在ResNet中已經(jīng)用到,使用1×1卷積降低維度。PW卷積運(yùn)算會(huì)將上一步的feature map在深度方向上進(jìn)行加權(quán)組合,生成新的feature map,與普通卷積相同,輸出的feature map數(shù)量與卷積核數(shù)量保持一致,如下圖所示,上一層輸出深度為3,則卷積核大小為1×1×3 。
PW卷積的作用是對(duì)DW后各通道的特征進(jìn)行融合,使得不同通道在相同空間位置上的特征得到有效利用。
綜合來(lái)看,Depthwise separable convolution運(yùn)算過(guò)程如下。
深度可分離卷積降低了參數(shù)數(shù)量和運(yùn)算成本,以3×5×5的輸入,要得到輸出為4×3×3的輸出為例,分別計(jì)算使用標(biāo)準(zhǔn)卷積和深度可分離卷積的參數(shù)量與運(yùn)算量。
由[3, 5, 5]獲得[4, 3, 3],需要4個(gè)filter,每個(gè)大小為3×3,參數(shù)量為卷積核W x 卷積核H x 輸入通道數(shù) x 輸出通道數(shù) = 4×3×3×3 = 108,計(jì)算量為卷積核W x 卷積核H x (圖片W-卷積核W+1) x (圖片H-卷積核H+1) x 輸入通道數(shù) x 輸出通道數(shù) = 3×3×(5-2)×(5-2)×3×4 = 972 。
首先考慮DW卷積,維度與輸入通道數(shù)保持一致,則需要3個(gè)卷積核,每個(gè)大小為3×3,則參數(shù)量=27,計(jì)算量為243;
再考慮PW卷積,卷積核大小為1×1×3,,共有4個(gè),則參數(shù)量為1×1×3×4=12,運(yùn)算量為1×1×3×3×3×4=108;
相加可以得到,深度可分離卷積共計(jì)參數(shù)量為39,運(yùn)算量為351,與標(biāo)準(zhǔn)卷積的108,972相比縮小了很多。
分組卷積(Group Convolution)
分組卷積對(duì)輸入進(jìn)行分組,每組分別卷積,若輸入為C×H×WC×H×WC×H×W,卷積核數(shù)量為N,分為GGG個(gè)組,每組需處理的輸入為CG\frac{C}{G}GC?個(gè),每組輸出為NG\frac{N}{G}GN?,設(shè)每個(gè)卷積核大小為CG×K×K\frac{C}{G}×K×KGC?×K×K,卷積核共有NNN個(gè),參數(shù)量為N×CG×K×KN×\frac{C}{G}×K×KN×GC?×K×K。
即常規(guī)卷積輸出的特征圖上,每一個(gè)點(diǎn)是由輸入特征圖C×H×WC×H×WC×H×W個(gè)點(diǎn)計(jì)算得到的,分組卷積輸出的特征圖上,每一個(gè)點(diǎn)是由輸入特征圖 CG×H×W\frac{C}{G}×H×WGC?×H×W個(gè)點(diǎn)計(jì)算得到的,所以分組卷積的參數(shù)量是標(biāo)準(zhǔn)卷積的1G\frac{1}{G}G1?
因?yàn)槊拷M的卷積核只與該組的輸入進(jìn)行卷積,不會(huì)與其他組的輸入計(jì)算,故運(yùn)算量也大大減小。下圖清晰的展示了分組卷積的運(yùn)算。
2. MobileNet
MobileNet的基本單元是depthwise separable convolution,它們對(duì)參數(shù)規(guī)模和計(jì)算量的改進(jìn)我們?cè)谏厦嬉呀?jīng)有所解釋,根據(jù)論文中進(jìn)一步的推導(dǎo),比較depthwise separable convolution和標(biāo)準(zhǔn)卷積可以得到如下公式:
其中NNN為輸出特征圖深度,DKD_KDK?為卷積核大小,NNN值一般較大,所以可以粗略地認(rèn)為depthwise separable convolution相較于標(biāo)準(zhǔn)卷積,其參數(shù)量可減少至后者的1DK2\frac{1}{D^2_K}DK2?1?。
MobileNet基本結(jié)構(gòu)如下圖右,
基本單元即為可分離卷積單元,從代碼角度來(lái)看MobileNet的Block更為清晰。
MobileNet共有28層,第一層為標(biāo)準(zhǔn)3×3卷積,總體結(jié)構(gòu)如下圖
模型在訓(xùn)練時(shí)使用了非常少的正則化以及數(shù)據(jù)增強(qiáng)技術(shù),因?yàn)樾∧P秃苌儆羞^(guò)擬合的問(wèn)題,也沒(méi)有使用side heads或者標(biāo)簽平滑操作,因?yàn)樯疃染矸e中參數(shù)量很小,所以也沒(méi)有進(jìn)行權(quán)重衰減。
MobileNet為了進(jìn)一步縮小模型,引入了兩個(gè)超參數(shù)——width multiplier和resolution multiplier,前者按比例減少通道數(shù),記為α\alphaα,幾個(gè)典型的取值為1, 0.75, 0.5和0.25,結(jié)合此參數(shù),計(jì)算量為
后者按比例降低特征圖大小,記為ρ\rhoρ,例如原來(lái)輸入特征圖是224x224,可以減少為192x192,引入resolution multiplier后,參數(shù)計(jì)算為
引入width multiplier和resolution multiplier勢(shì)必會(huì)降低MobileNet的性能,所以根據(jù)需要的accuracy和model size來(lái)選擇其取值。
一個(gè)問(wèn)題
在很多文章中提到了此時(shí)計(jì)算量的bottleneck是conv1x1,這是我現(xiàn)在還沒(méi)能理解的地方,需要以后繼續(xù)學(xué)習(xí)。
3. ShuffleNet
前面提到在MobileNet中,1×1卷積已成為繼續(xù)縮減計(jì)算量的瓶頸,這時(shí)出現(xiàn)了ShuffleNet,它在Xception和ResNeXt基礎(chǔ)上,使用pointwise group convolutions減少1×1卷積的復(fù)雜性,并且為了克服分組卷積帶來(lái)的副作用(分組之間的信息不流通),提出一種新的操作——channel shuffle來(lái)幫助不同特征分組之間的信息“交流”。
ShuffleNet除了已經(jīng)介紹的depthwise separable convolution,還使用了channel shuffle、pointwise group convolutions來(lái)改進(jìn)ResNet。
channel shuffle
channel shuffle操作基于分組卷積(group convolution),分組卷積已在上面介紹過(guò),如下圖(a)所示,每個(gè)卷積核僅與其對(duì)應(yīng)分組的feature map做卷積,這樣大大減少了計(jì)算量,但是會(huì)有“副作用”,對(duì)于輸出特征,它僅僅關(guān)注學(xué)習(xí)所在分組的特征,某個(gè)通道的輸出僅來(lái)自一小部分輸入通道,這樣具有很大的局限性,故作者提出channel shuffle。
在(b)圖中,在一次分組卷積GConv1后,對(duì)所得結(jié)果的feature劃分為subgroups(在代碼中可通過(guò)reshape和 transpose來(lái)實(shí)現(xiàn)),將subgroups順序打亂后輸入到GConv2的分組卷積核中,而( c )圖的思想與(b)圖是一致的,這樣就可以在一定程度上解決分組卷積通道信息不相關(guān)的問(wèn)題。
對(duì)channel shuffle,原文中已解釋的很明白
This can be efficiently and elegantly implemented by a channel shuffle operation (Fig 1 (c )): suppose a convolutional layer with g groups whose output has g × n channels; we first reshape the output channel dimension into (g; n), transposing and then flattening it back as the input of next layer.
即使兩個(gè)卷積具有不同的組數(shù),該操作仍然有效。此外,channel shuffle也是可微的,這意味著它可以嵌入到網(wǎng)絡(luò)結(jié)構(gòu)中進(jìn)行端到端訓(xùn)練。
pointwise group convolutions
PW卷積為卷積核大小為1×1的卷積操作,pointwise group convolutions即為分組的PW卷積。
ShuffleNet unit
作者利用原始ResNet中的Bottleneck模塊,逐步改進(jìn),最終形成ShuffleNet Unit。
圖(a):用3×3的DW卷積代替Bottleneck中的3×3卷積;
圖(b):用1×1的分組卷積代替原來(lái)的1×1卷積;
圖(c):在short cut上添加3×3的平均池化并設(shè)置stride=2,改變?cè)蠷esNet的Add操作為concat,即按channel合并,這使得在不增加額外計(jì)算成本的情況下,很容易擴(kuò)大通道尺寸。
ShuffleNet
基于ShuffleNet Unit,提出ShuffleNet結(jié)構(gòu)如下表
ShuffleNet主要由ShuffleNet Unit堆疊而成,主體遵循ResNet的結(jié)構(gòu),分為3個(gè)stage,每個(gè)stage中用ShuffleNet Unit代替原有的殘差塊,在ShuffleNet Unit中使用分組數(shù)g控制PW卷積的復(fù)雜度,使用不同組數(shù)和輸出通道數(shù),以確保計(jì)算量大致不變。
將上表中的ShuffleNet作為ShuffleNet 1×,在通道上取一個(gè)縮放因子sss,將其模型稱(chēng)為ShuffleNet s×,sss用于控制filters的數(shù)量,在整個(gè)ShuffleNet架構(gòu)上,其復(fù)雜度的變化大概是s2s^2s2倍,不同參數(shù)的表現(xiàn)和計(jì)算量如下表所示
ShuffleNet的實(shí)現(xiàn)代碼:ShuffleNet V1 神經(jīng)網(wǎng)絡(luò)簡(jiǎn)介與代碼實(shí)戰(zhàn)
對(duì)于卷積模型壓縮的幾個(gè)變形,這篇文章介紹的很詳細(xì),可作為參考閱讀:
深入剖析MobileNet和它的變種(例如:ShuffleNet)為什么會(huì)變快?
4. SE模塊
SENet即Squeeze-and-Excitation Networks,使用SE模塊學(xué)習(xí)通道之間的相關(guān)性,通過(guò)對(duì)通道進(jìn)行加權(quán),強(qiáng)調(diào)有效信息,抑制無(wú)效信息。
SE模塊分為Squeeze和Excitation兩部分,很容易加載到已有的網(wǎng)絡(luò)架構(gòu)中,SE模塊的結(jié)構(gòu)如下圖所示:
可以看到,輸入X(C′×H′×W′C'×H'×W'C′×H′×W′)先經(jīng)過(guò)一個(gè)FtrF_{tr}Ftr?變換(eg. 卷積)獲得特征圖U(C×H×WC×H×WC×H×W),接著就要進(jìn)行SE分支的操作。
Squeeze操作
Squeeze本質(zhì)上是一個(gè)全局平均池化,順著空間維度進(jìn)行特征壓縮,將每個(gè)二維的特征通道變成一個(gè)通道描述符(標(biāo)量),這個(gè)描述符在某種程度上具有全局的感受野,并且輸出的維度(1×1×C1×1×C1×1×C)與輸入的特征通道數(shù)一致,它允許網(wǎng)絡(luò)的所有層使用來(lái)自全局感受野的信息。
Excitation操作
輸入為Squeeze的輸出,維度為1×1×C1×1×C1×1×C。
Excitation操作基于特征通道間的相關(guān)性,對(duì)每個(gè)特征通道生成了一個(gè)權(quán)重,用于代表特征通道的重要程度,故Excitation的輸出維度仍是C個(gè)標(biāo)量(1×1×C1×1×C1×1×C)。
權(quán)重生成后,通過(guò)乘法逐通道地加權(quán)到之前的特征上,完成通道維度上對(duì)原始特征的特征重標(biāo)定。
SE模塊的加載
SE模塊的簡(jiǎn)單性也使得它很容易加入到已有的網(wǎng)絡(luò)結(jié)構(gòu)中,原論文中舉了兩個(gè)例子,分別是Inception和ResNet并給出了詳細(xì)的計(jì)算圖,結(jié)合Inception網(wǎng)絡(luò)的計(jì)算圖,可以更好的理解SE模塊的操作過(guò)程。
Squeeze操作即圖中的Global Pooling,Excitation操作即后續(xù)的FC+RELU+FC+Sigmoid組合。
在進(jìn)行Excitation時(shí),第一次FC的輸出維度上添加了一個(gè)衰減因子reduction,這個(gè)參數(shù)的目的是為了減少通道個(gè)數(shù)從而降低計(jì)算量。
對(duì)Squeeze中的池化選擇、Excitation中reduction值大小和激活函數(shù)選擇,原論文中也做了不同嘗試,可以查看原論文進(jìn)行了解。
將SE加載到ResNet中,結(jié)構(gòu)是相似的
這時(shí)需要考慮的要更多一些,例如SE block是加在ResNet哪個(gè)stage或者放在殘差單元的哪個(gè)位置,論文也對(duì)不同情況進(jìn)行了實(shí)驗(yàn),如下圖,將SE放在殘差單元不同位置的結(jié)構(gòu)
不同實(shí)驗(yàn)的結(jié)果對(duì)比,參看原論文,不做介紹。
SE Block實(shí)現(xiàn)
根據(jù)結(jié)構(gòu)圖,使用pytorch可以快速完成SE模塊的搭建,代碼如下
class SELayer(nn.Module):def __init__(self, channel, reduction=16):super(SELayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Sequential(nn.Linear(channel, channel // reduction, bias=False),nn.ReLU(inplace=True),nn.Linear(channel // reduction, channel, bias=False),nn.Sigmoid())def forward(self, x):b, c, _, _ = x.size()y = self.avg_pool(x).view(b, c)y = self.fc(y).view(b, c, 1, 1)return x * y.expand_as(x)總結(jié)
- 上一篇: 数据结构系统框图
- 下一篇: 左神讲算法——超级水王问题(详解)