论文阅读|图像分类网络RepVGG,沿用VGG风格,简单强大,精度和速度上取得更好权衡。

相关信息

在这里插入图片描述

论文地址:https://arxiv.org/abs/2101.03697

源码地址:https://github.com/DingXiaoH/RepVGG

发表时间:2021.01

Abstract

论文提出了一种简单且强大的卷积神经网络架构,该架构推断时和VGG架构类似,仅由一系列的3×3卷积和ReLU堆叠而成;而训练时的架构则是一种你多分支的拓扑结构。正是一种结构化的再参数化技术实现了对训练时和推断时架构的解耦,所以我们的模型叫做RepVGG。ImageNet上RepVGG的top-1准确率达到80%,是目前普通网络所达到的最高。再1080TiGPU上运行时RepVGG比ResNet-50快83%,比ResNet-101快101%,同时准确率更高而且与EfficientNet和ResNet等SOTAmodel相比在精度和速度上取得了更好的权衡。

1. Introduction

VGG架构由conv和ReLU,pooling堆叠而成,这种简单的架构在图片识别上取得了巨大成功。而随后Inception,ResNet,DenseNet等改进模型变得越来越复杂,近期还有一些通过自动或手动的架构搜索方式,或者搜索基于基本架构的混合尺寸策略得到的强大架构。

虽然这些复杂的卷积网络相比简单网络有更高的精度,但是其缺点也很明显:

1)复杂的多分支设计(如ResNet中的残差分支和Inception中的branch-concatenation)使得模型很难实现和定制化,降低了模型的推断速度,并减小了内存利用率。2)一些组件(Xception和MobileNet中的深度卷积,ShuffleNets中的channel shuaffle )增加了内存代价并且缺少多样的设备支持。在这么多影响速度的因素下,浮点计算(FLOPs)量已经不能准确的反应真实速度了。虽然一些新颖模型能能够有较低的FLOPs,但是与VGG和ResNet-18/34/50等old-fashioned模型相比,它们速度可能会慢些。因此,VGG和原始版本的ResNets仍然广泛应用于科研和工业界中。
在这里插入图片描述

作者因此提出了 一种VGG风格的架构——RepVGG,其性能超出了许多的复炸模型,如图1所示。RepVGG有如下的优点:

  • 模型有VGG风格的普通拓扑结构,没有任何额外的分支,输入仅为上一层的输出,输出仅作为下一层的输入。
  • model‘s body 只使用3×3的卷积和ReLU.
  • 扎实的架构,没有自动搜索,认为精炼,混合尺度或者其它的复杂设计。

普通模型很难取得多分支架构模型的性能,因为多分支拓扑架构的模型隐式地整合了许多的浅层模型,从而避免了梯度消失的问题。

由于多分支架构的好处主要是用于训练时的,而其缺点确实推断时所不需要的,于是作者提出利用一个结构化的再参数化技术推断时的普通结构训练时的多分支结构解耦,也即通过转换模型的参数将其架构转换为另一种架构。

具体而言,网络的架构和一组参数耦合,如一个卷积层能有一个四阶卷积tensor表示。如果一个具体架构的参数能能够被转换到另一组与其它架构耦合的参数,则我们科研等价地替换它们,从而整个网络的架构就改变了。
在这里插入图片描述

对于训练时的RepVGG,使用的identity和1×1分支构建的,受ResNet启发但是又和ResNet的分支不同,这些分支能够通过结构化的再参数化移除(图2,4)。训练完成后,通过简单的代数执行变换,identity 分支能被视作退化后的1×1卷积,1×1卷积可被视为退化后的3×3卷积,这样就能使用原来3×3卷积核,identity和1×1分支以及batch normalization(BN)层已经训练好的参数来构造一个3×3的kernel。结构,转换后的模型只有3×3卷积层的堆叠,用于测试和部署。

