CNN之结构重参数化
什么是结构重参数化?
- 我们知道模型要变好,就必须构建得更加复杂,但是这来这带来一个坏处,就是模型部署的耗时会增长,这两者是相互矛盾的,结构从参数化就是两者都可以做到,在训练的时候,通过复杂的神经网络去训练,提升模型的性能,但是在推理的时候,我通过对模型结构的重参数化生成了一个更加精简的结构,使推理的时候速度更快
- RepVGG 的结构重参数化过程:上图是左边是训练时的卷积网络,右边通过对结构进行重参数化,得到一个只有 1 个分支的结构,因此可以做到训练时提升性能,推理时提升速度
- 结构从参数化的基本原理:卷积的可加性,对于同一个输入,只要其扫描频率一致(相同的通道数、kernel size、stride、padding),其卷积可过程可以融合。如下公式 1 是一个实数乘特征图和乘卷积是等效的,公式 2卷积核 F1 与 F2 可以被融合为 1 个卷积,卷积核为 (F1+F2)
ACNet 的网络结构?
- 上图左边展示 3 个分支的卷积融合为一个等效卷积的过程;右边是卷积融合的过程,主要包括融合 BN (BN fusion) 和融合分支 (branch fusion)两个步骤
- 融合 BN (BN fusion) :所有 BN 对输入操作一样,不改变输入分辨率,所以利用卷积的线性可加性,将 BN 的过程融合进卷积
- 融合分支 (branch fusion):同样利用卷积的线性可加性,将多分支的卷积融合为 1个卷积
RepVGG 如何进行“结构重参数化”?
- 1.卷积层参数:上图是 REP-VGG 块的结构重参数化过程。为了易于可视化,我们假设 C2 = C1 = 2,因此3×3层具有四个3×3矩阵,而1×1层的核为2×2矩阵
- 2.BN 层参数:(1)可知 BN 层为每个通道的数据进行规范化,每个通道需要 4 个参数 ,输入通道 2 个则有 8 个参数;(2) 当 均为 0 时,规范化后的数据还是原来的值,这可以用于模拟 identity 路径
- 3.融合卷积与 BN 层:(1)最难理解的是虚线红框部分,由原来的 变为 ,也就是单个卷积核由 变为 ,这是通过在 四周补 0 做到的,因为补 0 后得到的卷积和是不变的;(2) 类似 [[ACNet#^udwpgu|ACNet的网络结构]]的过程, 的部分参数用于重构卷积核的值,部分参数组合成卷积的偏置值 ,并且每个通道 1 个值
- 4.利用卷积的可加性,融合多路径:对应同 size 卷积核的,可以利用卷积的可加性,将卷积融合,具体来说是卷积核矩阵对应相加,偏置值对应相加
DBB 的网络结构?
- 参考 [[GoogleNetv1]] 的 Inception block 的概念,结合结构重参数划的理论,设计了 DBB block
- 每个 DBB block 包含 4 个并行的路径,推理时融合成 1 个路径
DBB 的 6 种模块可以等价转为单个卷积?
- Conv-BN 合并:经典的卷积层融合 BN 层的结构
- 并行合并:参考ACNet的网络结构,卷积核可线性相加
- 串行合并:参考ACNet的网络结构,卷积核可线性相加
- 并行拼接:参考ACNet的网络结构,卷积核 kernel size 保持不变,数量是两个分支相加
- 平均池化转换:平均池化很像卷积核的过程,只不过是求和后加平均而已,直接对卷积核的值除 KxK,后面得到的卷积和就是 AVG 后的值了
- 多尺度卷积合并:参考ACNet的网络结构,同一将卷积核扩充为 KxK,再进行融合