前沿
在CV领域,我们需要熟练掌握最基本的知识就是各种卷积神经网络CNN的模型架构,不管我们在图像分类或者分割,目标检测,NLP等,我们都会用到基本的CNN网络架构。
CNN从最初的2012年AlexNet横空出世到2014年VGG席卷世界以及2015年ResNet奠定了该领域的霸主地位,网络模型变得越变越深,而且也得到证明,越深的网络拟合效果越好,但网络相应的参数量计算量都极速增加,不利于技术的推广和应用。
因此,一些轻量级的网络结构也慢慢随之出现,比如MobileNet系列,ShuffleNet系列,以及ResNext、DenseNet、EfficenceNet等模型,他们都互相吸取彼此的优点,不但降低了参数量或者计算量,同时分类精度更高,因而受到了更多的关注。
接下来我们就对CNN的各种网络结构以及他们的优缺点进行一次详细的解读!
AlexNet(2012)
1、增加了relu非线性激活函数,增强了模型的非线性表达能力。成为以后卷积层的标配。
2、dropout层防止过拟合,成为以后fc层的标配。
3、通过数据增强,来减少过拟合。
4、引入标准化层(Local Response Normalization):通过放大那些对分类贡献较大的神经元,抑制那些对分类贡献较小的神经元,通过局部归一的手段,来达到作用。
VGG(2014)
论文的主要创新点在于:
1、用3x3小卷积核代替了5x5或者7x7的卷积核
2、基于ALexnet加深了网络深度,证明了更深的网络,能更好的提取特征。
GoogleNet(2014)
在设计网络结构时,不仅仅考虑网络的深度,也会考虑网络的宽度,并将这种结构定义为Inception结构。
1、引入1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)
2、网络最后采用了average pooling(平均池化)来代替全连接层
后面的Inception v2/v3都是基于v1的这种方法在扩展,主要目标有:
1、参数量降低,计算量减少。
2、网络变深,网络非线性表达能力更强
ResNet(2015)
问题:
1、增加深度带来的首个问题就是梯度爆炸/消散的问题,这是由于随着层数的增多,在网络中反向传播的梯度会随着连乘变得不稳定,变得特别大或者特别小。这其中经常出现的是梯度消散的问题。
2、为了克服梯度消散也想出了许多的解决办法,如使用BatchNorm,将激活函数换为ReLu,使用Xaiver初始化等,可以说梯度消散已经得到了很好的解决
已知有网络degradation的情况下,不求加深度能提高准确性,能不能至少让深度网络实现和浅层网络一样的性能,即让深度网络后面的层至少实现恒等映射的作用,根据这个想法,作者提出了residual模块来帮助网络实现恒等映射。
ResNet的设计特点:
1、核心单元模块化,可进行简单堆叠。
2、Shortcut方式解决网络梯度消失问题。
3、Average Pooling层代替fc层。
4、引入BN层加快网络训练速度和收敛时的稳定性。
5、加大网络深度,提高模型的特征抽取能力。
MobileNet v1
谷歌在2017年提出专注于移动端或者嵌入式设备中的轻量级CNN网络:MobileNet。最大的创新点是深度可分离卷积。
通过将标准卷积分解为深度卷积核逐点卷积,能够显著的降低参数量和计算量。引入Relu6激活函数。
参数量计算量的计算
网络结构如下:
MobileNet v2
改进点主要有以下几个方面:
1、引入残差结构,先升维再降维,增强梯度的传播,显著减少推理期间所需的内存占用
Inverted Residuals:
残差模块:输入首先经过1x1的卷积进行压缩,然后使用3x3的卷积进行特征提取,最后在用1x1的卷积把通道数变换回去。整个过程是“压缩-卷积-扩张”。这样做的目的是减少3x3模块的计算量,提高残差模块的计算效率。
倒残差模块:输入首先经过1x1的卷积进行通道扩张,然后使用3x3的depthwise卷积,最后使用1x1的pointwise卷积将通道数压缩回去。整个过程是“扩张-卷积-压缩”。
对低维度做ReLU运算,很容易造成信息的丢失。而在高维度进行ReLU运算的话,信息的丢失则会很少。
Linear Bottleneck
这个模块是为了解决一开始提出的那个低维-高维-低维的问题,即将最后一层的ReLU6替换成线性激活函数,而其他层的激活函数依然是ReLU6。
MobileNet v3
V3结合了V1的深度可分离卷积,V2的Inverted Residuals 和 Linear Bottleneck,以及加入SE模块、利用NAS(神经结构的搜索)来搜索网络参数。
互补搜索技术 —— NAS & NetAdapt
h-swish激活函数
out = F.relu6(x + 3., self.inplace) / 6.
return out * x
改进一:下图是MobileNet-v2的整理模型架构,可以看到,网络的最后部分首先通过1x1卷积映射到高维,然后通过GAP收集特征,最后使用1x1卷积划分到K类。所以其中起抽取特征作用的是在7x7分辨率上做1x1卷积的那一层。
而V3是先进行池化然后再进行1x1卷积提取特征,V2是先1X1卷积提取特征再池化。
ShuffleNet
组卷积
Group convolution是将输入层的不同特征图进行分组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。因为一般的卷积都是在所有的输入特征图上做卷积,可以说是全通道卷积,这是一种通道密集连接方式(channel dense connection),而group convolution相比则是一种通道稀疏连接方式(channel sparse connection)。
depthwise convolution,这是一种比较特殊的group convolution,此时分组数恰好等于通道数,意味着每个组只有一个特征图。分组卷积的会带来一个矛盾就是特征通信。group convolution层另一个问题是不同组之间的特征图需要通信。所以MobileNet等网络采用密集的1x1 pointwise convolution,因为要保证group convolution之后不同组的特征图之间的信息交流。
为达到特征通信目的,我们不采用dense pointwise convolution,考虑其他的思路:channel shuffle
ShuffleNet的核心是采用了两种操作:pointwise group convolution和channel shuffle,这在保持精度的同时大大降低了模型的计算量。
其基本单元则是在一个残差单元的基础上改进而成。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。