结构重参数化卷积

结构重参数化卷积

VGG网络是2014年由牛津大学著名研究组VGG (Visual Geometry Group) 提出的。在2014到2016年(ResNet提出之前),VGG网络可以说是当时最火并被广泛应用的Backbone。后面由于各种新的网络提出,论精度VGG比不上ResNet,论速度和参数数量VGG比不过MobileNet等轻量级网络,慢慢的VGG开始淡出人们的视线。当VGG已经被大家遗忘时,2021年清华大学、旷视科技以及香港科技大学等机构共同提出了RepVGG网络,希望能够让VGG-style网络Great Again。

在这里插入图片描述

在论文的摘要中,作者提到了structural re-parameterization technique方法,即结构重参数化

图(B)表示RepVGG训练时所采用的网络结构,而在推理时采用图(C)的网络结构。关于如何将图(B)转换到图(C)以及为什么要这么做是学习结构重参数化所研究的问题。

在这里插入图片描述

RepVGG Block解析

在这里插入图片描述
RepVGG整个模型,就是在不断堆叠RepVGG Block主要学习的是步距为1的第二种情况可以看到训练时RepVGG Block并行了三个分支:一个卷积核大小为3x3的主分支,一个卷积核大小为1x1的shortcut分支以及一个只连了BN的shortcut分支。

采用多分支训练

并行多个分支一般能够增加模型的表征能力。在使用单路结构时(不使用其他任何分支)Acc大概为72.39,在加上Identity branch以及1x1 branch后Acc达到了75.14。
在这里插入图片描述

采用单路模型推理

采用单路模型会更快、更省内存并且更加的灵活。

  • 更快:主要是考虑到模型在推理时硬件计算的并行程度以及MAC(memory access cost),对于多分支模型,硬件需要分别计算每个分支的结果,有的分支计算的快,有的分支计算的慢,而计算快的分支计算完后只能干等着,等其他分支都计算完后才能做进一步融合,这样会导致硬件算力不能充分利用,或者说并行度不够高。而且每个分支都需要去访问一次内存,计算完后还需要将计算结果存入内存(不断地访问和写入内存会在IO上浪费很多时间)。

  • 更省内存:在论文的图3当中,作者举了个例子,如图(A)所示的Residual模块,假设卷积层不改变channel的数量,那么在主分支和shortcut分支上都要保存各自的特征图或者称Activation,那么在add操作前占用的内存大概是输入Activation的两倍,而图(B)的Plain结构占用内存始终不变。

在这里插入图片描述

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

结构重参数化

将训练好的RepVGG Block转成推理时的模型结构,即structural re-parameterization technique过程。 根据论文中的图4(左侧)可以看到,结构重参数化主要分为两步。

  • 第一步主要是将Conv2d算子和BN算子融合以及将只有BN的分支转换成一个Conv2d算子。
  • 第二步将每个分支上的3x3卷积层融合成一个卷积层。

在这里插入图片描述

融合Conv2d和BN

因为Conv2d和BN两个算子都是做线性运算,所以可以融合成一个算子。

说明第i个通道上的BN层操作:对于特征图第i个通道BN的计算公式如下

y i = x i − μ i σ i 2 + ϵ ⋅ γ i + β i y_{i}=\frac{x_{i}-\mu_{i}}{\sqrt{\sigma_{i}^{2}+\epsilon}} \cdot \gamma_{i}+\beta_{i} yi=σi2+ϵ xiμiγi+βi

作者给出了转换公式(对于通道i),其中M 代表输入BN层的特征图(Activation).

bn ⁡ ( M , μ , σ , γ , β ) : : i , : , : = ( M : , i , : , : − μ i ) γ i σ i + β i \operatorname{bn}(\mathrm{M}, \mu, \sigma, \gamma, \beta)_{:: \mathrm{i},:,:}=\left(\mathrm{M}_{:, \mathrm{i},:,:}-\mu_{\mathrm{i}}\right) \frac{\gamma_{\mathrm{i}}}{\sigma_{\mathrm{i}}}+\beta_{\mathrm{i}} bn(M,μ,σ,γ,β)::i,:,:=(M:,i,:,:μi)σiγi+βi

所以转换后新的卷积层权重计算公式为(对于第i个卷积核),W ′和b ′ 是新的权重和偏执:

W i , : , : , : ′ = γ i σ i W i , : , : , : , , b i ′ = β i − μ i γ i σ i \mathrm{W}_{\mathrm{i},:,:,:}^{\prime}=\frac{\gamma_{\mathrm{i}}}{\sigma_{\mathrm{i}}} \mathrm{W}_{\mathrm{i},:,:,:,}, \quad \mathrm{b}_{\mathrm{i}}^{\prime}=\beta_{\mathrm{i}}-\frac{\mu_{\mathrm{i}} \gamma_{\mathrm{i}}}{\sigma_{\mathrm{i}}} Wi,:,:,:=σiγiWi,:,:,:,,bi=βiσiμiγi

最后经过融合之后可以表示为下面的形式:

bn ⁡ ( M ∗   W , μ , σ , γ , β ) : , i , : : : = ( M ∗   W ′ ) : , i , : : : + b i ′ \operatorname{bn}(\mathrm{M} * \mathrm{~W}, \boldsymbol{\mu}, \boldsymbol{\sigma}, \boldsymbol{\gamma}, \boldsymbol{\beta})_{:, i,:::}=\left(\mathrm{M} * \mathrm{~W}^{\prime}\right)_{:, i,:::}+\mathbf{b}_{i}^{\prime} bn(M W,μ,σ,γ,β):,i,:::=(M W):,i,:::+bi

论文中原来的公式可能不那么好理解,下面给出一种更为简单直观的定义形式

f ^ i , j = W B N ⋅ ( W conv  ⋅ f i , j + b conv  ) + b B N \hat{\mathbf{f}}_{i, j}={\mathbf{W}_{B N}} \cdot\left({\mathbf{W}_{\text {conv }}} \cdot \mathbf{f}_{i, j}+{\mathbf{b}_{\text {conv }}}\right)+{\mathbf{b}_{B N}} f^i,j=WBN(Wconv fi,j+bconv )+bBN

  • 将Wbn乘进去化简可以得到融合之后的权重和偏置。

w e i g h t s : W = W B N ⋅ W conv  weights: \mathbf{W}=\mathbf{W}_{B N} \cdot \mathbf{W}_{\text {conv }} weights:W=WBNWconv 

b i a s : b = W B N ⋅ b c o n v + b B N bias: \mathbf{b}=\mathbf{W}_{B N} \cdot \mathbf{b}_{c o n v}+\mathbf{b}_{B N} bias:b=WBNbconv+bBN

1x1转为3x3进行融合

如下图所示,以1x1卷积层中某一个卷积核为例,只需在原来权重周围补一圈零就行了,这样就变成了3x3的卷积层,注意为了保证输入输出特征图高宽不变,此时需要将padding设置成1(原来卷积核大小为1x1padding为0)。

在这里插入图片描述

BN转换成3x3卷积

对于只有BN的分支由于没有卷积层,所以我们可以先自己构建出一个卷积层来。如下图所示,构建了一个3x3的卷积层,该卷积层只做了恒等映射,即输入输出特征图不变。

在这里插入图片描述

最后通过一个add相加的操作完成结构重参数化的过程。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值