Backbone - RepVGG: Making VGG-style ConvNets Great Again

0. 前言

  • 相关资料:
  • 论文基本信息
    • 领域:图像分类
    • 作者单位:清华&旷视科技
    • 发表时间:2021.1
  • 一句话总结:解耦模型训练与模型部署,训练分支模型,经过等价转换变为单路模型,最终部署单路模型

1. 要解决什么问题

  • 先定义下单路结构与分支结构

    • 单路结构,也就是作者所谓的“VGG式”,主要特点是:没有分支结构,只使用3x3卷积,仅使用relu作为激活函数。
    • 分支结构,也就是resnet中提出的skip结构。
  • 现在分支结构几乎成为所有结构的标配,但是,分支结构也存在一些问题:

    • 虽然不怎么增加计算量,但占用显存不少,且降低模型的并行度。
    • 复现较困难且降低了模型推理时的运行速度以及内存利用率。
    • 复杂的分支结构不能很好的支持所有硬件设备。
    • 分支结构中,FLOPs不能很好的反映模型的推理速度。现在最常用的模型中还是包括了VGG以及ResNet
  • 现在backbone的另外一种事先方式是用神经网络搜索,一般也都是用分支结构。

2. 用了什么方法

  • 使用VGG式结构有什么好处(好处基本上都是部署上的)
    • 不存在skip的缺陷,即减少显存占用、提高模型并行能力。显存占用如下图image-20210117192318047
    • 3x3卷积比其他形式卷积的计算效率高,给出了实验结果image-20210117192249520
    • 灵活性高,容易改变各层的宽度
  • 为什么之前VGG式结构用得少、分支结构用得多?(VGG式的缺陷基本上就是在训练上的)
    • 主要认为VGG式性能差。
    • 分支结构产生了大量子模型的隐式ensemble。
  • 本文提出的解决方案
    • 解耦训练和推理的架构
    • 训练一个多分支模型
    • 将多分支模型等价转换为单路模型。
    • 部署单路模型。
  • 那具体如何实现呢
    • 左边是原始ResNet结构
    • 中间是RepVGG训练时使用(每个3x3卷积配上一个1x1卷积,stride为1的都配上skip结构)
    • 右图是转换后的VGG式结构,用于RegVGG模型推理。
    • image-20210117192347257
  • 那从训练网络如何转换为推理网络呢(等价转换如何实现)
    • 1x1卷积以及skip结构其实就是特殊的3x3卷积结构。
    • 卷积的可叠加性(卷积的结构是多个卷积核分别卷积操作然后累加得到的),可以使得 3x3+1x1+skip 合成一个3x3卷积
    • 下图就是一次等价转换的举例:
      • 第一行是转换前的结构,即RegVGG训练结构
      • 第二行是转换后的结构,即RegVGG推理结构
      • 左边是网络结构示意图,右边是参数结构示意图
      • 注意,输入、输出的channel数量都是2
    • image-20210117192856987

3. 效果如何

  • 作者在1080ti上测试的结果非常好:
    • 在公平的训练设定下,同精度的RepVGG速度是ResNet-50的183%,ResNet-101的201%,EfficientNet的259%,RegNet的131%。注意,RepVGG取得超过EfficientNet和RegNet的性能并没有使用任何的NAS或繁重的人工迭代设计。

image-20210117191310372

4. 还存在什么问题&可借鉴之处

  • 不知道对于类似于mobilenet这些对比起来如何,最小的网络不知道用到边缘设备上效果如何。
  • 属于参数多但推理速度快。参数多可能算个缺陷?

猜你喜欢

转载自blog.csdn.net/irving512/article/details/112756394