ShuffleNet v1 自用筆記
CVPR 2018 ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
Abstract
We introduce an extremely computation-efficient CNNarchitecture named ShuffleNet, which is designed speciallyfor mobile devices with very limited computing power.The new architecture utilizes two newoperations, pointwise group convolution and channel shuf-fle, to greatly reduce computation cost while maintainingaccuracy.
商湯、曠視、依圖、云從是我國(guó)的AI四小龍企業(yè),而shuffleNet正是由曠世科技提出來(lái)的模型,在邊緣設(shè)備上占據(jù)了非常重要的地位,主要手段即分組卷積Group Pointwise Convolution,和通道重排Channel Shuffle。
Model
Group Convolution
分組卷積其實(shí)和深度可分離卷積很相似。普通的卷積是n*n*depth的尺寸,有多少個(gè)卷積核就有多少個(gè)輸出channel。分組卷積的卷積尺寸則是n*n*(depth/k),其中k的值是人為設(shè)定的。舉個(gè)例子,原先的特征圖是64*64*90的,要生成一個(gè)64*64*180的新特征圖,傳統(tǒng)做法可以用180個(gè)1*1*90的卷積去生成,而對(duì)于3個(gè)組的分組卷積,只需要3*60(180)個(gè)1*1*30的卷積,這樣在保證生成特征圖尺寸與深度不變的情況下,直接縮減了3倍的參數(shù)量。其中60個(gè)1*1*30的卷積核去對(duì)原特征圖的前30層(也就是形狀為64*64*30的原特征圖的1/3)做卷積生成64*64*60的特征圖,中間60個(gè)生成60張,后面60張,最后將這180做concat堆疊,生成64*64*180的特征圖??梢詤⒁?jiàn)下圖。

Channel Shuffle Operation
眾所周知,近親繁殖是個(gè)不合適的行為,在ShuffleNet也是如此,試想一下,若一直按照上述的方式做卷積,那么最后是不是就會(huì)出現(xiàn)類似這一個(gè)組永遠(yuǎn)之和自己這一個(gè)組里的人做卷積,特征融合呢?為了避免這種情況出現(xiàn),ShuffleNet在每次分組卷積完成后,對(duì)所有的channel進(jìn)行了一次重排操作,具體參見(jiàn)下圖的(b)(c),這個(gè)看起來(lái)很直觀,不過(guò)多解釋!

shuffleNet基本由下述的ShuffleNet Unit構(gòu)成:(b)圖對(duì)應(yīng)不改變特征圖的size的時(shí)候的操作,左邊的shortcut為普通的殘差連接,直接用add,右邊的分支的第一層就是1*1的分組卷積層,和上面我舉得例子一樣的操作;第二層就是shuffle操作,將不同組之間的channel進(jìn)行重排,使各個(gè)維度的特征能充分做特征融合;第三層是一個(gè)深度可分離的使用了BottleNeck結(jié)構(gòu)的卷積,大概就是先使用普通1*1卷積降維,然后用深度可分離卷積3*3*1的卷積核進(jìn)行卷積,再使用1*1*depth的卷積還原到原來(lái)的維度,具體參見(jiàn)之前的MobileNet和ResNet。需要注意的是這里對(duì)于特征的提取非常的具象了,所以在使用激活函數(shù)的時(shí)候需要小心,在大規(guī)模神經(jīng)網(wǎng)絡(luò)中使用relu這種很"粗獷"的激活函數(shù)可能不會(huì)有副作用,但是在這種很精簡(jiǎn),每一個(gè)數(shù)值都可能很有意義的輕量化網(wǎng)絡(luò)中,應(yīng)當(dāng)盡量避免信息的丟失,更為謹(jǐn)慎的選擇激活函數(shù)與使用非線性激活函數(shù),在這里可以看到并不是在每一次卷積后都使用了激活函數(shù)。
(c)圖對(duì)于將特征圖的size減半,深度加深一倍時(shí)候的操作,這里通過(guò)stride=2的AVGpooling將原特征圖進(jìn)行size的減半;同時(shí)通過(guò)與(b)類似的卷積操作,但是在3*3卷積時(shí)將stride設(shè)置為2來(lái)完成size的減半;在最后將兩個(gè)size減半后的特征圖進(jìn)行concat來(lái)完成深度的加倍??梢钥吹竭@里借鑒了googleNet中Inception模塊的思路。

?
總結(jié)
ShuffleNet的性能是不錯(cuò)的,速度很快。其實(shí)這個(gè)分組卷積的操作早在AlexNet的時(shí)候就用了,當(dāng)時(shí)是因?yàn)樗懔ο拗贫坏貌贿M(jìn)行分組卷積來(lái)降低計(jì)算量。后續(xù)的研究基本算力上來(lái)了,就沒(méi)人分組了。時(shí)過(guò)境遷,現(xiàn)在為了做邊緣計(jì)算,輕量化網(wǎng)絡(luò)盛行,又重新做了這個(gè)工作,shufflenet則提出了shuffle channel這個(gè)操作來(lái)解決了分組卷積的一個(gè)副作用,還是不錯(cuò)的。