分类任务精度:
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网络结构![](https://i-blog.csdnimg.cn/blog_migrate/add11395298ae1c6519a83087c4e8861.png)
(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
版权声明:本文为博主原创文章,转载请附上博文链接!