AutoDL 图像竞赛调参实验记录

这段时间一直在参与 AutoDL 的图像分类赛道(Auto_Image),线下测试数据全部使用 Pedro 数据集。整体思路是在有限的时间预算内,探索不同 backbone、归一化层、激活函数、精度格式以及预训练权重对最终得分的影响。以下按实验顺序做一个系统整理。

Backbone 选择:ResNet18 vs. ResNet34

第一个问题是 backbone 的选择。从线上数据的走势来看,得分在前期上升很快,这个阶段用 ResNet18 是合理的;后期上升幅度趋于平缓,增量比较小,理论上可以尝试更大的 backbone 或换用不同的 pipeline。

但线下数据的测试结果显示,ResNet34 相比 ResNet18 并没有明显优势。下图左边是 ResNet18,右边是 ResNet34:

差距不显著,暂时维持 ResNet18 作为基准。

激活函数:用 CELU 替代 ReLU

尝试将网络中的 ReLU 全部替换为 CELU。线下数据上两者差不多,CELU 稍差;线上数据的差距则明显扩大,CELU 方案得分反而低了不少。

线下 CELU 结果:

线上对比(左边是新的 baseline,右边是 CELU):

CELU 在这个场景下没有收益,放弃。

归一化层实验

重置所有 BN 层

尝试把预训练模型的所有 Batch Normalization 层重置,期望让统计量更快适配新数据。线下结果显示,重置 BN 之后前期(第一个检查点)效果确实较好,收敛更快,但最终精度并不高。右边是重置 BN 的结果:

线上结果也略低于不重置的 ResNet18 基准:

ResNet34 + 重置所有 BN

将两者组合,期望兼顾更强的 backbone 和更快的早期收敛。线下第一个检查点变慢了很多,推测是系统 IO 不稳定导致的,不作为参考。线上结果是前期速度确实快了很多,但后期精度依旧不够高,目测是 overfit 导致的。

线上测试结果:

Precise Norm(Group Norm)替代 Batch Norm

另一个方向是用 Group Norm(Precise Norm)完全替代 BN:

最终效果不好,不予考虑。

混合精度训练(FP16)

在本地测试了 FP16。结果出乎意料:没有 FP16 的版本(左)反而比开启 FP16(右)更快,同时 FP16 对精度的影响也比较大。

FP16 在当前配置下得不偿失,暂不引入。

其他杂项实验

Scan 循环展开(unroll):将 scan 中的循环展开(unroll=2)测试时间开销,结果没什么用,原始 test scan 时间约 43s,改动意义不大。

加大 batch size:适度加大 bs 会增加一些时间开销,但对稳定性帮助不大——线上不稳定的根本原因还是 overfit,调 bs 治标不治本。

学习率调整:目前还在尝试前期和后期用不同 pipeline 的思路,尚未得出确定结论。

预训练模型:ReID 与行人属性数据集

尝试用行人重识别(ReID)的预训练权重替换 ImageNet 预训练,分别测试了 MSMT 数据集和 Market 数据集的预训练版本。

MSMT 数据集预训练线下结果:

此外还测试了 PA-100K 预训练模型(行人属性识别),线上线下都不好用,试了几个数据集的预训练都不理想。

不同场景下 ImageNet 预训练的适用性

分别在行人、医疗和卫星图像三类场景上测试了 ImageNet 预训练的效果。

卫星图像:

医疗图像:

不同领域差异明显,ImageNet 预训练并不能在所有场景上保持一致的优势。

CV Final 数据集预判

根据目前 feedback 阶段出现的情况,对 final 阶段可能出现的数据集做一个预判:

  • Loukoum(手写体):cv 与 cv2 的 final 都出现过,AutoCLINT 结果很好,不用担心。

  • Tim(通用物体):ImageNet 预训练已经足够。

  • Apollon(行人):已出现在 feedback 阶段。

  • Ideal(航拍/卫星):已出现在 feedback 阶段。

  • Ray(医疗):只出现在 cv 的 final,需要关注。

线上数据 Reshuffle 实验

测试线上数据有无 reshuffle 的影响:

最后,尝试用 self-attention 来处理数据分布问题,结果并不 work。