ResNext和resnet区别 resnet和vgg_卷积核

 2021年清华,旷视科技,香港科技的大学提出了RepVGG,正片文章的亮点是结构重参数化。

ResNext和resnet区别 resnet和vgg_卷积_02

VGG 2014年牛津大学研究组VGG提出,2014年到2016年(resnet提出),是广泛使用的backbone(主脊椎)。

我们所说的“VGG”指的是:

1. 没有任何分支结构。即通常所说的plain或feed-forward架构。

2. 仅使用3x3卷积。

3. 仅使用ReLU作为激活函数。

不过之后随着网络的发展论精度比不上resnet,论速度比不上mobilenet,最后淡出视野。


结构重参数化(structural re-parameterization technique):可以理解为训练和测试时使用的网络结构不同,这样能增加训练时候的特征提取,也能减少测试时候的推理时间。

相比于各种多分支架构(如ResNet,Inception,DenseNet,各种NAS架构),近年来VGG式模型鲜有关注,主要自然是因为性能差。例如,有研究[1]认为,ResNet性能好的一种解释是ResNet的分支结构(shortcut)产生了一个大量子模型的隐式ensemble(因为每遇到一次分支,总的路径就变成两倍),单路架构显然不具备这种特点。

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

1. 训练一个模型

2. 部署这个模型

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

1. 训练一个多分支模型

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

3. 部署单路模型

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

ResNext和resnet区别 resnet和vgg_卷积核_03

当我们训练的时候使用b结构,

当我们真正预测的时候就是用c结构

如果对模型优化部署有了解就会发现这和做网络图优化,或者说算子融合非常相似。

在堆叠RepVGG Block时,下图中是Block的一些细节,左边的结构式strides=2做下采样的RepVGG使用到的结构,右边是正常的strides=1时正常的RepVGG block结构。

ResNext和resnet区别 resnet和vgg_ResNext和resnet区别_04

在论文的表6中,作者也做了个简单的消融实验,在使用单路结构时(不使用其他任何分支)Acc大概为72.39,在加上Identity branch以及1x1 branch后Acc达到了75.14。

为什么在RepNet中作者推理时要将多分枝模型转换成为单路模型。原因是采用单路模型会更快,更胜内存并且更加的灵活。

其实除此之外,在多分支转化成单路模型后很多算子进行了融合(比如Conv2d和BN融合),使得计算量变小了,而且算子减少后启动kernel的次数也减少了(比如在GPU中,每次执行一个算子就要启动一次kernel,启动kernel也需要消耗时间)。而且现在的硬件一般对3x3的卷积操作做了大量的优化,转成单路模型后采用的都是3x3卷积,这样也能进一步加速推理。



如何将训练好的RepNet Block转成推理时的模型结构,即re-parameterization过程。

主要分为两步,第一步主要是将Conv2d算子和BN算子融合以及将只有BN的分支转换成一个Conv2d算子,第二步将每个分支上的3x3卷积层融合成一个卷积层。关于参数具体融合的过程可以看图中右侧的部分。

ResNext和resnet区别 resnet和vgg_人工智能_05

第一部分: 

主要就是BN的计算可以融合到conv层,因为之前的我们的卷积层时不加偏置的(1),对于kernel元素的大小也不进行处理(2).

  1. 加上偏置的话,省去了BN层计算的第二个位置上的参数
  2. 对kernel元素进行一个权重相乘,省去了BN层里面的第一个参数
  3. 注意,这里的两个参数时常数,不变的。

ResNext和resnet区别 resnet和vgg_卷积_06

ResNext和resnet区别 resnet和vgg_2d_07

ResNext和resnet区别 resnet和vgg_2d_08

ResNext和resnet区别 resnet和vgg_卷积核_09

ResNext和resnet区别 resnet和vgg_2d_10

转化后新卷积层只需在对应第i个卷积核的权重上乘以左边的常数项,

 系数即可,对应第i个卷积核新的偏执就等于右边的常数项(因为之前采用Conv2d+BN的组合中Conv2d默认是不采用偏执的或者说偏执为零)。

 第二部分:

第二部分的re-parameterization

将1x1的卷积转换为3x3的卷积,将大小为1的kernel,padding一圈0,就变成3大小,

ResNext和resnet区别 resnet和vgg_ResNext和resnet区别_11

注意的是,当我们kernel=1的时候特征图不pad,kernel为3大小时,特征图pad1,保持kernel改变前后输出的feature map不变。

把1x1的卷积变成3x3的卷积然后再与BN层融合

 第三部分:

将BN层转化为3x3 的卷积。所以我们可以先自己构建出一个卷积层来。如下图所示,构建了一个3x3的卷积层,该卷积层只做了恒等映射,即输入输出特征图不变(跳过BN处理)。由于我们的前后的feature map数量不变,channel不变,我们需要2个卷积核,每个卷积核的通道个数为2(图中举例)。

 

ResNext和resnet区别 resnet和vgg_卷积_12

第四部分:

第四部分多分支融合,将多分支3x3卷积转换成为一个单路的3x3卷积层。

ResNext和resnet区别 resnet和vgg_ResNext和resnet区别_13

ResNext和resnet区别 resnet和vgg_ResNext和resnet区别_14