我在<Kaggle> <Flower Classification with TPUs>中的解决方案

Intro

  这是我第一次尝试数据科学竞赛。比赛任务是, 使用tensorflow和主办方提供的TPUs训练自己的模型,对104种花朵图像作分类. 主办方提供了最高分辨率为512x512的图像数据集. 在提交测试集结果后,系统采用F1 score进行评分. 在这场playground比赛中,我采用了 data argumention 和 应用多个SOTA模型作ensemble 的技巧, 后期又使用了外部数据, 取得了比较靠前的成绩.

 

Backbone与调参

  我所使用到的SOTA模型--- EfficientNetB7, DenseNet201 . EfficentNetB7选择noisy-student作为预训练权重,在训练时候作全局训练,    DenseNet201选择imagenet作为预训练权重.  ENet在40Epoch左右基本收敛到全局最优, Densenet在30EPOCH左右时候基本收敛到全局最优.  因为是在TPU上训练,batch size设置为了每个单元16, 总共8个单元,也就是全局128的batch size.   另外设置了学习率 callback,实践标明使用lrfn对调参有显著正影响.

 

数据扩充data argumention

  比赛过程中我尝试了多种图像DA手段, 如mixup , cutmix , brightness 等等, 最后基于效果只选用了random flip left right 和random saturation .

  另外将官方提供的验证集合并到训练集中作为训练数据 也是提分必要手段.

 

比赛中遇到的一些问题

  首先是TPU使用超时. 主办方为每个notebook设置了运行上限三小时, 这导致模型训练过程受限, 我采用了保存模型权重到本地,再加载模型权重这种多notebook训练一个模型的方法, model.save_weights() 和model.load_weight()的延时超低, 实践表明这是一个超实用的trick.

  其次是外部数据的实用. 主办方并没有对此做出限制要求. 我使用了多途径的花朵图像数据投入训练, 最终使结果分数有了明显的提升. 

posted @ 2020-05-16 16:30  dynmi  阅读(216)  评论(0编辑  收藏  举报