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。