VarGNet论文阅读笔记

VarGNet是地平线2019年新提出的一种轻量级网络,适用嵌入式系统的计算。

原文链接:https://arxiv.org/abs/1907.05653

摘要

    通过观察发现,如果网络中操作的计算强度更平衡,则网络计算图更容易优化。我们提出了基于深度可分离卷积的可变组卷积[25,8,47]。在可变组卷积中,每个组的输入通道数是固定的,可以作为超参数进行调整,这与组卷积中组数是固定的是不同的。这样做的好处有两方面:从编译器的角度来看,固定通道的数量更适合于优化,因为它具有更一致的计算模式和数据布局;与[20,38]中(MobileNet)设置组数为信道号的深度卷积相比,可变组卷积具有更大的网络容量[38],从而允许更小的信道号,这有助于减轻片外通信的时间消耗

1,引言

    授权嵌入式系统运行众所周知的深度学习架构,如卷积神经网络(convolutional neural networks, CNNs),是近年来的一个热门话题。对于智能物联网应用而言,具有挑战性的部分是要求整个系统具有能量约束和体积小的特点。为了应对这一挑战,提高整个计算过程的效率的工作大致可以分为两个方向:一是设计具有小FLOPs的轻量级网络[20,38,52,30],从而对低功耗平台友好;二是优化硬件端配置,如基于FPGA的加速器[13,50],或者通过改进编译器和生成更多智能指令来提高整个计算过程的效率[2,6,48]。

    上述工作都表明了它们在各种应用中的巨大实用价值。然而,由于两个不同的优化方向之间的差距,实际性能可能达不到设计者的期望。具体来说,对于精心调优的网络,如果有小的FLOPs,那么总的延迟可能会很高,而对于精心设计的编译器或加速器,真正的网络可能很难处理

    在这项工作中,我们打算通过系统地分析对嵌入式硬件和相应的编译器友好的轻量级网络的必要特性来弥补现有的差距。更准确地说,由于嵌入式系统中芯片的计算模式受到严格的限制,因此我们提出一个嵌入式系统友好的网络应该适合目标计算模式和理想的数据布局。通过拟合理想的数据布局,可以降低片内存储器与片外存储器之间的通信成本,从而充分利用计算吞吐量

    通过观察发现,如果网络中操作的计算强度更平衡,则网络计算图更容易优化。我们提出了基于深度可分离卷积的可变组卷积[25,8,47]。在可变组卷积中,每个组的输入通道数是固定的,可以作为超参数进行调整,这与组卷积中组数是固定的是不同的。这样做的好处有两方面:从编译器的角度来看,固定通道的数量更适合于优化,因为它具有更一致的计算模式和数据布局;与[20,38]中(MobileNet)设置组数为信道号的深度卷积相比,可变组卷积具有更大的网络容量[38],从而允许更小的信道号,这有助于减轻片外通信的时间消耗。

    我们网络的另一个关键组件是更好地利用基于反向残差block[38]的片上存储器。然而在MobileNetV2[38]中,channel的数量是通过逐点卷积来调整的,而逐点卷积的计算模式不同,在逐点卷积之间是3×3的深度卷积,因此由于计算模式有限,很难进行优化。因此,我们提出先通过可变组卷积将具有C个channel的输入特征扩展到2C个,然后通过点卷积将其返回到C个。通过这种方式,两种类型的层之间的计算成本更加平衡,因此对硬件和编译器更加友好。综上所述,我们的贡献可以总结如下:

    •我们从网络架构和嵌入式系统的硬件/编译器的角度系统地分析了如何优化CNNs的计算。我们发现在这两个优化方向之间存在一个gap,即在嵌入式系统中,由于计算模式的限制,一些精心设计的架构很难被优化

    •考虑到更统一的计算模式和数据布局对嵌入式系统更友好,我们提出了可变组卷积和相应的改进的全网络,简称可变组网络,VarGNet。

    •对常见的视觉任务,如分类、检测、分割、人脸识别等,以及相应的大规模数据集进行实验,验证了我们提出的VarGNet的实用价值。

1.1相关工作

    轻量级的cnn。设计轻量化的CNNs是近年来的一个热点问题。具有代表性的人工设计网络包括SqueezeNet[22]、Xception[8]、MobileNets[20,38]、ShuffleNets[52,30]和IGC[51,46,41]。此外,神经结构搜索(neural architecture search, NAS)[53,35,37,54,28]是一个很有前途的自动设计轻量级CNNs的方向。上述方法能够有效地加速识别过程。最近,提出了支持NAS的平台方法[4,44,10,40],用于搜索在某些硬件平台上有效的特定网络。我们的网络VarGNet是对现有的NAS方法平台的补充,因为所提出的变量组卷积有助于在NAS方法中设置搜索空间。

    CNN加速器的优化。 为了加速神经网络,已经广泛研究了FPGA [13,50,17,31]和ASIC设计[7,36,23,29,19]。 一般而言,流架构(SA)[42、45]和单计算引擎(SCE)[15、5、2]是两种基于FPGA的加速器[43]。 这两个方向之间的区别在于定制和通用性。 SA设计不仅仅在通用性上寻求定制,而SCE则强调灵活性和定制之间的权衡。 在这项工作中,我们希望提出一个可以通过现有的加速器更轻松地优化的网络,从而提高整体性能。

