初赛结束前一个月在Gluon论坛上看到了hetong007的帖子实战阿里天池竞赛——服饰属性标签识别,正好当时并无太多事情要忙,于是下载了代码和数据集,准备小试一下。
两个月后,比赛终于落下帷幕。尽管最后只取得了初赛78,复赛52的成绩,但在比赛的过程中的亲身经历还是让我对于参数的修改,超参的选择和网络结构的选择等诸多内容有了更深的了解。所以准备写个帖子总结一下,方便以后自己回顾,顺便也希望借此能够和大家多多交流。
初赛
赛题介绍
不管是初赛还是复赛,服装属性标签的比赛当中所需要完成的任务共两大类(length和design)八小种,即pant_length,coat_length, skirt_length,sleeve_length,collar_design,neck_design,neckline_design和label_design。尽管对于所有的任务都可以使用相同的模型进行分类,但是由于两大类任务之间存在着明显的不同,因而在初赛中进行了特殊处理。
首先,在离线训练评估的过程中发现,比赛的八种任务在准确率和mAP上存在着显著的差异,具体数据如下所示:
collar_design | neckline_design | neck_design | lapel_design | pant_length | skirt_length | sleeve_length | coat_length |
---|---|---|---|---|---|---|---|
acc | 0.874 | 0.878 | 0.844 | 0.894 | 0.893 | 0.961 | 0.929 |
mAp | 0.889 | 0.888 | 0.864 | 0.915 | 0.902 | 0.966 | 0.929 |
从上表中的数据中可以看出,design相关的任务的准确率和mAP明显要低于length任务的数据,因此在初赛阶段将提高design任务的结果作为了比赛重点。
参数固定
在hetong007的代码当中,其选择了resnet50_v2作为分类的模型,并利用fine tuning进行模型的训练;在之前的kaggle dog breed比赛当中,ypw分享的代码则是选择了将模型的卷积层部分作为特征提取器,对得到的向量训练一个MLP作为分类模型。因此在训练的过程中对卷积层的参数是否进行固定会有差别吗?
试验的结果表明将卷积层的参数固定后进行训练得到的结果会稍好一些。(因忘记记录相关数据,故此处未列出相关具体数据,大约有1%左右的提升。)不管是resnet50_v2还是其他的模型,MXNet当中提供的预训练的模型都是在ImageNet这样的巨型数据集上进行训练的结果,因此其应该学习到了足够多的特征。而本次比赛所使用的服饰数据和ImageNet中的数据差别并非巨大,因此使用预训练的模型并对卷积层参数固定的方式比从头开始学习或者fine tuning的结果都要好。
P.S.然而在其他的数据上,例如医疗相关的数据,采用此种方式是否能够得到类似的结果暂未可知。、
P.P.S.在通过设定卷积层参数梯度为null后进行训练的过程中发现,似乎此种方式训练的速度更快。大概MXNet对此进行了优化。既然卷积层参数的梯度被设定为null,那么在反向传播的过程中卷积层的梯度即无需计算卷积层的参数梯度。
外部数据
在使用MXNet提供的预训练模型之前曾尝试过使用外部数据帮助训练。最初的设想为,既然使用在ImageNet上预训练的模型能够很好的提取相关特征,那么使用服饰相关的数据集训练一个模型,并在此模型的基础上进行固定卷积层参数训练是否会更好呢?于是选择了使用DeepFashion当中的数据对resnet50_v2等模型进行训练,并在其基础上进行FashionAI模型的训练。
但是最终的结果表明,个人训练得到的模型性能不如MXNet提供的预训练模型。我个人的猜测,一方