随笔

最近在和同学一起做阿里天池的服装属性识别的竞赛,训了几个不同架构的分类网络,然后手动融合了一下结果。但是感觉黔驴技穷,不知道该怎么提升了。所以今天跟实验室的Kaggle大神师兄讨教了一下,学到了很多做比赛的经验,在此记录。

两层学习

之前我们做模型结果的融合都是拿几个模型的结果傻乎乎的手动加权平均,或者根据验证集的精度来手动调。效率很低不说,每天提交的次数还很宝贵。

事实上,这个模型融合的过程完全可以自动去学习,即再构建一个回归器。假设现在有五个模型需要融合,我只需要把它们各自在验证集上的输出结果保存下来,作为回归器的输入特征,然后就可以利用验证集的label去训练回归器的参数,使得各个模型的融合权重最优化。

更多的网络结构

要尝试使用更多的网络结构,vgg19_bn、resnet、densenet、inception-v3、inception-resnet、mobilenet等等。在数据集较小的情况下更要通过增加模型数量来减少过拟合。

数据泄露分析

要分析敏感数据,比如在服装分类任务里,假设有纯白的背景服装更容易分错,或者预测概率不够confident,我们就可以针对性的做出调整,修改网络或者数据预处理。数据泄露分析需要大量的工作,但是可能只有很少的策略会比较有效。(补充)

交叉验证

错误分析

模型预训练

之前做一个航拍图像的caption任务时,曾利用一个额外的遥感图像分类数据集fMoW对基于ImageNet预训练的卷积神经网络(主要是densenet161和resnet152)进行了初步的finetune,想让它通过遥感目标的分类任务来让卷积层关注到更多遥感图像独有的特征。接着在遥感caption数据集上进行训练。结果表明,在遥感图像上预训练的模型指标全面优于没有预训练的模型。

这次做天池的比赛,也抱着相同的想法,找到了一个服装分类的数据集DeepFashion,可是在其上预训练CNN之后发现结果不升反降。可见这种做法并非可以直接照搬的,还是需要分析两个数据集的分布是否有足够的相似性。(目前还需要再找找模型退化的原因)