RepVGG

前言

相比于之前的vgg网络提出了结构重参数化。

结构重参数化技术

在训练的时候采用图b的形式
推理采用图C

RepVGG Block详解

training mode

为什么训练时要采用多分支结构 ?

增加模型的表征能力

为什么推理时要将多分支模型转换成单路模型 ?

1更快
2省内存
3更加灵活
从并行度(计算设备的利用率)的角度看
MAC内存访问成本
残差结构后面需要有一个相加的操作 所以最开始的输入 x 占用内存 要一直保留 直到 相加操作完成
第二个结构是类似于直接在 x上 进行运算 从始至终占用  记得之前代码里有一个 (inpalce=true)

结构重参数化

减少参数
加速推理

公式

结构重参数化-融合Conv2d和BN

结构重参数化-将1x1卷积转换成3x3卷积

结构重参数化-将BN转换成3x3卷积

结构重参数化-多分支融合

第一项对应的是我们第一个block上对应的输出(3*3卷积的计算),i对应的是我们输入的特征图,k1对应的是3*3卷积层他的kernel的应该去权重,B1对应的它的偏置。

模型配置

带g表示采用了组卷积group convolution,
但不是所用的卷积层都替换成了组卷积
而是对[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26]这些序号未知数的卷积层给替换成了组卷积
它是从stage2开始数的,并且索引为1

表2:-A,-B的区别
网络的深度方向

表3:由- a 和 -b 定义的 RepVGG 模型。
不同配置的一个详细参数
表中的a,b都是用来控制网络的宽度的。

03-21
### RepVGG 模型概述 RepVGG 是一种基于卷积神经网络 (Convolutional Neural Network, CNN) 的架构,旨在通过简化模型结构来提升推理效率和准确性。其核心思想是在训练阶段采用多路径结构,在部署阶段将这些路径重新参数化为单路径结构[^1]。 #### 训练与部署的核心机制 在训练过程中,RepVGG 使用多个并行的分支(例如 $3 \times 3$ 卷积、$1 \times 1$ 卷积以及恒等映射),以便更好地学习特征表示。然而,在实际部署时,这些多路径会被转换成单一的 $3 \times 3$ 卷积操作,从而减少计算开销并加速推理过程。 以下是 RepVGG 的主要特点: - **高效性**: 推理阶段仅依赖于标准卷积运算,无需额外的操作。 - **灵活性**: 可以轻松适配不同的硬件平台。 - **高性能**: 在 ImageNet 数据集上表现出色,同时具有较低的延迟。 #### 实现细节 下面是一个简单的 PyTorch 实现示例: ```python import torch.nn as nn class RepVGGBlock(nn.Module): def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, groups=1): super(RepVGGBlock, self).__init__() self.in_channels = in_channels self.out_channels = out_channels # 主要的 3x3 卷积 self.conv_3x3 = nn.Conv2d(in_channels, out_channels, kernel_size, stride=stride, padding=padding, groups=groups) # 并行的 1x1 卷积 self.conv_1x1 = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, padding=0, groups=groups) # 如果步幅大于1,则添加下采样层 if stride != 1 or in_channels != out_channels: self.downsample = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride) else: self.downsample = None def forward(self, x): identity = x out = self.conv_3x3(x) + self.conv_1x1(x) if self.downsample is not None: identity = self.downsample(identity) return out + identity def repvgg_model(deploy=False): layers = [] for i in range(4): # 假设我们有四层 layer = RepVGGBlock(64, 64) layers.append(layer) return nn.Sequential(*layers) ``` 上述代码定义了一个基本的 RepVGG 模块,并展示了如何构建一个多层网络。 #### 应用场景 RepVGG 不仅适用于图像分类任务,还可以扩展到其他领域,比如目标检测和语义分割。例如,可以将其作为骨干网络嵌入 YOLO 或 Faster R-CNN 中,进一步优化性能[^2]。 此外,与其他重参数化技术相比(如 OREPA 提出的方法),RepVGG 更加注重平衡精度与速度之间的关系[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值