首页 > 编程知识 正文

shuffle播放器(v2new)

时间:2023-05-03 07:47:26 阅读:93638 作者:2131

导言

目前,一些网络模型(如MobileNet_v1、v2、ShuffleNet_v1和Xception )采用了包卷积、深度可分离卷积等操作,其中包括FLOPs不是直接测量模型速度和大小的指标,只是理论上的计算,但是在实际设备中,由于各种优化计算操作,计算量无法准确测量模型的速度,换言之,即使是相同的FLOPs,推理速度也不同。

这是一篇类似于《Rethinking the Inception Architecture for Computer Vision》 (也就是Inception_v2 )的论文,Inception_v2论文提出了设计四个卷积网络模型的原则,Inception_v2就是基于这些原则设计的。 同样,shuffleNet_v2(《Pratical Guidelines for Efficient CNN Architecture Design》,看这个名字就知道值得一读)指出了影响模型实际推理速度的四种操作,在尽量避免这些操作的基础上提出了shufflenet_v2结构,

ShuffleNet v2在同一FLOPs上实现了明显比其他类似网络更快的速度。 例如,在500米浮点系统中,双链节点V2比移动节点V2快58%,比双链节点V1快63%,比Xception快25%。

Direct metrics

前面提到的FLOPs通过理论计算量测量模型的速度。 这是一个直接度量,与直接度量(如速度)略有不同。 主要原因之一是FLOPs忽略了几个重要因素,一个是MAC (存储器访问成本),是存储器访问的时间成本。 例如,在低层使用的一些优化安装算法中,由于分组后的安装性能较低,所以分组卷积的组数越多,时间成本越高。 另一个是并行度,即使是相同的FLOPs,并行度高的模型也比低的模型快。 二是不同平台的同一FLOPs模型运行时间不同。 例如,在最新的Cu dnn库中,通过优化进行3x3卷积所需的时间不是1x1卷积的9倍。

如图所示,这是模型在GPU上各操作所需的时间,FLOPs只表示了Conv部分的计算量,但实际上Elemwise、Data相关部分也花了相当多的时间。 因此,仅使用名为FLOPs的indirect metrics来测量模型的速度是不够的。

高效设计CNN模型的实际指南

ShuffleNet v2进行了4个实验,得到了耗时的操作,经过原理分析,提出了4个设计原则。

1 .在卷积层输入输出通道数相同的情况下,MAC最小

2 .包卷积的包数越大,MAC越大

3 .网络旁路降低模型的并行度

4 .不能忽视4. Element-wise操作

卷积层输入输出通道数相同时,MAC最小

为了简化计算公式,这里使用1x1卷积进行理论导出。

对于空间大小为h、w的特性图,输入输出通道数分别为c1和c2,如果使用1x1卷积,则FLOPs为B=h x w x c1 x c2。 另一方面,MAC=HW(C1C2) c1 x c2。 这里,hwc1是输入配置文件的存储器访问时间成本,hwc2是输出配置文件的存储器访问时间成本,c1xc2x1x1是卷积核的存储器访问时间成本。 将b式代入MAC式,根据不等式定理,有以下不等式。

由该式可知,MAC存在下限,c1=c2时,MAC取最小值。 因此,最初的实验组是在同一FLOPs上取不同输入输出通道数的比c1/c2,观察模型在不同c1/c2上的执行时间。

如图所示,理论相当正确。 1:1时模型速度最快。

分组卷积的分组数越大,MAC越大

分组卷积另一方面,在相同的FLOPs中,分组数越大,信道上的密集卷积越稀疏,模型精度也增加,另一方面,更多的分组数会增加MAC。 MAC表达式如下:

src="https://p6.toutiaoimg.com/origin/pgc-image/029d65b05375479b81abcde7b383b009.png?from=pc">

第二组实验是在相同的FLOPs下,查看不同的分组数对模型的运行速度:

因此,分组数需要合理的选择,需要在运行时间和精度上平衡。

网络支路会降低模型的并行度

在GoogLeNet(也就是Inception_v1)系列中,使用了多条支路,最后通过concat的方式拼接。这样的支路不仅提到了精度,但同时也降低了效率,这是因为支路对GPU并行运算来说是不友好的,此外,它还引入了额外的开销,如内核启动与同步第三组实验是在相同FLOPs情况下,设置四个支路数不同的一个网络,比较它们运行的速度。

实验证明,只有一条支路时,运行速度最快。因此,在网络结构中支路数可以提到精度,但也会降低运行速度,从而影响实时性。

Element-wise操作不可忽视

正如上面给的那个图,Element-wise操作在GPU上占的时间是相当多的。Element-wise操作有ReLU, AddTensor, AddBias等。它们都有比较小的FLOPs,却有比较大的MAC。特别地,depthwise conv也可以认为是一个Element-wise操作,因为它有较大的MAC/FLOPs比值。对于第四组实验,使用ResNet中的bottleneck单元(也就是1x1卷积后接3x3卷积,再接1x1卷积,中间使用了ReLU, 另有一个shortcut连接),设置有无shortcut, ReLU四个不同的对比,得出它们的运行时间。

实验证明,ReLU,shortcut这些Element-wise会降低运行时间。对此,shuffleNet v1使用多的分组数,违背了第二条原则,使用bottleneck相似的结构违背了第一条原则,MobileNet v2使用倒残差结构违背了第一条,且在通道数较多的feature map上使用了depthwise conv和ReLU违背了第四条,自动生成的结构有较多支路,违背了第三条。

注意:这里指的违背了这些原则,并不是说设计不好。以第二条分组数和第三条支路数为例,不能因为它们会降低模型运行时间,就再也不使用支路和分组卷积,毕竟它们对模型精度有较大提升,因此需要选择合适的分组数和支路数,以便在速度上和精度上取得权衡。

ShuffleNet v2结构

shuffleNet v2是在shuffleNet v1 unit的基础上,根据上面四组实验得出的经验,进行适当的权衡精度与速度而调整的。

图a为shuffleNet v1正常Unit, 图b为shuffleNet v1降采样Unit,图c为shuffleNet v2 正常Unit, 图d为shuffleNet v2 降采样Unit。在shuffleNet v2中引入了Channel Split, 将通道数分为c’ 和c - c’,这里c’取c/2。一部分进行卷积操作,另一部分直接进行concat。卷积的那一路的输入和输出相等,这是考虑到第一条原则。两个1x1卷积不再进行分组,一部分原因是第二条原则,另一部分是因为Channel split就相当于是分组了。两路进行concat后,再进行Channel Shuffle,这是为了通道上的信息进行流动。否则,左端那路的一半通道信息将一直进行到后面都没有通过卷积层。对于空间降采样层,这个Unit是没有Channel split,这样可以实现在两路concat后,通道数翻倍。其余改动具体看图更容易理解。

网络结构

结构跟shuffleNet v1基本一致,唯一的差别是在全局平均池化前加入了1x1卷积,以便混合特征。右边的output channels下的0.5x, 1x等,只是用来表示不同的模型尺寸,也就是通道数不一样。

网络精度的分析

shuffleNet v2不仅效率高,而且精度也高。这有两个主要的原因,高效率是因为使用了更多特征通道和更大的网络容量来构建Block。第二点,在每个block中,一半的通道直接进入下一个block参与下一个block,这可以认为是特征再利用(feature reuse),类似于DenseNet 和CondenseNet中的想法,特征再利用是高效高精度的设计。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。