2,在嵌入式系统中设计有效的网络

    芯片在嵌入式系统使用,如FPGA和ASIC,低单价以及快速的上市时间在设计整个系统是至关重要的因素。这样的结果在一个相对简单的芯片配置至关重要的点。换句话说,计算方案严格限制相比,通用的处理单元。然而,在SOTA网络中的操作是如此的复杂,有些层可以加通过硬件设计加速而其他层则不行。因此,设计高效的网络嵌入式系统,第一直觉就是网络中的层彼此在某种意义上应该类似。

    另一个重要的直觉是基于CNNs中使用的卷积的两个属性。第一个属性是计算模式。在卷积中,几个滤波器(kernels)在整个特征图上滑动,表示kernel被重复使用,而来自特征图的值只使用一次。第二个属性是卷积核和feature map的数据大小。通常情况下,卷积核的大小远远小于feature map的大小,例如在2D卷积中,kernel的k2C, feature map的2HWC。根据上述两个特性,一个巧妙的解决方案是先加载kernels的所有数据,然后依次进行提取和提取特征数据[48]的卷积。这种实用的解决方案是我们在嵌入式系统上高效网络设计的两个指导方针的第二个直觉:

    •如果block之间的中间特征映射的大小更小就更好了。

    •一个block中各层的计算强度应该是平衡的。

    接下来,我们将详细介绍这两个准则。

    blocks之间的小的中间特征映射。在SOTA网络中,通常的做法是先设计一个普通block和一个下采样block,然后将几个block叠加在一起,得到一个深度网络。此外,在这些block中,残差连接[18]被广泛采用。因此,在最近的编译器端优化[48]中,block中的层通常被分组并一起计算。在这种方式下,片外存储器和片内存储器只在启动或结束网络中一个block的计算时通信。因此,block与block之间较小的中间特征映射必然有助于减少block与block之间的数据传输时间.

    block内平衡计算强度。如前所述,在实践中,在执行卷积之前要加载多个层中的权值。如果加载的层在计算强度方面有很大的差异,则需要额外的片上内存来存储特征映射的中间片。在MobileNetV1[20]中,使用了一个深度conv和一个点conv。与以前的定义不同,在我们的实现中,权重已经加载。因此,计算强度是通过FLOPs除以特征图的大小来计算的。那么,如果feature map的大小为28×28×256,则深度卷积和点卷积的计算强度分别为9和256。因此,当运行这两个层时,我们必须增加芯片上的缓冲区来满足点卷积,或者不将这两个层的计算分组在一起。

3,可变组卷积

    在前面提到的两个准则的基础上,我们在本节中提出了一个新的网络。为了平衡计算强度,我们将网络中一个组中的channel数设置为常数,从而使得每个卷积层中的组都是可变的。如果我们看一下卷积的FLOPs,固定channel数的动机并不难理解,

    因此,如果feature map的大小为常数,则通过固定G = Channels/ Groups,block内的计算强度更加均衡。此外,可以设置组中的channel数量来满足处理元素的配置,每次处理一定数量的channels。

    与深度卷积相比,可变组卷积增加了FLOPs,增加了表达性[38]。因此,现在我们能够减少中间特征映射的channels数量,同时保持与以前网络相同的泛化能力。具体而言,我们设计了如图1所示的新型网络block。对于整个网络早期使用的普通block,由于此时权值的大小比较小,所以四层的权值都可以缓存到片上存储器中。当进入晚期,channel数增加和权重的大小增加,正常的block也能够优化只加载一个可变组卷积和点卷积。同样,下采样block的操作对compiler-side和硬件方面的优化也友好。一个普通block的整个计算过程如图2所示。然后,基于MobileNetV1[20]的架构,我们将他们的基本block替换为我们的block,整个详细的网络架构如表1所示。另外,另一个基于ShuffleNet v2的架构如表2所示。

VarGNet论文阅读笔记_第1张图片 图1 可变组卷积网络


 

VarGNet论文阅读笔记_第2张图片 图2 可变组网络中普通block的计算方案。首先将四种卷积运算的权值加载到片上存储器中,然后对特征进行处理。标题

VarGNet论文阅读笔记_第3张图片

VarGNet论文阅读笔记_第4张图片

4 实验