推断时的RepVGG主体只包含一种操作:3×3 conv followed by ReLU,这使得RepVGG在一些通用的计算设备上更快,如GPUs。甚至再RepVGG能够再特定的硬件达到更快的速度,因为基于特定芯片大小和 功耗,所需要的操作类型越少,则能整合更多的计算单元到芯片上。专用于RepVGG推断的芯片能够有大量的3×3-ReLU单元,更少的内存单元(普通拓扑结构是内存节约型,如图3所示)。我们的贡献如下:

  • 提出RepVGG,架构简单,相比SOTA模型,在速度和精度上取得更好权衡。
  • 提出了结构化地再参数化方法,将训练时复杂的多分支拓扑结构和推断时的普通结构解耦。
  • 在图像分类和语义分割上都有效。

2. Related Work

2.1. From Single-path to Multi-branch

VGG将ImageNet Classification 的top-1 accuracy 提高到70%,随后出现各种复杂设计来获得更高的精度,如GoogleNet,Inception models采用了多分支拓扑结构,ResNet提出简单的2分支结构,随后还有DenseNet,NAS等更为复杂结构,这些复杂模型虽然精度更高,但是不易实现,且减少了并行能力,推理速度下降。

2.2. Effective Training of Single-path Models

介绍无分支卷积网络的相关工作,之前的工作主要寻求使非常深的网络收敛时有合理的精度,但是并不取得比复杂模型更高的精度。结果,这些方法既不简单也不实际。

2.3. Model Re-parameterization

DiracNet是本文方法相关的再参数化方法。他通过编码卷积层的kernel来构建深度普通模型, W ^ = d i a g ( a ) I + d i a g ( b ) W n o r m , \hat{W}=diag(a)I+diag(b)W_{norm}, W^=diag(a)I+diag(b)Wnorm,其中 W ^ \hat{W} W^是最终用于卷积的权重(一个被视作矩阵的4阶tensor),a和b是学习到的tensor, W n o r m W_{norm} Wnorm是归一化的可学习kernel。DiracNet和RepVGG区别:1)RepVGG的结构化再参数化方法由实际数据流通过一个具体的结构实现,该结构可以稍后转换为另一个结构,而DiracNet为了便于优化,仅仅使用卷积核的另一种数据表示。2)DiracNet比一般的参数化的普通模型精度搞,但是低于参数量相当的ResNet。

此外还提到了Asym Conv Block (ACB),其采用异步方式增强规则卷积的骨架,可被视为另一种形式的结构化再参数方法。

2.4. Winograd Convolution

RepVGG只使用3×3卷积,因为3×3卷积在NVIDIA cuDNN和Intel MKL等一些现代计算库中已经很好的优化了。表1显示了理论浮点运算FLOPs,真实运行时间和计算密度,其中3×3卷积的计算密度几乎是其它的4倍,表明总的理论运算FLOPs并不适合代表不同架构速度计算速度。一个经典的加速3×3卷积的算法是Winograd 算法(经典库支持),在标准F(2×2,3×3)Winograd算法支持下,一个3×3卷积的乘运算量(MULs)可减少为原来4/9,由于乘运算比加运算更耗时,所以作者以在Winograd支持下MULs的量来衡量计算代价。
在这里插入图片描述

3. Building RepVGG via Structural Re-param

3.1. Simple is Fast, Memory-economical, Flexible

如标题所示,简单的卷积网络有 Fast, Memory-economical, Flexible的优点。

Fast。许多近期的多分支架构的理论FLOPs都比VGG低,但是可能运行却没有VGG快。如表4,VGG-16的FLOPs是EfficientNet-B3的三倍,但是在1080Ti上VGG快了1.8倍,这表明VGG的计算密度是后者的15倍。除了Winograd带来的加速外,FLOPs和速度的差异可能是因为两点:内存访问代价(MAC)并行性,这两点能影响速度但是却没有倍FLOPs考虑。尽管addition或者concatenation分支的计算可忽略,但是其所需的MAC却很重要。此外,MAC占组卷积所用时间的很大部分。而且,在相同的FLOPs下,有更高并行性的模型速度更快。多分支结构在Inception和自动架构中应用广泛,其通常使用多个小算子来代替若干个大算子,但是碎片计算数量过多会降低设备并行性,因此RepVGG中每个操作中的碎片计算为每个卷积一个,降到最低。

