1. 程式人生 > >從Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

從Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

tor mob 基礎上 Go Dimension mat spa rem models

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 factorc表示輸出通道數,

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