從Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2
from:https://blog.csdn.net/qq_14845119/article/details/73648100
Inception v1的網絡,主要提出了Inceptionmodule結構(1*1,3*3,5*5的conv和3*3的pooling組合在一起),最大的亮點就是從NIN(Network in Network)中引入了1*1 conv,結構如下圖所示,代表作GoogleNet
假設previous layer的大小為28*28*192,則,
a的weights大小,1*1*192*64+3*3*192*128+5*5*192*32=387072
a的輸出featuremap大小,28*28*64+28*28*128+28*28*32+28*28*192=28*28*416
b的weights大小,1*1*192*64+(1*1*192*96+3*3*96*128)+(1*1*192*16+5*5*16*32)+1*1*192*32=163328
b的輸出feature map大小,28*28*64+28*28*128+28*28*32+28*28*32=28*28*256
寫到這裏,不禁感慨天才般的1*1 conv,從上面的數據可以看出一方面減少了weights,另一方面降低了dimension。
Inception v1的亮點總結如下:
(1)卷積層共有的一個功能,可以實現通道方向的降維和增維,至於是降還是增,取決於卷積層的通道數(濾波器個數),在Inception v1中1*1卷積用於降維,減少weights大小和feature map維度。
(2)1*1卷積特有的功能,由於1*1卷積只有一個參數,相當於對原始feature map做了一個scale,並且這個scale還是訓練學出來的,無疑會對識別精度有提升。
(3)增加了網絡的深度
(4)增加了網絡的寬度
(5)同時使用了1*1,3*3,5*5的卷積,增加了網絡對尺度的適應性
下圖為googlenet網絡結構:
這裏有2個地方需要註意:
(1)整個網絡為了保證收斂,有3個loss
(2)最後一個全連接層之前使用的是global average pooling,全局pooling使用的好了,還是有好多地方可以發揮的。
v2:Batch Normalization: Accelerating Deep Network Training by ReducingInternal Covariate Shift
Inception v2的網絡,代表作為加入了BN(Batch Normalization)層,並且使用2個3*3替代1個5*5卷積的改進版GoogleNet。
Inception v2的亮點總結如下:
(1)加入了BN層,減少了InternalCovariate Shift(內部neuron的數據分布發生變化),使每一層的輸出都規範化到一個N(0, 1)的高斯,從而增加了模型的魯棒性,可以以更大的學習速率訓練,收斂更快,初始化操作更加隨意,同時作為一種正則化技術,可以減少dropout層的使用。
(2)用2個連續的3*3 conv替代inception模塊中的5*5,從而實現網絡深度的增加,網絡整體深度增加了9層,缺點就是增加了25%的weights和30%的計算消耗。
v3:Rethinking the InceptionArchitecture for Computer Vision
Inception v3網絡,主要在v2的基礎上,提出了卷積分解(Factorization),代表作是Inceptionv3版本的GoogleNet。
Inception v3的亮點總結如下:
(1) 將7*7分解成兩個一維的卷積(1*7,7*1),3*3也是一樣(1*3,3*1),這樣的好處,既可以加速計算(多余的計算能力可以用來加深網絡),又可以將1個conv拆成2個conv,使得網絡深度進一步增加,增加了網絡的非線性,更加精細設計了35*35/17*17/8*8的模塊。
(2)增加網絡寬度,網絡輸入從224*224變為了299*299。
v4:Inception-v4,Inception-ResNet and the Impact of Residual Connections on Learning
Inception v4主要利用殘差連接(Residual Connection)來改進v3結構,代表作為,Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4
resnet中的殘差結構如下,這個結構設計的就很巧妙,簡直神來之筆,使用原始層和經過2個卷基層的feature map做Eltwise。Inception-ResNet的改進就是使用上文的Inception module來替換resnet shortcut中的conv+1*1 conv。
Inception v4的亮點總結如下:
(1)將Inception模塊和ResidualConnection結合,提出了Inception-ResNet-v1,Inception-ResNet-v2,使得訓練加速收斂更快,精度更高。
ILSVRC-2012測試結果如下(single crop),
(2)設計了更深的Inception-v4版本,效果和Inception-ResNet-v2相當。
(3)網絡輸入大小和V3一樣,還是299*299
Aggregated ResidualTransformations for Deep Neural Networks
這篇提出了resnet的升級版。ResNeXt,the next dimension的意思,因為文中提出了另外一種維度cardinality,和channel和space的維度不同,cardinality維度主要表示ResNeXt中module的個數,最終結論
(1)增大Cardinality比增大模型的width或者depth效果更好
(2)與 ResNet 相比,ResNeXt 參數更少,效果更好,結構更加簡單,更方便設計
其中,左圖為ResNet的一個module,右圖為ResNeXt的一個module,是一種split-transform-merge的思想
Xception: DeepLearning with Depthwise Separable Convolutions
這篇文章主要在Inception V3的基礎上提出了Xception(Extreme Inception),基本思想就是通道分離式卷積(depthwise separable convolution operation)。最終實現了
(1)模型參數有微量的減少,減少量很少,具體如下,
(2)精度較Inception V3有提高,ImageNET上的精度如下,
先說,卷積的操作,主要進行2種變換,
(1)spatial dimensions,空間變換
(2)channel dimension,通道變換
而Xception就是在這2個變換上做文章。Xception與Inception V3的區別如下:
(1)卷積操作順序的區別
Inception V3是先做1*1的卷積,再做3*3的卷積,這樣就先將通道進行了合並,即通道卷積,然後再進行空間卷積,而Xception則正好相反,先進行空間的3*3卷積,再進行通道的1*1卷積。
(2)RELU的有無
這個區別是最不一樣的,Inception V3在每個module中都有RELU操作,而Xception在每個module中是沒有RELU操作的。
MobileNets: EfficientConvolutional Neural Networks for Mobile Vision Applications
MobileNets其實就是Exception思想的應用。區別就是Exception文章重點在提高精度,而MobileNets重點在壓縮模型,同時保證精度。
depthwiseseparable convolutions的思想就是,分解一個標準的卷積為一個depthwise convolutions和一個pointwise convolution。簡單理解就是矩陣的因式分解。
傳統卷積和深度分離卷積的區別如下,
假設,輸入的feature map大小為DF * DF,維度為M,濾波器的大小為DK * DK,維度為N,並且假設padding為1,stride為1。則,
原始的卷積操作,需要進行的矩陣運算次數為DK · DK · M · N · DF · DF,卷積核參數為DK · DK · N · M
depthwise separable convolutions需要進行的矩陣運算次數為DK · DK ·M · DF · DF + M · N · DF · DF,卷積核參數為DK · DK · M+N · M
由於卷積的過程,主要是一個spatial dimensions減少,channel dimension增加的過程,即N>M,所以,DK · DK · N · M> DK · DK · M+N · M。
因此,depthwiseseparable convolutions在模型大小上和模型計算量上都進行了大量的壓縮,使得模型速度快,計算開銷少,準確性好。如下圖所示,其中,橫軸MACS表示加法和乘法的計算量(Multiply-Accumulates),縱軸為準確性。
depthwise separable convolutions在caffe中,主要通過卷積層中group操作實現,base_line模型大小大概為16M。
mobileNet網絡結構如下:
ShuffleNet: AnExtremely Efficient Convolutional Neural Network for Mobile Devices
這篇文章在mobileNet的基礎上主要做了1點改進:
mobileNet只做了3*3卷積的deepwiseconvolution,而1*1的卷積還是傳統的卷積方式,還存在大量冗余,ShuffleNet則在此基礎上,將1*1卷積做了shuffle和group操作,實現了channel shuffle 和pointwise group convolution操作,最終使得速度和精度都比mobileNet有提升。
如下圖所示,
(a)是原始的mobileNet的框架,各個group之間相互沒有信息的交流。
(b)將feature map做了shuffle操作
(c)是經過channel shuffle之後的結果。
Shuffle的基本思路如下,假設輸入2個group,輸出5個group
| group 1 | group 2 |
| 1,2,3,4,5 |6,7,8,9,10 |
轉化為矩陣為2*5的矩陣
1 2 3 4 5
6 7 8 9 10
轉置矩陣,5*2矩陣
1 6
2 7
3 8
4 9
5 10
攤平矩陣
| group 1 | group 2 | group 3 | group 4 | group 5 |
| 1,6 |2,7 |3,8 |4,9 |5,10 |
ShuffleNet Units 的結構如下,
(a)是一個帶depthwiseconvolution (DWConv)的bottleneck unit
(b)在(a)的基礎上,進行了pointwisegroup convolution (GConv) and channel shuffle
(c)進行了AVG pooling和concat操作的最終ShuffleNetunit
MobileNetV2: Inverted Residuals and Linear Bottlenecks
主要貢獻有2點:
1,提出了逆向的殘差結構(Inverted residuals)
由於MobileNetV2版本使用了殘差結構,和resnet的殘差結構有異曲同工之妙,源於resnet,卻和而不同。
由於Resnet沒有使用depthwise conv,所以,在進入pointwise conv之前的特征通道數是比較多的,所以,殘差模塊中使用了0.25倍的降維。而MobileNet v2由於有depthwise conv,通道數相對較少,所以殘差中使用 了6倍的升維。
總結起來,2點區別
(1)ResNet的殘差結構是0.25倍降維,MobileNet V2殘差結構是6倍升維
(2)ResNet的殘差結構中3*3卷積為普通卷積,MobileNet V2中3*3卷積為depthwise conv
MobileNet v1,MobileNet v2 有2點區別:
(1)v2版本在進入3*3卷積之前,先進行了1*1pointwise conv升維,並且經過RELU。
(2)1*1卷積出去後,沒有進行RELU操作
2,提出了線性瓶頸單元(linear bottlenecks)
Why no RELU?
首選看看RELU的功能。RELU可以將負值全部映射為0,具有高度非線性。下圖為論文的測試。在維度比較低2,3的時候,使用RELU對信息的損失是比較嚴重的。而單維度比較高15,30時,信息的損失是比較少的。
MobileNet v2中為了保證信息不被大量損失,應此在殘差模塊中去掉最後一個的RELU。因此,也稱為線性模塊單元。
MobileNet v2網絡結構:
其中,t表示通道的擴大系數expansion factor,c表示輸出通道數,
n表示該單元重復次數,s表示滑動步長stride
其中bottleneck模塊中,stride=1和stride=2的模塊分別如上圖所示,只有stride=1的模塊才有殘差結構。
結果:
MobileNet v2速度和準確性都優於MobileNet v1
references:
http://iamaaditya.github.io/2016/03/one-by-one-convolution/
https://github.com/soeaver/caffe-model
https://github.com/facebookresearch/ResNeXt
https://github.com/kwotsin/TensorFlow-Xception
https://github.com/shicai/MobileNet-Caffe https://github.com/shicai/MobileNet-Caffe
https://github.com/tensorflow/models/blob/master/slim/nets/mobilenet_v1.md
https://github.com/HolmesShuan/ShuffleNet-An-Extremely-Efficient-CNN-for-Mobile-Devices-Caffe-Reimplementation
https://github.com/camel007/Caffe-ShuffleNet
https://github.com/shicai/MobileNet-Caffe
https://github.com/chinakook/MobileNetV2.mxnet
從Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2