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

分類任務精度:

ShuffleNet v2 ≥MobileNet v2 > ShuffeNet v1 > Xception

檢測任務精度:

ShuffleNet v2 > Xception ≥ ShuffleNet v1 ≥ MobileNet v2

ps:

1.輸入網絡大小,比如增加網絡寬度,網絡輸入從224*224變爲了299*299。也就是特徵圖也變大了,網絡"變寬"。

2.mobileNet只做了3*3卷積的deepwiseconvolution,而1*1的卷積還是傳統的卷積方式,還存在大量冗餘,ShuffleNet則在此基礎上,將1*1卷積做了shuffle和group操作,實現了channel shuffle 和pointwise group convolution操作,最終使得速度和精度都比mobileNet有提升。

3.1*1卷積只有一個參數,相當於對原始feature map做了一個scale

4.Eltwise:

Concat層雖然利用到了上下文的語義信息,但僅僅是將其拼接起來,之所以能起到效果,在於它在不增加算法複雜度的情形下增加了channel數目。那有沒有直接關聯上下文的語義信息呢?答案是Eltwise層,被廣泛使用,屢試不爽,並且我們常常拿它和Concat比較,所以我常常一起說這兩個層。我們普遍認爲,像這樣的“encoder-decoder”的過程,有助於利用較高維度的feature map信息,有利於提高小目標的檢測效果。

Eltwise層有三種類型的操作:product(點乘)、sum(求和)、max(取最大值),顧名思義,sum就是把bottom的對應元素相加,product就是對應相乘,max就是對應取最大,其中sum爲默認操作sum操作仍然是我們用的最多的。效果上,Eltwise因爲更直接的利用了上下文信息,所以精度提高,但是Eltwise的操作卻增加了算法耗時,而Concat層雖然提高的精度沒有Eltwise那麼明顯,但是訓練和測試速度相對快了一點,所以應用時更看如何權衡兩者能不能滿足自己項目的需求。。

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

 

天才般的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的卷積,增加了網絡對尺度的適應性

這裏有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個卷基層或者3個卷積層的feature map做Eltwise。

首先介紹幾個概念,左邊的3*3+3*3(ResNet18,ResNet34)和1*1+3*3+1*1(ResNet50,ResNet101,ResNet152)稱爲瓶頸單元(bootlenect,因爲輸入爲256,中間爲64,輸出爲256,寬窄寬的結構,像瓶子的頸部)。右面的直線,有的實現是直線中有1*1卷積,稱爲shortcut整個bootlenect+shortcut稱爲Residual uint。幾個Residual uint的疊加稱爲Residual block。Resnet結構都是由4個Residual block組成的。

Inception-ResNet的改進就是使用上文的Inception module來替換resnet shortcut中的bootlenect。

Inception v4的亮點總結如下:

(1)將Inception模塊和Residual Connection結合,提出了Inception-ResNet-v1,Inception-ResNet-v2,使得訓練加速收斂更快,精度更高。

ILSVRC-2012測試結果如下(single crop)

(2)設計了更深的Inception-v4版本,效果和Inception-ResNet-v2相當。與殘差網絡融合,效果不遜於v4但訓練速度更快的結構。

  GoogLeNet Inception V4網絡結構:

GoogLeNet Inception ResNet網絡結構