Memory-economic。多分支拓扑结构内存效率底下,因为每个分支的结果都需要保存以后续用以相加或拼接,从而提高了内存占用的峰值。如图3所示,残差块的输入需要被保留到相加,假设块的大小为输入大小,则其内存峰值为输入的两倍。相对应的,对于普通模型来说,当某一层的操作完成后,其占用的内存会被立即释放。对于特定的软件来说,普通卷积神经网络能够对内存使用的优化进行深度优化,减少内存代价从而使得我们可以在芯片上集成更多的计算单元。
在这里插入图片描述

FLexible。 多分支结构限制了模型的结构设计,如残差块中最后的一个卷积层必须生成和输入的shape相同的tensor,否则shortcut就不能执行。多分支结构甚至会限制通道的剪枝等优化操作(用来移除不重要通道的一种非常实用技术)。相对应的,普通结构使我们可以根据需求自由地配置每个卷积层,从而使用剪枝等使模型在性能和效率之间获得平衡。

3.2.Training-time Multi-branch Architecture

普通模型有许多优点,但其最大的缺点是精度低。论文的结构再参数化基于ResNet,明确构建了一个shortcut分支,对应信息流表示为 y = x + f ( x ) y=x+f(x) y=x+f(x),通过残差块来学习f。当x和 f ( x ) f(x) f(x)的维度不匹配时,变成 y = g ( x ) + f ( x ) y=g(x)+f(x) y=g(x)+f(x),其中 g ( x ) g(x) g(x)是以1×1卷积实现的卷积shortcut。ResNets成功的原因可以解释为其多分支的结构使得模型整合了许多浅层模型。当有n个模块时,模型可认为整合了 2 n 2^n 2n个模型,因为每个模型有两个分支。

多分支的拓扑结构推断时存在缺点,但是训练时有利,所以只在训练时使用多分支来整合许多模型,为了让多数的成员更浅或者更简单,使用像ResNet的identity(仅当维度匹配时)和1×1分支,使得一个building block的训练信息流为 y = x + g ( x ) + f ( x ) y=x+g(x)+f(x) y=x+g(x)+f(x)。我们简单的堆叠几个这样的块来构建训练时的模型,当有n这样的块时,模型就相当于整合了 3 n 3^n 3n个成员。训练后,该模型被等价地转换到 y = h ( x ) y=h(x) y=h(x),其中h通过一个卷积层实现,它的参数是通过一系列代数由训练后的参数导出的。

3.3. Re-param for Plain Inference-time Model

在这里插入图片描述

