第5周学习笔记
1.ShuffleNet v1理论详解
ShuffleNet 是旷视科技在 2017 年提出的模型,论文《ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices》。ShuffleNet 和 MobileNets 都采用了分组卷积的思想降低计算量,但是和 MobileNets 不同,ShuffleNet 通过 Channel Shuffle 操作打乱分组,从而获得其他分组的信息。
该文章主要采用channel shuffle、pointwise group convolutions和depthwise separable convolution来修改原来的ResNet单元。
1.1 channel shuffle
如下图,(a)是分组卷积,分为三组,然后分别卷积。这里就会出现一个问题,每个组之间是独立的,没有信息交流,传递的,因此,基于特征通信问题,论文提出了channel shuffle的操作,将组之间的特征进行交换(shuffle),使得每个组包含了其他组的特征,如图(b)和©所示。
上图展示了 Channel Shuffle 的过程,将分组均匀打乱使新的分组包含其他分组的信息。这一过程很容易通过代码实现,假设原来包含 G 个分组,每个分组 N 个 channel,则先把 channel 的维度转为 2 维 (G, N),然后转置 (N, G),最后 reshape 回 1 维即可。本质就是将channel通道分组,分别做卷积,以减少计算复杂度。
1.2 pointwise group convolutions
pointwise group convolutions,其实就是带group的卷积核为11的卷积,也就是说pointwise convolution是卷积核为11的卷积。在ResNeXt中主要是对33的卷积做group操作,但是在ShuffleNet中,作者是对11的卷积做group的操作,因为作者认为1*1的卷积操作的计算量不可忽视。
下图a展示了基本ResNet轻量级结构,这是一个包含3层的残差单元:首先是1x1卷积,然后是3x3的depthwise convolution(DWConv,主要是为了降低计算量),这里的3x3卷积是瓶颈层(bottleneck),紧接着是1x1卷积,最后是一个短路连接,将输入直接加到输出上。
下图b展示了改进思路:将密集的1x1卷积替换成1x1的group convolution,不过在第一个1x1卷积之后增加了一个channel shuffle操作。值得注意的是3x3卷积后面没有增加channel shuffle,按paper的意思,对于这样一个残差单元,一个channel shuffle操作是足够了。还有就是3x3的depthwise convolution之后没有使用ReLU激活函数。
下图c展示了其他改进,对原输入采用stride=2的3x3 avg pool,在depthwise convolution卷积处取stride=2保证两个通路shape相同,然后将得到特征图与输出进行连接,而不是相加。极致的降低计算量与参数大小。
33
1.3 网络结构
Table 1是ShuffleNet的结构表,基本上和ResNet是一样的,也是分成几个stage(ResNet中有4个stage,这里只有3个),然后在每个stage中用ShuffleNet unit代替原来的Residual block,这也就是ShuffleNet算法的核心。这个表是在限定complexity的情况下,通过改变group(g)的数量来改变output channel的数量,更多的output channel一般而言可以提取更多的特征。
上表展示了不同配置下 ShuffleNet 的复杂度,复杂度用 FLOPs (浮点运算数量) 衡量。ShuffleNet 首先使用 3×3 的卷积和 MaxPool 处理输入图像 (Conv1, MaxPool),然后传入三个 ShuffleNet 基本单元 (Stage2、Stage3、Stage4),最后使用 GlobalPool 和全连接层进行分类。
1.4 模型效果
下图是ShuffleNet网络的性能评价,可以看到ShuffleNet不仅计算复杂度更低,而且精度更好。
基本上当g越大时,效果越好,这是因为采用更多的分组后,在相同的计算约束下可以使用更多的通道数,或者说特征图数量增加,网络的特征提取能力增强,网络性能得到提升。注意Shuffle 1x是基准模型,而0.5x和0.25x表示的是在基准模型上将通道数缩小为原来的0.5和0.25。
ShuffleNet的核心就是用pointwise group convolution,channel shuffle和depthwise separable convolution代替ResNet block的相应层构成了ShuffleNet uint,达到了减少计算量和提高准确率的目的。channel shuffle解决了多个group convolution叠加出现的边界效应,pointwise group convolution和depthwise separable convolution主要减少了计算量。
2.ShuffleNet v2理论详解
ShuffleNetV2中提出了一个关键点,之前的轻量级网络都是通过计算网络复杂度的一个间接度量,即FLOPs为指导。通过计算浮点运算量来描述轻量级网络的快慢。但是从来不直接考虑运行的速度。在移动设备中的运行速度不仅仅需要考虑FLOPs,还需要考虑其他的因素,比如内存访问成本(memory access cost)和平台特点(platform characterics)。
所以,ShuffleNetV2直接通过控制不同的环境来直接测试网络在设备上运行速度的快慢,而不是通过FLOPs来判断。
因此,使用FLOPs作为计算复杂度的唯一指标是不够的,可能会导致次优化设计。
ShuffleNetv2提出了设计应该考虑两个原则:
- 应该使用直接度量(如速度)而不是间接度量(如FLOPs。
- 这些指标应该在目标平台上进行评估。(也就是实事求是)
然后,ShuffleNetv2根据这两个原则,提出了四种有效的网络设计原则:
- G1: Equal channel width minimizes memory access cost (MAC)
当卷积层的输入特征矩阵与输出特征矩阵channel相等时MAC最小(保持FLOPs不变时) - G2: Excessive group convolution increases MAC
当GConv的groups增大时(保持FLOPs不变时),MAC也会增大 - G3: Network fragmentation reduces degree of parallelism
网络设计的碎片化程度越高,速度越慢 - G4: Element-wise operations are non-negligible
Element-wise操作带来的影响是不可忽视的
基于上述准则得出结论:一个高效的网络架构应该
1)使用“平衡”卷积(等信道宽度);
2)了解使用group convolution的代价;
3)降低碎片化程度;
4)减少元素操作。
根据四条原则,作者提出了shufflenet v2,先看看模型的block(如下图)。(a)和(b)是ShuffleNet v1的两种不同block结构,两者的差别在于后者对特征图尺寸做了缩小,这和ResNet中某个stage的两种block功能类似,同理(c)和(d)是ShuffleNet v2的两种不同block结构:
从(a)和(c)的对比可以看出首先(c)在开始处增加了一个channel split操作,这个操作将输入特征的通道分成c-c’和c’,c’在文章中采用c/2,这主要是和第1点发现对应。
然后(c)中取消了11卷积层中的group操作,这和第2点发现对应,同时前面的channel split其实已经算是变相的group操作了。
channel shuffle的操作移到了concat后面,和第3点发现对应,同时也是因为第一个11卷积层没有group操作,所以在其后面跟channel shuffle也没有太大必要。
最后是将element-wise add操作替换成concat,这个和第4点发现对应。
总体网络结构类似于ShuffleNet v1,如表所示。只有一个区别:在全局平均池之前增加了一个1 × 1的卷积层来混合特性,这在ShuffleNet v1中是没有的。
ShuffleNet v2不仅高效,而且准确。主要有两个原因:
首先,每个构建块的高效率使使用更多的特征通道和更大的网络容量成为可能
第二,在每个块中,有一半的特征通道直接穿过该块并加入下一个块。这可以看作是一种特性重用,就像DenseNet和CondenseNet的思想一样。
3.EfficientNet理论详解
下面这个图展示了在model size和准确度上的不同模型的对比,越靠近左上角,表现越好(意味着模型小,效果也好):
- 根据以往的经验,增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失,训练困难的问题。
- 增加网络的width能够获得更高细粒度的特征并且也更容易训练,但对于width很大而深度较浅的网络往往很难学习到更深层次的特征。
- 增加输入网络的图像分辨率能够潜在得获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量。
下图展示了在基准EfficientNetB-0上分别增加width、depth以及resolution后得到的统计结果。通过下图可以看出大概在Accuracy达到80%时就趋于饱和了。
EfficientNet 的设想就是能否设计一个标准化的卷积网络扩展方法,既可以实现较高的准确率,又可以充分的节省算力资源。其通过 NAS(Neural Architecture Search)技术来搜索网络的图像输入分辨率 r,网络的深度 depth 以及 channel 的宽度 width 三个参数的合理化配置。
采用不同的d ,r组合,然后不断改变网络的width就得到了如下图所示的4条曲线,通过分析可以发现在相同的FLOPs下,同时增加d和r的效果最好。
EfficientNet作者给了8个网络,以EfficientNet-B0为例进行介绍,因为EfficientNet-B1~B7是在EfficientNet-B0的基础上,利用NAS搜索技术,对输入分辨率Resolution、网络深度Layers、网络宽度Channels三者进行综合调整。
EfficientNet-B0的网络框架,总体看,分成了9个Stage:
Stage1 是一个卷积核大小为3x3,步距为2的普通卷积层(包含BN和激活函数Swish)
Stage2~Stage8 是在重复堆叠 MBConv 结构
Stage9 是一个普通的1x1的卷积层(包含BN和激活函数Swish) + 一个平均池化层 + 一个全连接层组成
表格中每个MBConv后会跟一个数字1或6,这里的1或6是倍率因子n (channels变胖倍数),即MBConv中第一个1x1的卷积层会将输入特征矩阵的channels扩充为n倍。
表格中k3x3或k5x5 表示MBConv中Depthwise Conv所采用的卷积核大小。
Resolution表示该Stage的输入channel尺寸。
Channels表示通过该Stage后输出特征矩阵的Channels。
Layers表示该Stage重复MBConv结构多少次
stride表示步长,重复多次的Layers,只针对第一个有效(stride=2,Resolution长宽 变为原来一半),其余均为1。
MBConv结构主要包括:
一个 1x1 的普通卷积(升维作用,包含BN和Swish激活)
一个 kxk 的Depthwise Conv卷积(包含BN和Swish激活),kxk 有3x3和5x5两种情况
一个SE模块
一个 1x1 的普通卷积(降维作用,包含BN和线性激活,线性激活y=x)
一个Droupout层
对于普通人来说做扩展的代价过于昂贵,所以最好的方法便是进行迁移学习.
迁移学习和finetune的区别?
finetune:我们假设在Resnet101后面加上一个全连接层,然后我们锁住前面Resnet的参数,不参加梯度更新,然后只更新最后一个全连接层的参数。当全连接层的loss足够小的时候,再释放所有的参数一起训练。这样Resnet的参数也会微微调整,这就是finetune;
迁移学习:就不再训练之前的网络,而是把之前网络的输出的特征看作为我们自己网络的输入特征而已,而不再是一个要训练的网络的概念