博客专栏

EEPW首页 > 博客 > 综述:轻量级CNN架构设计(2)

综述:轻量级CNN架构设计(2)

发布人:计算机视觉工坊 时间:2021-09-14 来源:工程师 发布文章

· 空洞卷积 (Dilated Convolution)

空洞卷积是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。通过间隔取值扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有更大的感受野。这里面有个扩张率(dilation rate)的系数,这个系数定义了这个间隔的大小,标准卷积相当于dilation rate为1的空洞卷积,下图展示的是dilation rate为2的空洞卷积计算过程,可以看出3×3的卷积核可以感知标准的5×5卷积核的范围,还有一种理解思路就是先对3×3的卷积核间隔补0,使它变成5×5的卷积,然后再执行标准卷积的操作。

7.jpg

空洞卷积

· 转置卷积 (Transposed Convolutions)

转置卷积又称反卷积(Deconvolution),它和空洞卷积的思路正好相反,是为上采样而生,也应用于语义分割当中,而且他的计算也和空洞卷积正好相反,先对输入的feature map间隔补0,卷积核不变,然后使用标准的卷积进行计算,得到更大尺寸的feature map。

8.jpg

· 可变形卷积 (deformable convolution)

以上的卷积计算都是固定的,每次输入不同的图像数据,卷积计算的位置都是完全固定不变,即使是空洞卷积/转置卷积,0填充的位置也都是事先确定的。而可变性卷积是指卷积核上对每一个元素额外增加了一个h和w方向上偏移的参数,然后根据这个偏移在feature map上动态取点来进行卷积计算,这样卷积核就能在训练过程中扩展到很大的范围。而显而易见的是可变性卷积虽然比其他卷积方式更加灵活,可以根据每张输入图片感知不同位置的信息,类似于注意力,从而达到更好的效果,但是它比可行变卷积在增加了很多计算量和实现难度,目前感觉只在GPU上优化的很好,在其他平台上还没有见到部署。

9.jpg

其他算子

· 池化(pooling)

池化这个操作比较简单,一般在上采样和下采样的时候用到,没有参数,不可学习,但操作极为简单,和depthwise卷积类似,只是把乘累加操作替换成取最大/取平均操作。

· 最大池化和平均池化

10.jpg

最大池化和平均池化

· 全局平均池化

全局平均池化的操作是对一个维度为(C,H,W)的feature map,在HW方向整个取平均,然后输出一个长度为C的向量,这个操作一般在分类模型的最后一个feature map之后出现,然后接一个全连接层就可以完成分类结果的输出了。早期的分类模型都是把最后一个feature map直接拉平成C×H×W的向量,然后再接全连接层,但是显然可以看出来这个计算量极大,甚至有的模型最后一个全连接层占了整个模型计算量的50%以上,之后由研究人员发现对这个feature map做一个全局平均池化,然后再加全连接层可以达到相似的效果,且计算量降低到了原来的1/HW。

· 最大向上池化

这个操作在前面基本概念一节上采样段落中有描述,故不赘述。

· 全连接计算(Full Connected)

这个本质其实就是矩阵乘法,输入一个(B, iC)的数据,权重为(iC, oC),那么输出为(B, oC),在多层感知机和分类模型最后一层常常见到。

11.jpg

全连接结构

· Addition / Concatenate分支

Addition和Concatenate分支操作统称为shortcut,如下图所示,操作极为简单。Addition是在ResNet中提出,两个相同维度的feature map相同位置点的值直接相加,得到新的相同维度feature map,这个操作可以融合之前的特征,增加信息的表达,Concatenate操作是在Inception中首次使用,被DenseNet发扬光大,和addition不同的是,它只要求两个feature map的HW相同,通道数可以不同,然后两个feature map在通道上直接拼接,得到一个更大的feature map,它保留了一些原始的特征,增加了特征的数量,使得有效的信息流继续向后传递。

12.png

Add & Concat

· Channel shuffle

channel shuffle是ShuffleNet中首次提出,主要是针对分组卷积中不同组之间信息不流通,对不同组的feature map进行混洗的一个操作,如下图所示,假设原始的feature map维度为(1,9,H,W),被分成了3个组,每个组有三个通道,那么首先将这个feature map进行reshape操作,得到(1,3,3,H,W),然后对中间的两个大小为3的维度进行转置,依然是(1,3,3,H,W),最后将通道拉平,变回(1,9,H,W),就完成了通道混洗,使得不同组的feature map间隔保存,增强了信息的交互。

13.png

channel shuffle

常用激活函数

激活函数的非线性是神经网络发挥作用最重要的因素之一,而对于实际部署,激活函数的实现也是很重要的一个方面,实现的不好对加速效果影响很大,这里主要讲几个部署当中常见的激活函数。

· ReLU系列

这里主要指常用的ReLU,ReLU6和leaky ReLU。ReLU比较好部署,小于0的部分为0,大于0的部分为原始值,只需要判断一下符号位就行;ReLU6与ReLU相比也只是在正向部分多了个阈值,大于6的值等于6,在实现时多了个比较也不算麻烦;而leaky ReLU和ReLU正向部分一样,都是大于0等于原始值,但负向部分却是等于原始值的1/10,浮点运算的话乘个0.1就好了,如果因为量化要实现整数运算,这块可以做个近似,如0.1用13>>7来代替,具体实现方法多种多样 ,还算简单。

14.png