本节介绍如何将一个训练好的block转换为一个3×3卷积层做推断。在每个相加之前,使用BN在每个branch使用BN(图4)。一般,我们使 W ( 3 ) ∈ R C 2 × C 1 × 3 × 3 W^{(3)}∈ R^{C_2×C_1×3×3} W(3)RC2×C1×3×3指代一个输入通道 C 1 C_1 C1,输出通道 C 2 C_2 C2的3×3卷积层的卷积核, W ( 1 ∈ R C 2 × C 1 W^{(1}∈ R^{C_2×C_1} W(1RC2×C1表示1×1分支。使用 µ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) µ^{(3)},σ^{(3)}, γ^{(3)}, β^{(3)} µ(3),σ(3),γ(3),β(3)作为3×3卷积后跟的BN层的累计均值、标准方差和学习到的标量因子和bias。 µ ( 1 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) µ^{(1)},σ^{(1)}, γ^{(1)}, β^{(1)} µ(1),σ(1),γ(1),β(1)表示1×1卷积的, µ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 0 ) µ^{(0)},σ^{(0)}, γ^{(0)}, β^{(0)} µ(0),σ(0),γ(0),β(0)分支表示identity分支。令 M ( 1 ) ∈ R N × C 1 × H 1 × W 1 M^{(1)}∈R^{N×C_1×H_1×W_1} M(1)RN×C1×H1×W1 M ( 2 ) ∈ R N × C 2 × H 2 × W 2 M^{(2)}∈R^{N×C_2×H_2×W_2} M(2)RN×C2×H2×W2 分别表示输入和输出,*表示卷积运算。

如果 C 1 = C 2 , H 1 = H 2 , W 1 = W 2 C_1=C_2,H1_=H2,W_1=W_2 C1=C2,H1=H2,W1=W2,则有:

M ( 2 ) = b n ( M ( 1 ) ∗ W ( 3 ) , µ ( 3 ) , σ ( 3 ) , γ ( 3 ) , β ( 3 ) ) M^{(2)}=bn(M^{(1)}*W^{(3)},µ^{(3)},σ^{(3)}, γ^{(3)}, β^{(3)}) M(2)=bn(M(1)W(3),µ(3),σ(3),γ(3),β(3))

+ b n ( M ( 1 ) ∗ W ( 1 ) , µ ( 3 ) , σ ( 1 ) , γ ( 1 ) , β ( 1 ) ) +bn(M^{(1)}*W^{(1)},µ^{(3)},σ^{(1)}, γ^{(1)}, β^{(1)}) +bn(M(1)W(1),µ(3),σ(1),γ(1),β(1))

+ b n ( M ( 0 ) , µ ( 0 ) , σ ( 0 ) , γ ( 0 ) , β ( 0 ) ) +bn(M^{(0)},µ^{(0)},σ^{(0)}, γ^{(0)}, β^{(0)}) +bn(M(0),µ(0),σ(0),γ(0),β(0)) .(1)

否则,则不适用identity分支,上述等式只有两项。这里的bn指的是推断时的BN函数, ∀ 1 ≤ i ≤ C 2 ∀1 ≤ i ≤ C_2 1iC2,

b n ( M , µ , σ , γ , β ) : , i , : , : = ( M : , i , : , : − µ i ) γ i σ i + β i bn(M,µ,σ, γ, β)_{:,i,:,:}=(M_{:,i,:,:} -µ_i)\frac{γ_i}{σ_i}+β_i bn(M,µ,σ,γ,β):,i,:,:=(M:,i,:,:µi)σiγi+βi .(2)

首先将每个BN和它前面的卷积层转换为一个带有bias向量的卷积,{W, µ,σ, γ, β}转换得到{W’,b’},有

W i , : , : , : ′ = γ i σ i W i , : , : , : , b i ′ = − µ i γ i σ i + β i W'_{i,:,:,:}=\frac{γ_i}{σ_i}W_{i,:,:,:},b'_i=-\frac{µ_iγ_i}{σ_i}+β_i Wi,:,:,:=σiγiWi,:,:,:,bi=σiµiγi+βi.(3)

容易证得 ∀ 1 ≤ i ≤ C 2 ∀1 ≤ i ≤ C_2 1iC2,

b n ( M ∗ , µ , σ , γ , β ) : , i , : , : = ( M ∗ W ′ ) : , i , : , : + b i ′ bn(M*,µ,σ, γ, β)_{:,i,:,:}=(M* _W')_{:,i,:,:}+b'_i bn(M,µ,σ,γ,β):,i,:,:=(MW):,i,:,:+bi.(4)

以上的变换也应用到了identity分支,因为一个identity映射可以被视作一个以identity矩阵作为卷积核的1×1的卷积。在此变换后,我们将会有1个3×3卷积核,2个1×1卷积核,以及3个bias向量。然后把这3个bias相加得到最终的bias,将1×1卷积核加到3×3卷积核的中心点上得到3×3卷积核,具体实现简单,首先给两个1×1卷积做值为0的padding,扩大到3×3,然后把这3个卷积核相加,如图4所示。注意,这个变换的等价性要求3×3卷积核1×1卷积要有相同stride,并且1×1卷积核的padding配置应该比前者小一个像素。例如3×3的层给输入pad一个像素,则1×1层的padding=0.

3.4. Architectural Specification

在这里插入图片描述

表2显示了RepVGG的详细结构。RepVGG采用普通的拓扑结构,大量使用3×3卷积,因为作者希望RepVGG只有一种类型的操作,所以没有像VGG一样采用max pooling。其架构将3×3卷积分为5个stage,第1个stage下采样,stride=2。对于图像分类,使用global average pooling+全连接层作为head,其它特定任务也可以基于任何一层生成的特征图执行。

每个stage的layer数量按照下面三个原则制定:

1)第一个stage在大的分辨率上执行,比较耗时,所以只用1层来降低延迟;

2)最后一层一个有更多的通道,所以只用1层来减少参数。;

