099、C3k2_Rep:C3k2 与 RepConv 的杂交设计——训练多分支推理单分支的重参数化

发布时间:2026/7/3 9:29:17

099、C3k2_Rep:C3k2 与 RepConv 的杂交设计——训练多分支推理单分支的重参数化 099、C3k2_Rep:C3k2 与 RepConv 的杂交设计——训练多分支推理单分支的重参数化从一次诡异的显存爆炸说起去年秋天调YOLOv11n在T4上做边缘端部署,模型结构改到C3k2模块时,训练显存直接飙到12G,推理却只有4G。当时盯着nvidia-smi看了半小时,心想这不对劲——训练时多出来的8G显存去哪了?后来扒开C3k2的forward代码,发现里面套了三层残差分支加两个并行卷积,训练时所有分支都保留着梯度,而推理时这些分支全被折叠成单路。这不就是典型的“训练时多分支、推理时单分支”场景吗?RepVGG那套重参数化思路正好能解决这个问题——把C3k2里的冗余分支在训练时保留以提升表达能力,推理时合并成单路卷积,既省显存又提速。问题本质:C3k2的结构冗余YOLOv11的C3k2模块长这样:输入先经过一个1x1卷积降维,然后分成两路——一路走常规的3x3卷积堆叠(k=2表示两个Bottleneck),另一路走残差直连。这两路在通道维度拼接后再过1x1卷积。问题在于,训练时每个Bottleneck内部还有残差分支,加上跨模块的shortcut,整个计算图里分支数量呈指数级增长。反向传播时,每个分支都要保留中间激活值,显存自然爆炸。更坑的是,这些分支在推理时对精度贡献并不均衡。我做过实验,把C3k2里第二个Bottleneck的残差分支去掉,mAP只掉了0.3%,但推理速度提升了15%。这说明很多分支是冗余的,但训练时它们确实帮助了梯度流动。RepConv的

相关新闻