ReLU & LeakyReLU

· Sigmoid系列

这里主要指sigmoid,还有和他相关的swish:

image.png

可以看出,如果按照公式来实现sigmoid对低性能的硬件来说非常不友好,因为涉及到大量的exp指数运算和除法运算,于是有研究人员针对此专门设计了近似的硬件友好的函数h-sigmoid和h-swish函数,这里的h指的就是hardware的意思:

image.png

可视化的对比如下图所示,可以看出在保证精度的同时又能大大方便硬件的实现,当然要直接实现sigmoid也是可以的,毕竟sigmoid是有限输出,当输入小于-8或大于8的时候,输出基本上接近于-1和1,可以根据这个特点设计一个查找表,速度也超快,且我们实测对精度没啥影响。

15.png经典轻量化模型

早期比较经典的卷积神经网络,如AlexNet,VGG,GoogleNet(或Inception),ResNet,DenseNet都是以提升模型在ImageNet数据集上的分类精度为主了,很少考虑参数量和计算量的问题,他们的主要结构解析起来也比较简单,基本都是由标准卷积(7×7,5×5,3×3和1×1),Pooling和shortcut操作(Addition / Concatenate)构成,而且以3×3及其以上的卷积核为主,通道数也是动辄上千,所以参数量和计算量巨大。后续研究人员慢慢发现两个3×3卷积可以代替一个5×5卷积的效果,三个3×3卷积可以代替一个7×7卷积的效果,大量使用1×1卷积,使用3×3 depthwise conv + pointwise conv(1×1标准卷积)可以代替3×3普通卷积......一系列操作可以减少参数量和计算量,所以下面讲述一下一些轻量级神经网络发展的历史,因为这块很多人都讲过,所以我会简单一些,挑重点说说。

· SqueezeNet

SqueezeNet是公认的轻量级模型设计最早期的工作之一,作者提出了三种策略来实现在保持精度的情况下大大减少当时主流模型(以AlexNet为例)的计算量和参数量:

1.将模型中一部分的3×3卷积用1×1来代替,1×1卷积是3×3参数量和计算量的1/9,所以可以大大减少参数量和计算量;

2.减少3×3卷积的输入通道数,这个可以通过在进入3×3卷积之前加一个1×1卷积来实现通道数量的减少;

3.将下采样层的位置往后推,使得模型可以在更大的feature map上进行更多的学习,这一步虽然会在增加计算量,但是和上面两个策略结合可以在维持模型精度的情况下仍大大减少参数量和计算量;

16.png

fire module

根据上面的策略,作者提出了fire module的子结构,如下图所示,然后整个模型由这样的子结构堆叠而成。这个fire module由squeeze部分和expand部分构成,squeeze部分是1×1的卷积层,而expand部分是1×1的卷积和3×3的卷积拼接起来的,每次feature map输入这个fire module会在squeeze层降低通道数,然后在expand通道增加通道数,从而在参数量更少的情况下仍然可以得到充分的学习。最后结合一些模型压缩的方法可以使得SqueezeNet在达到AlexNet同等精度的情况下,参数量减少到后者的1/50,计算量减少到后者的1/510。

这篇论文使用大量1×1的卷积核代替3×3卷积,并且利用1×1卷积改变大尺度卷积层输入feature map的通道数从而减少计算量的思想是非常有意义的,后续的很多轻量级网路的论文都沿用了这种套路。

MobileNet系列

MobileNet系列一共有V1,V2和V3三篇论文,简要的讲:

1.MobileNet V1主要思想是提出了一种新的结构—深度可分离卷积(Depthwise Separable Convolution)来代替标准3×3卷积,从而大大减少模型的参数量和计算量;

2.MobileNet V2在V1的基础上提出了一种倒置残差的模块,这个模块有三个卷积,第一个部分是一个1×1标准卷积,用来升维,第二个部分是由3×3深度卷积+1×1标准卷积构成的深度分离卷积,用来学习特征和降维,模块的输出和输入再进行一个Addition的操作,由于和ResNet中维度升降方式相反,所以称为倒置残差。中间升维的作用是让深度可分离卷积得到更充分的学习,计算量相对于标准卷积来说也不大,而且这种升降维的方式非常灵活,可以大大减少计算量。本文还从流形学的角度探究了输入深度可分离卷积上一层的ReLU6对信息传递的影响,理论证明去掉上一个1×1标准卷积的ReLU激活函数能更有利于后面的深度可分离卷积对特征的学习。

17.png

MobileNet V2

3. MobileNet V3感觉相对于前两篇没有那么大的结构创新了,主要思想是神经架构搜索(NAS)和硬件友好结构,总的来看V3的结构是在V2的基础上进行了一些修改,如增加了SE block这种已被提出的注意力机制,激活函数换成了H-swish,last stage减少了几层计算,针对语义分割提出了Lite R-ASPP的head(不在讨论之列),整个论文看着像是堆tricks,重点不是很突出,有点年底冲业绩的嫌疑。

18.png

MobileNet V3

根据我自己的比赛和项目经验来看,还是MobileNet V1和V2的结构比较实用,参数量和计算量小,可拓展性好,SE block这种模块对延时影响还是不小,而且我们发现其他各种花里胡哨的激活函数跟ReLU/ReLU6相比都差不多,对精度没有很大的影响,还不如直接部署ReLU/ReLU6来的方便。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。



关键词: AI

相关推荐

技术专区

关闭