1,加模块前先把baseline摸透别上来就塞模块,先确认baseline是不是真的训练到位了,把loss跑到基本不降、验证集指标稳定,再谈优化。然后可以用tensorboard可视化特征图,看看是浅层特征不够、深层语义有问题,还是信息冗余,找准瓶颈再动手。之前有人觉得小物体检测不行想加attention,结果是浅层特征丢太多,加个FPN就解决了,诊断可比盲目加模块重要多了。
2,模块位置选对才管用位置比模块本身还关键,优先从浅层或输出端试,比如特征提取后加注意力,或者在head部分改动,不要轻易动backbone的预训练权重,不然又要重新训很久。不同模块有适配位置,比如SE block放residual block末尾,想增强细节加浅层,全局建模选bottleneck位置。不确定就做ablation study,把模块插在不同位置试,有时候简单1x1卷积找对位置都能涨点。
3,模块要跟数据、任务匹配小数据集别加复杂模块,不然肯定过拟合,选SE、ECA这种参数少的轻量化模块就够了。数据量上万可以稍微放开,但要盯着验证集,gap大了就收手。任务也要对上,分类用channel attention更管用,检测分割离不开spatial attention。数据集尺度变化大就加multi-scale模块,背景复杂就用contextual modeling模块。
4,控制参数量+注意训练细节加模块别光想涨点,先用thop库算FLOPs和params,别让参数翻倍导致训不动或推理慢。可以用depthwise separable convolution替换普通卷积,或者用bottleneck降维。另外,新模块要单独设2-10倍学习率,毕竟是随机初始化,跟预训练的backbone学习速度不一样,还得用kaiming初始化卷积层、BN层weight设1 bias设0,避免loss nan或带崩整体。
5,必做消融实验验效果加模块的目的是涨点,不是堆复杂度。一次只加一个模块,记录指标变化,之后单独拿掉这个模块跑一次,看真实贡献。有时候花大力气加的复杂模块,贡献才0.2个点,还不如数据清洗或调增强性价比高。也别盲目组合模块,可能单独用都涨点,放一起反而掉点,要找最优搭配。


