122、Neck 中 Concat 改为加权 Concat 的代码实现:让网络自己学习融合权重
122、Neck 中 Concat 改为加权 Concat 的代码实现:让网络自己学习融合权重从一个让我头疼的调试问题说起去年做某个工业缺陷检测项目,模型在YOLOv8基础上改,Neck部分用了标准的Concat拼接。训练时发现一个诡异现象:浅层特征和深层特征拼接后,浅层特征几乎被深层特征“淹没”了——可视化特征图时,浅层那半张图基本是平的,梯度也小得可怜。当时我第一反应是BN层参数没调好,折腾了两天,最后发现是拼接方式太“暴力”了。标准Concat就是通道维度上直接堆叠,网络被迫接受“所有输入通道同等重要”的假设。但实际场景中,不同层级的特征语义不同,重要性天然就不一样。比如小目标检测时浅层细节更重要,大目标时深层语义更关键。让网络自己学一个权重来调节融合比例,这个想法其实很朴素,但实现起来有几个坑。加权Concat的核心思路不搞花里胡哨的注意力机制,就是给每个输入特征图分配一个可学习的标量权重,然后做加权求和。注意这里不是通道注意力那种逐通道的,而是逐特征图的——每个输入分支一个权重。数学上很简单:假设有N个输入特征图 (F_1, F_2, …, F_N),学习N个可训练参数 (w_1, w_2, …, w_N),输出为:[Output = \sum_{i=1}^{N} w_i \cdot F_i]但直接这么写会出问题,后面说。代码实现:从