RepVGG:使VGG样式的ConvNets再次出色
摘要
我们提出了一种简单而强大的卷积神经网络架构,该架构具有类似于VGG的推理时间模型,该推理模型仅由3*3卷积和ReLU的堆栈组成,而训练时间模型具有多个分支拓扑。训练时间和推理时间架构的这种解耦是通过结构性重新参数化技术实现的,因此该模型称为RepVGG。在ImageNet上,据我们所知,RepVGG的top-1准确性达到80%以上,这是纯模型首次实现该精度。在NVIDIA 1080Ti GPU上,RepVGG模型的运行速度比ResNet-50快83%,比ResNet-101快101%,具有更高的精度,并且与最先进的模型(例如EfficientNet和RegNet)相比,它显示了良好的精度-速度折衷。可以在https://github.com/megvii-model/RepVGG找到代码和训练有素的模型。
1.引言
卷积神经网络(ConvNets)已成为许多任务的主流解决方案。 VGG [30]通过由conv,ReLU和pooling堆栈组成的简单体系结构,在图像识别方面取得了巨大成功。 有了Inception [32、33、31、17],ResNet [10]和DenseNet [15],许多研究兴趣都转移到了设计良好的体系结构上,从而使模型变得越来越复杂。 通过自动[43、28、22]或手动[27]架构搜索,或在基础架构上搜索的复合缩放策略,可以获得一些最近的强大架构[34]。
尽管许多复杂的ConvNet都比简单的ConvNet提供更高的准确性,但缺点很明显。
1)复杂的多分支设计(例如ResNet中的残差加法和Inception中的分支级联)使模型难以实现和定制,减慢了推理速度并降低了内存利用率。
2)一些组件(例如,Xception [2]和MobileNets [14,29]中的深度转换以及ShuffleNets [23,40]中的通道混洗)增加了内存访问成本,并且缺乏各种设备的支持。 由于有许多影响推理速度的因素,浮点运算(FLOP)的数量不能准确反映实际速度。 尽管某些新颖的模型的FLOP低于老式的模型(如VGG和ResNet-18 / 34/50 [10]),但它们运行速度可能不快(表4)。 因此,VGG和ResNets的原始版本在学术界和工业界仍被大量用于实际应用中。
在本文中,我们提出了RepVGG,这是一种VGG风格的体系结构,其性能优于许多复杂的模型(图1)。 RepVGG具有以下优点。
•该模型具有类似VGG的普通(也称为前馈)拓扑1,没有任何分支。即,每一层都将其唯一的前一层的输出作为输入,并将输出馈送到其唯一的下一层。
•模型的身体仅使用3*3的卷积和ReLU。
•实例化混凝土结构(包括特定的深度和层宽),无需自动搜索[43],手动优化[27],复合缩放[34]或其他繁琐的设计。
普通模型要达到与多分支体系结构相当的性能水平,这是一个挑战。一种解释是,多分支拓扑,例如,ResNet,使模型成为许多较浅模型的隐式集合[35],因此训练多分支模型可以避免梯度消失的问题。
由于多分支架构的好处全都在训练上,而缺点在推理上是不希望有的,我们建议通过结构重新参数化将训练时的多分支和推理时的普通架构分离,这意味着通过转换其参数将模型从一个建筑转换为另一个建筑。 具体而言,网络结构与一组参数耦合,例如,用四阶内核张量表示卷积层。 如果可以将某个结构的参数转换为由另一结构耦合的另一组参数,则可以用后者等效地替换前者,从而更改整个网络体系结构。
具体而言,我们使用identity和1*1的分支来构造训练时的RepVGG,这受ResNet的启发,但以不同的方式可以通过结构重新参数化除去分支(图2,4)。经过训练后,我们用简单的代数进行变换,因为一个等价分支可以看作是一个退化的1*1conv,而后者又可以看作是一个退化的3* 3 conv,因此我们可以用原始3 *3内核,identity和1*1分支以及批处理规范化(BN)[17]层的训练参数。因此,转换后的模型具有3*3 conv层的堆栈,将其保存以进行测试和部署。
值得注意的是,推理时RepVGG的主体仅涉及一种类型的操作:3*3 conv后跟ReLU,这使RepVGG在GPU等通用计算设备上快速运行。更好的是,RepVGG允许专用硬件实现更高的速度,因为给定芯片尺寸和功耗,我们需要的操作类型越少,我们可以集成到芯片上的计算单元就越多。即,专用于RepVGG的推理芯片可以具有大量的3*3-ReLU单元和更少的存储单元(因为普通拓扑在存储方面很经济,如图3所示)。我们的贡献总结如下。
•我们提出了RepVGG,这是一种简单的体系结构,与最新技术相比,具有良好的速度精度折衷。
•我们建议使用结构重新参数化将训练时的多分支拓扑与推理时的纯体系结构分离。
•我们已经展示了RepVGG在图像分类和语义分割中的有效性,以及实现的效率和简便性。
2.相关工作
2.1。从单路径到多分支
在VGG [30]将ImageNet分类的top-1准确性提高到70%以上之后,有很多创新使ConvNets复杂化以实现高性能,例如当代的GoogLeNet [32]和后来的Inception模型[33]。 [3] [31,17,17]采用精心设计的多分支体系结构,ResNet [10]提出了简化的两分支体系结构,而DenseNet [15]通过将低层和许多高层连接在一起使拓扑更加复杂。 神经架构搜索(NAS)[43、28、22、34]和手动设计空间设计[27]可以生成具有更高性能的ConvNet,但要付出大量计算资源或人力的代价。 NAS生成的模型的某些大型版本甚至无法在普通GPU上进行训练,因此限制了应用程序。 除了实现的不便外,复杂的模型可能会降低并行度[23],从而减慢推理速度。
2.2。有效地训练单路径模型
已经尝试了无分支训练ConvNets。但是,先前的工作主要是试图使非常深的模型以合理的精度收敛,但是没有比复杂的模型获得更好的性能。因此,方法和结果模型既不简单也不实际。例如,提出了一种初始化方法[36]来训练极深的普通ConvNet。通过基于均场理论的方案,在MNIST上对10,000层网络进行了超过99%的精度培训,在CIFAR-10上进行了82%的精度培训。尽管这些模型不切实际(即使LeNet-5 [19]在MNIST上可以达到99.3%的准确度,而VGG-16在CIFAR-10上也可以达到93%以上的准确度),但是理论上的贡献是有见地的。最近的工作[24]结合了多种技术,包括泄漏ReLU,最大范数和仔细的初始化。在ImageNet上,它显示具有147M参数的普通ConvNet可以达到74.6%的top-1精度,比其报告的基线(ResNet-101、76.6%,45M参数)低2%。
值得注意的是,本文不仅说明了简单模型可以很好地收敛,而且无意训练像ResNets这样的非常深的ConvNet。相反,我们旨在构建一个具有合理深度和有利的精度-速度折衷的简单模型,该模型可以通过最常见的组件(例如常规conv和BN)和简单的代数简单地实现。
2.3。模型重新参数化
DiracNet [38]是与我们相关的一种重新参数化方法。它通过将conv层的内核编码为
来构建深平原模型,其中是最终用于卷积的权重(4阶张量被视为矩阵) ),a和b是学习的向量,而是规范化的可学习内核。与具有相当数量参数的ResNet相比,DiracNet的top-1准确性在CIFAR-100上降低了2.29%(78.46%对80.75%),在ImageNet上降低了0.62%(DiracNet-34的72.21%对ResNet-34的72.83%)。 DiracNet与我们的方法的不同之处在于:1)我们的结构化重新参数化是通过实际数据流通过一个具体的结构实现的,该结构随后可以转换为另一个结构,而DiracNet只是为了方便使用了conv内核的另一个数学表达式优化。即,结构上重新参数化的纯模型是实际的训练时多分支模型,但DiracNet并非如此。 2)DiracNet的性能高于通常参数化的普通模型,但低于可比的ResNet,而RepVGG模型的性能大大优于ResNet。Asym Conv Block(ACB)[9]采用非对称Conv来加强规则Conv的“骨架”,这可以看作是结构再参数化的另一种形式,因为它将训练的块转换为Conv。与我们的方法相比,不同之处在于ACB是为组件级改进而设计的,并用作任何架构中conv层的直接替代,而我们的结构重新参数化对于训练普通的ConvNets至关重要。在第4.2节中显示。
2.4。 Winograd卷积
RepVGG仅使用3*3 conv,因为它已在GPU和CPU上受到一些现代计算库(例如NVIDIA cuDNN [1]和Intel MKL [16])的高度优化。表1显示了在1080Ti GPU上使用cuDNN 7.5.0测试的理论FLOP,实际运行时间和计算密度(以每秒Tera浮点运算,TFLOPS衡量)2。结果表明,3*3 conv的理论计算密度大约为4,这表明总的理论FLOP不能替代不同体系结构之间的实际速度。 Winograd算法[18](仅在步幅为1时)是用于加速3*3conv的经典算法,而cuDNN和MKL之类的库已经很好地支持(默认情况下启用)。例如,使用标准F(2*2; 3* 3)Winograd,3*3 conv的乘法(MUL)数量减少到原始的4/9。由于乘法比加法耗时得多,因此我们计算了MUL来衡量Winograd支持下的计算成本(在表4、5中由Wino MUL表示)。请注意,特定的计算库和硬件确定是否对每个运算符使用Winograd,因为小规模的卷积可能由于内存开销而无法加速。3
3.通过结构重参数构建RepVGG
3.1。简单即快速,节省内存,灵活
至少有三个原因可以使用简单的Con-vNet:它们快速,节省内存和灵活。
快速 许多最新的多分支体系结构的理论FLOP低于VGG,但运行速度可能不快。 例如,VGG-16的FLOP是EfficientNet-B3的8.4倍[34],但在1080Ti上的运行速度是1.8倍(表4),这意味着前者的计算密度是后者的15倍。 除了Winograd conv带来的加速之外,FLOP和速度之间的差异可以归因于两个重要因素,这些因素对速度有很大影响,但FLOP并未考虑这些因素:内存访问成本(MAC)和并行度 [23]。例如,尽管所需的分支加法或级联计算可以忽略不计,但MAC还是很重要的。此外,MAC在成组卷积中占时间使用的很大一部分。另一方面,在相同的FLOP下,具有高并行度的模型可能比具有低并行度的模型快得多。由于在Inception和自动生成的体系结构中广泛采用了多分支拓扑,因此使用了多个小运算符,而不是几个大运算符。先前的一项工作[23]报告说,NASNET-A [42]中的碎片运算符的数量(即,一个构建块中的单个转换或池化操作的数量)为13,这对具有强大并行计算能力的设备不友好例如GPU,并引入了额外的开销,例如内核启动和同步。相反,在ResNets中,此数字是2或3,我们将其设置为1:单个转换。
节省内存 多分支拓扑的内存效率低下,因为需要保留每个分支的结果,直到添加或串联为止,从而显着提高了内存占用的峰值。例如,如图3所示,需要保持输入到剩余块的时间,直到相加为止。如图3所示。假设该块保持特征图的大小,则作为输入的存储器占用的峰值为2。相反,简单的拓扑允许在操作完成后立即释放特定层的输入所占用的内存。在设计专用硬件时,普通的ConvNet可以进行深度内存优化并降低内存单元的成本,以便我们可以将更多计算单元集成到芯片上。
灵活 多分支拓扑对体系结构规范施加了约束。 例如,ResNet要求将conv层组织为残差块,这限制了灵活性,因为每个残差块的最后一个conv层必须产生相同形状的张量,否则快捷方式的添加就没有意义了。 更糟糕的是,多分支拓扑限制了通道修剪的应用[20,12],这是删除一些不重要通道的实用技术,某些方法可以通过自动发现每层的适当宽度来优化模型结构[ 7]。 但是,多分支模型使修剪变得棘手,并导致明显的性能下降或低加速比[6、20、8]。 相反,简单的体系结构使我们可以根据我们的要求自由配置每个conv层,并进行修剪以获得更好的性能效率折衷。
3.2。训练时的多分支体系结构
普通的ConvNets有很多优点,但有一个致命的缺点:性能差。例如,使用BN [17]等现代组件,VGG-16可以在ImageNet上达到72%的top-1准确性,这似乎已经过时了。我们的结构化重新参数化方法受到ResNet的启发,该方法明确构造了一个快捷分支,以将信息流建模为y = x + f(x)并使用残差块学习f。当x和f(x)的尺寸不匹配时,它将变为y = g(x)+ f(x),其中g(x)是由1*1卷积实现的卷积快捷方式。 ResNets成功的一个解释是,这种多分支架构使模型成为众多浅层模型的隐式集合[35]。具体来说,对于n个块,该模型可以解释为个模型的集合,因为每个块将流分支为两条路径。
由于多分支拓扑在推理方面有缺点,但是分支似乎对训练有好处[35],因此我们使用多个分支来制作众多模型的唯一训练时间组合。 为了使大多数成员更浅或更简单,我们使用类似于ResNet的identity(仅在尺寸匹配时)和1*1分支,以便构建块的训练时信息流为y = x + g(x )+ f(x)。 我们简单地堆叠几个这样的块来构建训练时间模型。 从与[35]相同的角度来看,模型成为具有n个这样的块的个成员的集合。 训练后,将其等效转换为y = h(x),其中h由单个conv层实现,并且其参数通过一系列代数从训练后的参数中得出。
3.3。普通推理时间模型的重新参数
在本小节中,我们描述如何将训练后的块转换为单个3*3 conv层进行推理。注意,在添加之前,我们在每个分支中都使用了BN(图4)。形式上,我们使用
表示3*3 conv层的内核,其中C1输入通道和C2输出通道,而
表示1*1分支的内核。我们使用
作为3*3 conv之后的BN层的累积均值,标准差,学习缩放因子和偏差,
对应1*1 conv之后的BN,和
为identity分支。令
分别为输入和输出,并为卷积运算符。如果C1 = C2; H1 = H2; W1 = W2,我们有
否则,我们不使用任何identity分支,因此上面的方程式只有前两项。这里bn是推理时间BN函数,形式为
我们首先将每个BN及其之前的conv层转换为具有偏差向量的conv。设
是从
转换而来的核和偏差。我们有
上面的转换也适用于identity分支,因为identity映射可以视为以identity矩阵为内核的conv转换。经过这样的转换,我们将拥有一个3*3内核,两个1*1内核和三个偏置矢量。然后我们将三个偏差向量相加得到最终偏差,将1*1的核加到3*3核的中心点得到最终的3*3核,这可以通过先将两个1*1核zero-padding到3*3并将三个核相加来轻松实现,如图4所示。请注意,此类转换的等效条件要求3*3和1*1层具有相同的步幅,并且后者的填充配置应比前者少一个像素。例如,对于将输入填充一个像素的3*3层(最常见的情况),1*1层应具有padding = 0。
3.4。建筑规格表。
表2显示了RepVGG的规范,包括深度和宽度。 RepVGG是VGG风格的,因为它采用简单的拓扑并大量使用3*3 conv,但是它不像VGG那样使用max pooling,因为我们希望主体仅具有一种类型的操作。我们将3*3层分成5个阶段,阶段的第一层向下采样,步幅=2。对于图像分类,我们使用全局平均池,然后使用完全连接的层作为头部。对于其他任务,可以在任何层产生的特征上使用特定于任务的头。
我们遵循三个简单的准则来决定每个阶段的层数。 1)第一阶段以高分辨率运行,这很耗时,因此我们仅使用一层来降低延迟。 2)最后一级应具有更多通道,因此我们仅使用一层来保存参数。 3)紧随ResNet及其最新版本[10、27、37]之后,我们将最多的层放到倒数第二级(在ImageNet上具有14 14输出分辨率)(例如,ResNet-101在其14 14分辨率中使用69层阶段)。我们让这五个阶段分别具有1、2、4、14、1层,以构造一个名为RepVGG-A的实例。我们还构建了更深的RepVGG-B,在stage2、3和4中又增加了2层。我们使用RepVGG-A与其他轻量级和中等重量的模型(包括ResNet-18 / 34/50和RepVGG-B)竞争性能的。
我们通过均匀缩放[64; 128; 256; 512]的经典宽度设置(例如VGG和ResNets)来确定图层宽度。 我们在前四个阶段使用乘数比例,在最后一个阶段使用b,通常是setb>,因为我们希望最后一层对分类或其他下游任务具有更丰富的功能。 由于RepVGG在最后阶段只有一层,因此较大的值不会显着增加等待时间或参数数量。 具体而言,stage2、3、4、5的宽度分别为[64a; 128a; 256a; 512b]。 为了避免在大特征图上进行大卷积,如果a <1,则缩小stage1,但不放大,因此stage1的宽度为min(64; 64a)。
为了进一步减少参数和计算量,我们可以选择将每层3*3conv层与密集层进行交错,以牺牲精度来提高效率。具体来说,我们为RepVGG-A的第3、5、7,...,21层以及RepVGG-B的第23、25和27层设置组数g。为简单起见,我们为此类层全局设置了g为 1、2或4,而无需逐层调整。我们不使用相邻的逐层转换层,因为那样会禁用通道间的信息交换并带来副作用[40]:某个通道的输出只能从一小部分输入通道中得出。请注意,1*1个分支应具有与第3*3个转化率相同的g。
4.实验
在本节中,我们将RepVGG的性能与ImageNet上的基线进行比较,通过一系列的消融研究和比较证明结构重新参数化的重要性,并验证RepVGG在语义分割上的泛化性能[41]。
4.1。 RepVGG用于ImageNet分类
我们将RepVGG与经典和最先进的模型进行比较,这些模型包括ImageNet-1K [5]上的VGG-16 [30],ResNet [10],ResNeXt [37],EfficientNet [34]和RegNet [27]。 包括用于训练的128万个高分辨率图像和用于验证的50K图像(来自1000个类别)。我们分别使用EfficientNet-B0 / B3和RegNet-3.2GF / 12GF作为中量级和重量级最新模型的代表。我们改变乘数a和b以生成一系列RepVGG模型以与基准进行比较。如表3中总结。
我们首先将RepVGG与最常用的基准ResNets [10]进行比较。 为了与ResNet-18进行比较,我们将a设置为0:75; 对于RepVGG-A0,b = 2.5。 对于ResNet-34,我们使用更宽的RepVGG-A1。 为了使RepVGG的参数比ResNet-50略少,我们构建RepVGG-A2,其中a = 1.5; b = 2.75。 为了与更大的模型进行比较,我们构造了宽度增加的更深的RepVGG-B0 / B1 / B2 / B3。 对于那些具有交错的分组层的RepVGG模型,我们将g2 / g4附加到模型名称作为后缀。
为了训练轻量级和中量级模型,我们仅使用简单的数据增强管道,包括随机裁剪和左右翻转,遵循官方PyTorch示例[26]。我们在8个GPU上使用256的全局批处理大小,学习速率初始化为0.1,cosine annealing120个epochs,标准SGD的动量系数为0.9,权重衰减为,在conv和完全连接层的内核上。对于包括RegNetX-12GF,EfficientNet-B3和RepVGG-B3在内的重量级模型,我们使用5阶段预热,cosine annealing200epochs,标签平滑[33]和混合[39](以下[11] ]),以及Autoaugment [4](随机裁剪和翻转)的数据增强管道。 RepVGG-B2及其g2 / g4变体在两种设置中都经过培训。我们先在1080Ti GPU 上以128个批次的大小测试每个模型的速度,方法是先送入50个批次以预热硬件,然后再记录50个批次并记录使用时间。为了公平地比较,我们在同一GPU上测试所有模型,并且所有基线的conv-BN序列也都转换为带偏差的conv(等式3)。
如表所示。在表4和图1中,RepVGG显示出有利的精度-速度折衷。例如,就准确性和速度而言,RepVGG-A0比ResNet-18好1.25%和33%,RepVGG-A1比ResNet-34好0.29%/ 64%,RepVGG-A2比ResNet -50好0.17%/ 83%。使用交错的分组层(g2 / g4),可以进一步加快RepVGG模型,而准确性会降低。例如,RepVGG-B1g4比ResNet-101好0.37%/ 101%,而RepVGG-B1g2则以相同的精度快于ResNet-152 2.66。尽管参数的数量不是我们主要关注的问题,但是上述所有RepVGG模型都比ResNets更有效地进行参数设置。与经典的VGG-16相比,RepVGG-B2仅具有58%的参数,运行速度快10%,显示精度高6.57%。相对于以RePr [25](一种基于修剪的精心设计的训练方法)训练的VGG模型(据我们所知,该模型是精度最高(74.5%)的类VGG模型),RepVGG-B2还具有以下优势:精度达到4.28%。
与最先进的基准相比,RepVGG考虑到其简单性也显示出良好的性能:RepVGG-A2比EfficientNet-B0好1.37%/ 59%,RepVGG-B1比RegNetX-3.2好0.39% GF,运行速度稍快。
值得注意的是,RepVGG模型在200个纪元内达到了80%以上的精度(表5),这是平原模型首次据我们所知赶上最新技术。与RegNetX-12GF相比,RepVGG-B3的运行速度提高了31%,考虑到RepVGG不需要像RegNet [27]那样的大量人力来完善设计空间,因此这是令人印象深刻的,并且架构超参数是随便设置的。
作为计算复杂性的两个代理,我们计算了Sect中介绍的理论FLOP和Wino MUL。 2.4。例如,我们发现Winograd算法不会加速EfficientNet-B0 / B3中的转换。表4显示Wino MUL在GPU上是更好的代理,例如ResNet-152的运行速度比VGG-16慢,理论上的FLOP较低,但Wino MUL较高。当然,实际速度应始终是黄金标准。
4.2。结构重新参数化是关键
在本小节中,我们验证了结构重新参数化技术的重要性(表6)。使用上述相同的简单训练设置,从头开始训练所有模块120个纪元。首先,我们通过从RepVGG-B0的每个块中删除标识和/或1*1分支来进行消融研究。删除两个分支后,训练时间模型会降级为普通的平原模型,并且只能达到72.39%的准确性。识别率提高到73.15%(1*1),识别率提高到74.79%(identity)。。全功能RepVGG-B0的准确性为75.14%,比普通的普通模型高2.75%。
然后,我们构建了一系列变体和基线,用于在RepVGG-B0上进行比较(表7)。同样,所有模块都在120个时期内从零开始训练。
•Identity w/o BN 删除身份分支中的身份证明。
•Post-addition BN 删除三个分支中的BN层,并在addition后附加BN层。即,将BN的位置从添加前更改为添加后。
•+ReLU in branches 将ReLU插入每个分支中(在BN之后和添加之前)。由于无法将这样的块转换为单个conv层,因此没有实际用途,我们只希望了解更多的非线性是否会带来更高的性能。
•DiracNet [38] 采用了经过精心设计的conv内核重新参数化,如Sect中所述。 2.2。我们使用其官方的PyTorch代码构建图层以替换原始的3conv。
•Trivial Re-param 是通过将一个身份内核直接添加到3内核中来对转换内核进行更简单的重新参数化,这可以看作是DiracNet的降级版本(^ W = I + W [38])。
•Asymmetric Conv Block(ACB) [9] 可以看作是结构重新参数化的另一种形式。我们与ACB进行比较,以查看结构重新参数化的改进是否归因于组件级的过度参数化(即,额外的参数使every3 3conv变得更强大)。
•Residual Reorg 通过以类似于ResNet的方式重新组织每个阶段(每个块2层)。具体来说,生成的模型在第一个和最后一个阶段具有one3 3layer,在stage2、3、4具有2、3、8个残差块,并且使用类似于ResNet-18 / 34的快捷方式。
我们认为结构重参数优于DiractNet和琐碎重参数的事实在于,前者依赖于通过具有非线性行为(BN)的混凝土结构的实际数据流,而后者仅使用另一个数学表达式转换内核。即,前者“重新参数”的意思是“使用结构的参数来参数化另一个结构”,而后者的意思是“首先用另一组参数计算参数,然后将其用于其他计算”。对于像训练时间BN这样的非线性组件,前者不能被后者近似。有证据表明,去除BN会降低精度,而增加ReLU则会提高精度。换句话说,尽管可以将RepVGG块等效地转换为单个conv进行推理,但是推理时间等价并不意味着训练时间等价,因为我们无法构造具有相同训练时间行为的conv层作为RepVGG块。
与ACB的比较表明,RepVGG的成功不应仅仅归因于每个组件的过度参数化,因为ACB使用更多的参数,但不能像RepVGG一样提高性能。仔细检查一下,我们将每个3*3转换量的ResNet-50替换为RepVGG块,并从头开始训练120个纪元。准确性为76.34%,仅比ResNet-50基线高0.03%,这表明RepVGG样式的结构重新参数化不是通用的过度参数化技术,而是对训练功能强大的普通ConvNets至关重要的方法。
与具有相同3*3conv数量和训练和推理额外捷径的实际残差网络Residual Reorg相比,RepVGG的表现高出0.58%,这并不奇怪,因为RepVGG的分支机构更多。例如,这些分支使RepVGG的stage4成为
个模型的整体[35],而Reorgid Reorg的数目是
4.3。语义分割
我们验证了ImageNet预训练的RepVGG在Cityscapes [3]上的语义分割的泛化性能,其中包含5K精细注释的图像和19个类别。我们使用PSPNet [41]框架,一个以0.01为底,功效为0.9,权重衰减为10 4,8个GPU的全局批处理大小为16个(共40个纪元)的多学习率策略。为了公平起见,我们仅将ResNet-50 / 101主干更改为RepVGG-B1g2 / B2,并保持其他设置相同。
继正式实施PSPNet-50 / 101 [41](在ResNet-50 / 101的后两个阶段使用膨胀的conv)之后,我们还在RepVGG-B1g2 /的后两个阶段制作了所有3 3 conv层。 B2扩张了。由于当前3 3扩张的转化效率较低(尽管FLOP与3 3常规转化相同),因此此类修改会减慢推理速度。为了便于比较,我们构建了另外两个仅在最后5层(即,stage4的最后4层和stage5的唯一层)进行扩张的PSPNet(由fastin表8表示)。比ResNet-50 / 101骨干网快。结果表明,RepVGG的骨架在平均IoU上具有更高的速度,分别比ResNet-50和ResNet-101优越1.71%和1.01%。令人印象深刻的是,RepVGG-B1g2-fast在mIoU方面优于ResNet-101主干网0.37,运行速度快62%。有趣的是,对于较大的模型,扩张似乎更有效,因为与RepVGG-B1g2-fast相比,使用更多扩张的conv层不会提高性能,但会以合理的速度将RepVGG-B2的mIuU提高1.05%。
4.4。局限性
RepVGG模型是快速,简单和实用的ConvNet,旨在在GPU和专用硬件上以最高速度运行,而无需考虑参数或理论FLOP的数量。尽管RepVGG模型的参数效率比ResNets高,但它们可能不如MobileNets [14、29、13]和ShuffleNets [40、23]等移动系统模型适合低功耗设备。
5.结论
我们提出了RepVGG,这是一个简单的体系结构,具有3*3 conv和ReLU的堆栈,这使其特别适用于GPU和专用推理芯片。通过我们的结构重新参数化方法,这样一个简单的Con-vNet在ImageNet上达到了80%的top-1精度,并且与最新的复杂模型相比,显示了良好的速度精度折衷。