3)倒数第二层放最多的层(该层有14 × 14输出分辨率),这一点follow了ResNet设计(ResNet-101在其14×14的分辨率stage放置了69层)。

让五个stage所含的layer数量分别为 1, 2, 4, 14, 1则构建了一个名为RepVGG-A的实例模型,2,3,4stage都加2层之后得到更深的版本RepVGG-B。RepVGG-A用于和轻权重和中等权重的模型相比,RepVGG-B则和高性能的相比。

每层的宽度,即通道数则在经典宽度设置[64, 128, 256, 512]上乘以系数来一致的缩放。a用来缩放前4个stage,b用来缩放最后一个stage,通常b>a,因为最后一次应该有更丰富的特征用于分类或下游任务。b很大也不会显著增加延迟,因为最后一个stage只有一层,由于第一次特征图分辨率很大,所以要求a<1,避免很大的卷积运算,所以第一个stage的width是min(64,64a)。

为了进一步减少参数和计算,可以选择用3×3组卷积核密集卷积交替来权衡精度和效率。具体而言,在RepVGG-A的第3,5,7,…,21层以及RepVGG-B的第23,25,27层设置组卷积,组的数量g为1,2,或者4。不适用adjacent groupwise conv。1×1分支应该和3×3卷积一样有相同的g。

4. Experiments

在这里插入图片描述

基于不同a和b得到的RepVGG命名。

4.1 RepVGG for ImageNet Classification

在这里插入图片描述

这里速度的值是越大越好。

4.2 Structural Re-parameterization is the Key

消融学习证明结构化再参数化技术的重要性。

略,看原文。

4.3 Semantic Segmentation


在这里插入图片描述

4.4. Limitations

RepVGG是一种简单快速、实用性强的模型,旨在GPU和特定硬件上实现最快速度,不太关注参数或FLOPs数量。尽管RepVGG的参数比ResNet更加高效,但其不如轻量级网络如MobileNets和ShuffleNets等在移动端上的表现。

5. Conclusion

论文提出RepVGG,它仅由3×3卷积和ReLU组成,非常适用于GPU或者专用于推断的芯片。在结构化再参数方法的作用下,该简单的卷积网络在ImageNet上的top-1准确率超过了80%,并且相比SOTA模型,在精度和速度上取得更好权衡。

6. Pytorch实现RepVGG

见论文源码,写的很清晰易懂。
作者在github中解释了如何将RepVGG作为骨干网用到其它下游视觉任务,如语义分割,首先用训练时的代码作为骨干网建立模型,然后通过训练,训练完成后再将整个模型转换,源码中还提供了这样的转换函数。

参考

  1. Ding X, Zhang X, Ma N, et al. RepVGG: Making VGG-style ConvNets Great Again[J]. arXiv preprint arXiv:2101.03697, 2021.
  2. https://blog.csdn.net/Skies_/article/details/113681601

猜你喜欢

转载自blog.csdn.net/yanghao201607030101/article/details/114378045