首页 > 编程知识 正文

sota结果(Z变换卷积和定理)

时间:2023-05-04 21:16:56 阅读:95480 作者:4364

作者: ngdkn

本文已经经作者许可转载。

链接: https://zhuan LAN.zhi Hu.com/p/344324470

2020年b站的年度弹幕是“爷青回”。 一定有很多让你感到“爷爷的青春回来了”的瞬间。 还记得在这个卷积网络各种超参都精确到小数点后三位的时代,五六年前的田园时代,堆几个卷积层就会上升一点的喜悦吗?

我们最近的工作RepVGG,在structural re-parameterization (中实现了VGG式单程微型架构,一路3x3卷到最后,在速度和性能上都达到了SOTA水平,在ImageNet中达到了80%,

不用NAS,不用attention,不用各种新颖的激活函数,甚至不用分支结构,只用3x3卷积和ReLU能达到SOTA性能吗?

开源训练模型和代码(PyTorch版)两天就300 star了,模型下载了几百次,根据同行的反馈在实际业务中效果很好。

太长不看版

方法有多简单? 下午5点读完文章,晚饭前可以写代码开始训练,第二天就可以看到结果了。 如果没有时间读完这篇文章,点击下面的代码,读前100行就完全明白了。

在359 github.com/ding小说/repvgg/blob/main/repvgg.py以下详细说明。

模型定义

我们所说的“VGG式”是指以下内容。

1 .没有分支结构。 是所谓的plain或前馈体系结构。

仅使用2.3x3卷积。

仅将ReLU用作激活函数。

用一句话说明RepVGG模型的基本体系结构。 将20多层3x3卷积重叠,分为5个stage。 每个阶段的第一层是stride=2的降采样,每个卷积层使用ReLU作为激活函数。

再用一句话介绍RepVGG模型的详细结构。 RepVGG-A的五个阶段分别具有[ 1,2,4,14,1 ]层,RepVGG-B的五个阶段分别具有[ 1,4,6,16,1 ]层,宽度为[ 64,16 ]

再来一句话介绍一下训练设定。 在ImageNet上不用120 epochs、trick,甚至可以直接用PyTorch公式例的训练代码进行训练!

为什么要设计这样极其简单的模型呢? 这样简单的手工设计模型是怎么在ImageNet上达到SOTA水平的?

为什么要用VGG式模型

除了我们相信简单是美丽的外,VGG式最小模型还有至少五个现实的优点(详见论文)。

1. 3x3卷积非常快。 在GPU中,3x3卷积的计算密度(理论运算量除以使用时间的值)将达到1x1和5x5卷积的4倍。

2 .因为单向通行的架构非常快,并行度很高。 即使计算量相同,“大而整齐”的运算也比“小而破碎”的运算效率高得多。

3.1通过导轨体系结构节省内存。 例如,ResNet的shortcut不占计算量,但增加了两倍的存储器占有量。

4 .单向通行的框架灵活性高,容易改变各层的宽度(例如剪枝)。

5. RepVGG本体部分只有一种运算符。 3x3卷积连接ReLU。 在设计专用芯片时,如果指定芯片的大小和成本,则集成大量的3x3卷积-ReLU计算单元会很高

效率。别忘了,单路架构省内存的特性也可以帮我们少做存储单元。

结构重参数化让VGG再次伟大

相比于各种多分支架构(如ResNet,Inception,DenseNet,各种NAS架构),近年来VGG式模型鲜有关注,主要自然是因为性能差。

例如,有研究[1]认为,ResNet性能好的一种解释是ResNet的分支结构(shortcut)产生了一个大量子模型的隐式ensemble(因为每遇到一次分支,总的路径就变成两倍),单路架构显然不具备这种特点。

既然多分支架构是对训练有益的,而我们想要部署的模型是单路架构,我们提出解耦训练时和推理时架构。我们通常使用模型的方式是:

1. 训练一个模型

2. 部署这个模型

但在这里,我们提出一个新的做法:

1. 训练一个多分支模型

2. 将多分支模型等价转换为单路模型

3. 部署单路模型

这样就可以同时利用多分支模型训练时的优势(性能高)和单路模型推理时的好处(速度快、省内存)。这里的关键显然在于这种多分支模型的构造形式和转换的方式。

我们的实现方式是在训练时,为每一个3x3卷积层添加平行的1x1卷积分支和恒等映射分支,构成一个RepVGG Block。这种设计是借鉴ResNet的做法,区别在于ResNet是每隔两层或三层加一分支,而我们是每层都加。

训练完成后,我们对模型做等价转换,得到部署模型。这一转换也非常简单,因为1x1卷积是一个特殊(卷积核中有很多0)的3x3卷积,而恒等映射是一个特殊(以单位矩阵为卷积核)的1x1卷积!根据卷积的线性(具体来说是可加性),每个RepVGG Block的三个分支可以合并为一个3x3卷积。

下图描述了这一转换过程。在这一示例中,输入和输出通道都是2,故3x3卷积的参数是4个3x3矩阵,1x1卷积的参数是一个2x2矩阵。注意三个分支都有BN(batch normalization)层,其参数包括累积得到的均值及标准差和学得的缩放因子及bias。

这并不会妨碍转换的可行性,因为推理时的卷积层和其后的BN层可以等价转换为一个带bias的卷积层(也就是通常所谓的“吸BN”)。

对三分支分别“吸BN”之后(注意恒等映射可以看成一个“卷积层”,其参数是一个2x2单位矩阵!),将得到的1x1卷积核用0给pad成3x3。最后,三分支得到的卷积核和bias分别相加即可。

这样,每个RepVGG Block转换前后的输出完全相同,因而训练好的模型可以等价转换为只有3x3卷积的单路模型。

从这一转换过程中,我们看到了“结构重参数化”的实质:训练时的结构对应一组参数,推理时我们想要的结构对应另一组参数;只要能把前者的参数等价转换为后者,就可以将前者的结构等价转换为后者。

实验结果

在1080Ti上测试,RepVGG模型的速度-精度相当出色。在公平的训练设定下,同精度的RepVGG速度是ResNet-50的183%,ResNet-101的201%,EfficientNet的259%,RegNet的131%。

注意,RepVGG取得超过EfficientNet和RegNet的性能并没有使用任何的NAS或繁重的人工迭代设计。

这也说明,在不同的架构之间用FLOPs来衡量其真实速度是欠妥的。例如,RepVGG-B2的FLOPs是EfficientNet-B3的10倍,但1080Ti上的速度是后者的2倍,这说明前者的计算密度是后者的20余倍。

在Cityscapes上的语义分割实验表明,在速度更快的情况下,RepVGG模型比ResNet系列高约1%到1.7%的mIoU,或在mIoU高0.37%的情况下速度快62%。

另外一系列ablation studies和对比实验表明,结构重参数化是RepVGG模型性能出色的关键(详见论文)。

最后需要注明的是,RepVGG是为GPU和专用硬件设计的高效模型,追求高速度、省内存,较少关注参数量和理论计算量。在低算力设备上,可能不如MobileNet和ShuffleNet系列适用。

论文地址:

https://arxiv.org/abs/2101.03697

开源预训练模型和代码(PyTorch版):

https://github.com/DingXiaoH/RepVGG

(MegEngine版):

https://github.com/megvii-model/RepVGG

参考文献:

[1] Andreas Veit, Michael J Wilber, and Serge Belongie. Residual networks behave like ensembles of relatively shallow networks. In Advances in neural information processing systems, pages 550–558, 2016. 2, 4, 8

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