4.1 ImageNet分类

    我们的模型在ImageNet上的结果如表3和表4所示。训练超参数设置为:batch size1024,crop ratio 0.875,学习率0.4,余弦学习率调整机制,权重衰减4e-5,训练epochs 240。从table(c)可以看出,当模型规模较小时,VarGNet v2的性能要比ShuffleNet v2差,这是由于VarGNet v2中使用的channel较少造成的。然后,当模型规模较大时,我们的网络表现得更好。

VarGNet论文阅读笔记_第5张图片

VarGNet论文阅读笔记_第6张图片

4.2 目标检测

    在表5中,我们展示了我们提出的VarGNet的性能以及比较方法。我们评估了我们在COCO数据集[27]上提出的网络的目标检测性能,并将其与其他最先进的轻量级架构进行了比较。我们选择基于FPN的Faster R-CNN[26]作为框架,所有实验都在相同的设置下进行,输入分辨率为800×1333,epochs为18。特别地,我们发现如果使用更多的epoch来训练ShuffleNet v2可以获得更好的accuracy,因此我们为ShuffleNet v2训练了一个拥有27个epoch的模型。在测试时,RPN阶段评估每幅图像的1000个proposals。除8000张minimal图像外,我们使用train+val集合进行训练,最后在minival集合上进行测试。表中列出了mAP和模型复杂度。

VarGNet论文阅读笔记_第7张图片

4.3 像素级解释

4.3.1 Cityscapes
在Cityscapes数据集[9]上,我们设计了一个多任务结构(图3a)来进行两个重要的像素级解析任务:单图像深度预测和分割。

VarGNet论文阅读笔记_第8张图片

    训练设置。我们使用标准的Adam优化器,将重量衰减设置为1e-5,batch size大小设置为16。初始化学习率为1e-4,多项式衰减,幂次为0.9。总训练epochs设置为100。为了增加数据,使用了随机水平翻转,并从0.6-1.2中随机选择比例来调整图像的大小。对于多任务训练,我们定义有损函数为:

     当任务是全景分割时,我们设置λinstance = 0.2;λsemantic = 1.0。添加深度任务之后,我们设置λdepth = 0.08。

    结果。参数和比较方法的FLOPs见表6。分割结果和深度预测的可视化示例分别见表7和图4。

4.4 KITTY

    训练设置。对于KITTI数据集[14]上的单幅图像深度预测和立体任务,我们给出了基于VarGNet的模型的性能。实验采用了一个U-Net风格的体系结构(3b)。所有的深度模型都是在KITTI原始数据集上训练的,我们测试了来自Eigen等人[12]分割的29个场景中的697张图像,并对其余32个场景中的23488张图像进行了训练。所有实验结果均在0m ~ 80m、0m ~ 50m深度范围内进行评价。评价指标与以往工作相同。所有的立体模型都是在KITTI原始数据集上训练的,我们测试了Eigen等人分割的测试集[12],并训练了KITTI15。原来的评价指标为EPE和D1。在训练期间,使用标准的SGD优化器,momentum设置为0.9。resnet18和resnet50的标准权重衰减设置为0.0001,其他设置为0.00004。迭代次数设置为300个epoch。初始学习速率为0.001,学习速率在[120,180,240]epoch处衰减0.1。我们使用4个GPU来训练模型,batch size设置为24。

    结果。在表8和表9中,我们展示了我们在各种评价指标下的深度结果和立体结果。同时,我们报告了我们实现的MobileNet和ResNet作为比较。此外,视觉效果如图5和图6所示。

4.5 人脸识别

    所有的网络都经在DeepGlint MS-Celeb-1M-v1c数据集[1]训练,[1]是从MS Celeb-1M[16]中清理出来的。从86,876个id中有3,923,399个对齐的人脸图像。验证数据集使用LFW[21]、CFP-FP[39]和AgeDB-30[32]。最后,在MegaFace Challenge 1[33]上对所有网络模型进行评估。表10列出了验证数据集的最佳人脸识别准确率,以及MegaFace数据集[11]的改进版本在1e-6 false接受率下的人脸验证true接受率。我们使用MobileNet v1和MobileNet v2作为基线模型。为了适应输入图像大小112x112,对于每个基线和VargNet模型,将第一卷积层的stride设置为1。为了获得更好的性能,我们进一步将池化层替换为“BN-Dropout-FC-BN”结构,即InsightFace[11],然后是ArcFace loss[11]。标准的SGD优化器与momentum 0.9一起使用,batch size大小设置为512,配置8个gpu。学习速率从0.1开始,在100K、140K和160K迭代时除以10。我们设权重衰减为5e-4。嵌入特征维数为256,dropout率0.4。归一化比例为64,ArcFace margin设置为0.5。所有的训练都基于InsightFace工具箱[11]。

 

 

 

你可能感兴趣的:(轻量级网络,网络结构)