(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,空間變換。如 DWC:3*3,groups=N

(2)channel dimension,通道變換。如 PWC:1*1

而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操作的,高於Inception V3

  • MobileNets: EfficientConvolutional Neural Networks for Mobile Vision Applications

MobileNets其實就是Exception思想的應用。區別就是Exception文章重點在提高精度,而MobileNets重點在壓縮模型,同時保證精度。

depthwise separable 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。

因此,depthwise separable 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 |

1.轉化爲矩陣爲2*5的矩陣

1 2 3 4 5

6 7 8 9 10

2.轉置矩陣,5*2矩陣

1 6

2 7

3 8

4 9

5 10

3.攤平矩陣

| group 1   | group 2  | group 3   | group 4  | group 5  |

| 1,6           |2,7          |3,8           |4,9          |5,10        |

ShuffleNet Units 的結構如下,

(a)是一個帶depthwise convolution (DW Conv)的bottleneck unit

(b)在(a)的基礎上,進行了pointwise group convolution (GConv) and channel shuffle

(c)進行了AVG pooling和concat操作的最終ShuffleNet unit。這個是用於池化的結構單元

  • 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*1 pointwise conv升維,並且經過RELU6。

(2)1*1卷積出去後,沒有進行RELU操作

 

MobileNet v1,MobileNet v2 的實際使用區別:

精度上,MobileNet v2優於MobileNet v1

速度上,在GPU有並行的情況下,v1和v2速度基本差不多,在cpu這種無並行的情況下,v2要比v1慢大概40%。

就是說,v2比v1的乘加運算量確實是小,但是最終速度是由好多因素決定的,這也就是shuffle v2的改進由來。

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

和其他結構的對比:

plus:

mobilev2的官方代碼中輸入圖片固定爲224*224,不支持任意大小的輸入(https://github.com/tensorflow/models/tree/master/research/slim/nets/mobilenet),對其進行簡單的修改,使得支持任意大小,將mobilenet.py中global_pool函數進行修改,

def global_pool(input_tensor, pool_op=tf.nn.avg_pool):
  """Applies avg pool to produce 1x1 output.
  NOTE: This function is funcitonally equivalenet to reduce_mean, but it has
  baked in average pool which has better support across hardware.
  Args:
    input_tensor: input tensor
    pool_op: pooling op (avg pool is default)
  Returns:
    a tensor batch_size x 1 x 1 x depth.
  """
  shape = input_tensor.get_shape().as_list()
  if shape[1] is None or shape[2] is None:
    kernel_size = tf.convert_to_tensor(
        [1, tf.shape(input_tensor)[1],
         tf.shape(input_tensor)[2], 1])
  else:
    kernel_size = [1, shape[1], shape[2], 1]
  #output = pool_op(
  #    input_tensor, ksize=kernel_size, strides=[1, 1, 1, 1], padding='VALID')
  output=tf.reduce_max(input_tensor, axis=[1,2])
 
 
  # Recover output shape, for unknown shape.
  #output.set_shape([None, 1, 1, None])
  output=tf.expand_dims(output,1)
  output=tf.expand_dims(output,2)
  return output
  • ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design

論文指出單純的乘加運算FLOPs並不能完全表示模型的運算速度,訪存開銷memory access cost(MAC)也應該考慮進去。並基於這,設計出了輕量化網絡ShuffleNet V2。

提出了4個改進的原則:

(1)單個模塊的輸入輸出通道相同,可以最小化訪存開銷(MAC)

c1:輸入通道數

c2:輸出通道數

h,w:輸入feature map 的高度,寬度

B:FLOPs數,就是計算量,這裏假設B恆定,卷積爲1*1卷積(pointwise convolution ),因此計算量就是h*w*c1*c2

MAC:訪存次數,包括從內存取輸入的feature map 的次數h*w*c1,將結果寫回去的次數h*w*c2,取1*1卷積核參數的次數1*1*c1*c2

假設FLOPs數B恆定,c1*c2乘積一定的條件下,c1==c2可以使得c1+c2的值最小。

得出結論,當c1:c2=1:1時,可以獲得最小的訪存次數,使得網絡運行速度提升。

(2)過量使用組卷積group convolution ,會增加MAC

g:組卷積的group個數

B:FLOPs數,由於這裏使用的是組卷積,因此要除g

MAC:訪存次數,從MAC公式可以看出,g越大,MAC值越大

(3)網絡的分支越多,並行度越差

網絡碎片化會降低並行度 一些網絡如Inception,以及Auto ML自動產生的網絡NASNET-A,它們傾向於採用“多路”結構,即存在一個lock中很多不同的小卷積或者pooling,這很容易造成網絡碎片化,減低模型的並行度,相應速度會慢

(4)Element-wise 操作的時間是不可忽略的

像ReLU, AddTensor, AddBias 這些操作,雖然具有比較小的FlOPs數,但是卻有比較大的訪存MAC。

最終結論:

    使用平衡的卷積,(相同的輸入,輸出通道數)
    組卷積的group數要謹慎設計
    減少網絡的並行度,減少碎片化
    減少Element-wise 操作

網絡模塊:

前2個模塊爲ShuffleNet V1中的模塊,(a)爲傳統模塊,(b)爲下采樣模塊

後2個模塊爲ShuffleNet V2中的模塊,(c)爲傳統模塊,(d)爲下采樣模塊

V2和V1模塊設計的區別:

    v2中的傳統模塊增加了channel split,假設原始輸入通道數爲c,將通道分成了c-c’和c’兩個通道,實驗中,c’=c/2;
    將channle shuffle操作移到後面來做;
    傳統模塊中將add操作轉化爲concat操作,有助於增加信息量,減少運算量;
    將Group conv換成了普通的conv,可以減少group數,減少MAC;

網絡結構:

論文實驗:

 

分類任務精度:

ShuffleNet v2 ≥MobileNet v2 > ShuffeNet v1 > Xception

檢測任務精度:

ShuffleNet v2 > Xception ≥ ShuffleNet v1 ≥ MobileNet v2

 

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

 
---------------------  
作者:watersink  
來源:CSDN  
原文:https://blog.csdn.net/qq_14845119/article/details/73648100  
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章