模型集成
集成学习
集成学习就是说将多个“单学习器”使用某种策略结合起来,使得整体的泛化能力得到提高。因为在机器学习中我们的目标是学习到一个稳定的并且在各个方面都表现较好的模型,但往往我们只能得到一个由某种偏好的模型即在某些方面表现得比较好,因此集成学习通过集合多个弱监督模型来得到一个更好的模型。
集成学习方法一般可以分为以下几类:
- Bagging
- Boosting
- Stacking
在本次任务中我们也可以使用集成学习技术,比如我们训练得到了若干个CNN模型,那么我们可以通过计算平均值的方式将这些模型集成起来。
深度学习中的集成学习
在深度学习中也有一些集成学习方法
dropout
dropout是训练CNN网络的常用技巧,在训练过程中随机丢弃神经元,可以起到缓解过拟合的作用。
在pytorch中我们可以使用nn.Dropout(val)
语句来添加dropout,val指的是我们希望随机丢弃的概率。
测试集数据增强
测试集数据增强就是在测试时对测试数据进行数据增强,这将会为原始图像创造多个不同的版本,对多个版本进行计算并得到它们的平均分值最终得到输出分数。
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
结果后处理
在不同的任务中可能会有不同的解决方案,不同思路的模型不仅可以互相借鉴,同时也可以修正最终的预测结果。
在本次赛题中,可以从以下几个思路对预测结果进行后处理:
- 统计图片中每个位置字符出现的频率,使用规则修正结果;
- 单独训练一个字符长度预测模型,用来预测图片中字符个数,并修正结果。