街景字符编码识别之模型集成

点赞再看,养成习惯!觉得不过瘾的童鞋,欢迎关注公众号《机器学习算法工程师》,有非常多大神的干货文章可供学习噢…

前言

模型集成,一般会在比赛后期用到,各种堆特征、模型等,一般对精度地提升不会太大(+2%左右),所以小编不是特别想深入下去,不过像XGBoost这样地有理论支撑的集成模型值得深究,有机会单独写一篇文章。DW组织给的学习资料主要包括三方面的内容:集成学习方法、深度学习中的集成学习和结果后处理思路。

正文

集成学习方法

常见的集成学习方法有Stacking、Bagging和Boosting。像著名的XGBoost就使用上了Bagging和Boosting策略。一般比较简单也比较直观的集成学习方法,就是Bagging了,比如对于回归问题,训练出的多个模型预测的结果采用平均法,得到最终的结果;对于分类问题,则是采用投票法。

深度学习中的集成学习

小编比较熟悉的是丢弃法(Dropout)与测试集数据扩增(Test Time Augmentation,简称TTA),像Snapshot并没有用过。

  1. Dropout
    原本是用来防止DL模型过拟合的Trick。更详细的资料见参考文献处。
  2. TTA
    数据扩增不仅可以在训练时候用,而且可以同样在预测时候进行数据扩增,对同一个样本预测多次,然后对这些结果进行平均。
def predict(test_loader, model, tta=10):
   model.eval()
   test_pred_tta = None
   # TTA 次数
   for _ in range(tta):
       test_pred = []
   
       with torch.no_grad():
           for i, (input, target) in enumerate(test_loader):
               c0, c1, c2, c3, c4, c5 = model(data[0])
               output = np.concatenate([c0.data.numpy(), c1.data.numpy(),
                  c2.data.numpy(), c3.data.numpy(),
                  c4.data.numpy(), c5.data.numpy()], axis=1)
               test_pred.append(output)
       
       test_pred = np.vstack(test_pred)
       if test_pred_tta is None:
           test_pred_tta = test_pred
       else:
           test_pred_tta += test_pred
   
   return test_pred_tta

很明显这份代码关键步骤在于test_loader里是如何用上transforms的,当然由于模型集成还没有纳入小编的考虑范围,所以这份代码暂时还没有加入到github的项目中。

结果后处理

在本次赛题中,可以从以下几个思路对预测结果进行后处理:

  1. 统计图片中每个位置字符出现的频率,使用规则修正结果;
  2. 单独训练一个字符长度预测模型,用来预测图片中字符个数,并修正结果。

这些后处理的思路都非常有意思,原因在于不同场景的问题会采用的思路都不同,比如小编曾经见过一个做图像分割的任务用过的后处理思路便是把框出来的实例内部点统一类别,这看上去非常合理。所以后处理思路大多取决于对场景的理解以及对数据分析的程度。

结语

模型集成终究是个耗时耗力的Trick,尤其在使用上深度学习,集成多个模型并不符合一些实时需求,在比赛上可以玩玩。

参考文献

  1. DW学习资料
  2. Dropout: https://blog.csdn.net/gongsai20141004277/article/details/104359464

童鞋们,让小编听见你们的声音,点赞评论,一起加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章