卷积模块结构re-parameterization

re-parameterization

1. ACNet

ACNet博客介绍 https://zhuanlan.zhihu.com/p/131282789

就是 3x3, 1x3, 3x1 3个卷积核在推理阶段融合为1个3x3卷积核。
在实际使用的时候注意,并不是先将每个分支卷积核融合 再进行BN,而是先 每个卷积核都有自己的BN 然后与BN融合后, 再进行每个分支卷积核融合。 后者比前者效果更好,虽然前者也比直接训练一个3x3要好。后者如下图:

在这里插入图片描述

也就是分支里面有BN (BN in branch):
结果如下:
在这里插入图片描述

2. repVGG

训练的时候多分支,推理的时候单分支。借鉴了resnet多分支结构
在这里插入图片描述

2.1 3x3卷积很简单也有一些优势:

  1. 速度快:其核心思想是:通过结构重参数化思想,让训练网络的多路结构(多分支模型训练时的优势——性能高)转换为推理网络的单路结构(模型推理时的好处——速度快、省内存)),结构中均为3x3的卷积核,同时,计算库(如CuDNN,Intel MKL)和硬件针对3x3卷积有深度的优化
    从下表就就可以看出,在相同channels、input_size和batchsize条件下,不同卷积核的FLOPs和TFLOPs和用时,可以看出,3x3卷积非常快。在GPU上,3x3卷积的计算密度(理论运算量(Theoretical FLOPs ÷ Time usage)除以所用时间)可达1x1和5x5卷积的4倍。
    在这里插入图片描述

  2. 单分支降低显存:多路结构需要保存中间结果,显存占有量会明显增高,只有到多路融合时,显存会会降低。单路结构会占有更少的内存,因为不需要保存其中间结果,同时,单路架构非常快,因为并行度高。同样的计算量,大而整的运算效率远超小而碎的运算。

2.2 那么如何合并多分支为单分支呢?

参考博客:https://zhuanlan.zhihu.com/p/353697121
在这里插入图片描述

首先是卷积层与BN层融合:(每个branch都跟着BN层的)
在这里插入图片描述

然后 就是利用卷积可加性原理,将三个分支的卷积层和bias对应相加组成最终一个conv3x3的形式即可。
https://zhuanlan.zhihu.com/p/353697121 示意图很清晰。

相关博客介绍的系统且详细:https://github.com/HarleysZhang/cv_note/blob/master/7-model_compression/%E8%BD%BB%E9%87%8F%E7%BA%A7%E7%BD%91%E7%BB%9C%E8%AE%BA%E6%96%87%E8%A7%A3%E6%9E%90/RepVGG%E8%AE%BA%E6%96%87%E8%AF%A6%E8%A7%A3.md

3. ecbsr

之前文章有介绍过:
在这里插入图片描述

4. Make RepVGG Greater Again: A Quantization-aware Approach

重参数化的网络为什么 量化困难, 在推理的时候仍然是单分支网络,但是单分支网络是通过多分支网络重参数化得到的,这样多分支结构以及合并 会是 数字的动态范围变大,因此量化困难。 数字范围越大,量化会越差,这个应该很好理解。

更具体的原因:
Then we make detailed analysis of the root causes for the failure and reveal that two factors incurs this issue: the loss design enlarges the variance of activation and the structural design of RepVGG is prone to producing uncontrolled outlier weights.
1个是损失函数设计 促使激活层 的方差变大
2是repVGG的结构易于产生 离群点。

如果想要量化有友好:
需要 weight 和 activation(feature map) 都方便量化.

因此作者从损失函数的设计和rep结构设计 2方面入手,使整体网络量化后精度损失更小。
在这里插入图片描述

参考:https://blog.csdn.net/CV_Autobot/article/details/128246405

5. Diverse Branch Block (DBB) (CVPR-2021)

在这里插入图片描述

6. Online Convolutional Re-parameterization

https://blog.csdn.net/u014546828/article/details/124893682
结构重参数化的目的是在不引入任何推理时间为代价的情况下提高深度模型的性能。
虽然这种模型在推理过程中效率很高,但它严重依赖于复杂的训练时间块来获得较高的精度,导致了大量的额外训练成本。
本文提出了一种两阶段的在线卷积重参数化 (OREPA) 方法,旨在通过将复杂的训练时间块压缩成单个卷积来减少巨大的训练开销。
在这里插入图片描述

https://zhuanlan.zhihu.com/p/537076819
在ECBSR中我们已经见识到 结构重参数化技术 带来的性能提升,而且不会增加推理时间。
但是会增加训练的时间。
本文主要解决在训练的时候 提高训练速度的问题。

6.1 替换norm

训练的时候每个分支一般含有BN层,直接去掉(或者像推理那样合并)会影响性能,因此作者用scaling layer 替换。
具体步骤如下图:
在这里插入图片描述

这样解决了block linearization的问题。

6.2 压缩合并

接下来如何 合并压缩呢?一般线性层合并 主要有2中:串联和并联
在这里插入图片描述

另外就是 depth-wise convolution, average pooling, and the proposed linear scaling 这些线性层也都可以转化为卷积层。

以上都是重参数化的相关知识。
如果同样压缩合并,那么不就变成和infer一样了吗。结构变简单,训练还会有提升吗?其实并不是这里训练的时候的压缩,并不是压缩为1个卷积,而是将 多个kernel 分别与feature 卷积后合并 转换为 多个卷积kernel 之间先合并后 再与feature map卷积。实际上把中间特征映射上的操作(卷积,加法)转换成卷积核上的操作,这些步骤在训练过程中,而不是像推理的时候那样直接得到合并后的结果。

这样操作相比原来会有性能降低吗?好像确实会有一点:
第一行不进行重参数化
第二行DBB的方法进行重参数化,训练时间肯定会增加,但是性能提升(一般结构重参数化的特定)
第三行利用本文提出的方法kernel fusion 进行训练,训练时间肯定会减少(因为 原来对feature map上的卷积后 再合并 转化为 先将 kernel(无论并联还是串联)进行合并再卷积), 但是性能略有下降,下降的很少。
第4,5,6,7行作者 丰富了重参数化结构块性能有提升。
在这里插入图片描述

6.3 作者提出的新的block

在这里插入图片描述

实验对比其他重参数化技术方法:
主要看精度 和 训练时间:
dbb肯定精度提升,训练时间加大
opera本文精度提升,训练时间略微加大, 符合预期
在这里插入图片描述

7. Edge-enhanced Feature Distillation Network for Efficient Super-Resolution

承接 repVGG, DBB, ECBSR:
在这里插入图片描述

8 winograd 算法

https://medium.com/@dmangla3/understanding-winograd-fast-convolution-a75458744ff

首先将卷积转化为 矩阵相乘,
然后矩阵相乘可以 再简化计算量。

oneDNN (以前的intel MKL-DNN):https://oneapi-src.github.io/oneDNN/index.html
https://github.com/oneapi-src/oneDNN

openmp教程:https://lemon-412.github.io/imgs/20200516OpenMP_simple_Program.pdf
https://blog.csdn.net/qq_37389133/article/details/130484512

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值