零基础入门CV赛事—Task5 模型集成

本文介绍了模型集成方法,重点讨论了Stacking和Bagging的概念,以及它们在深度学习中的应用,如Dropout和TTA。Stacking利用初级学习器的输出训练次级学习器,而Bagging通过放回取样降低方差。Dropout是防止过拟合的技巧,而TTA在预测时进行数据扩增提高准确性。最后,文章提到了结果后处理的重要性,如字符频率统计和长度预测模型来修正预测结果。

5 模型集成

本章讲解的知识点包括:集成学习方法、深度学习中的集成学习和结果后处理思路。

5.1 学习目标

  • 学习集成学习方法以及交叉验证情况下的模型集成
  • 学会使用深度学习模型的集成学习

5.2 集成学习方法

5.2.1 Stacking

Stacking先从初始数据集训练出初级学习器(个体学习器),然后“生成”一个新数据集用于训练次级学习器(用于结合的学习器,也称元学习器meta-learner)。新的数据集中,初级学习器的输出被当作样例输入特征。

注:训练阶段,次级训练集是通过初级学习器产生的,若直接使用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大;因此,一般是通过使用交叉验证这样的方式。

在这里插入图片描述

5.2.2 Bagging

也称自举汇聚法(bootstrap aggregating),是在原始数据集选择T次后得到T个新数据集。通过放回取样得到(比如要得到一个大小为n的新数据集,该数据集中的每个样本都是在原始数据集中随机取样,即抽样之后又放回)得到。基于每个采样集训练出一个基学习器,再将这些基学习器结合,在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务采用简单平均法。Bagging主要关注降低方差。

为啥有放回取样?:训练数据不同,我们获得的基学习器可望具有比较大的差异。然而,如果采样出的子集都完全不同,则每个基学习器只用到了一小部分训练数据,甚至不足以进行有效学习,显然无法产生比较好的基学习器。所以,采取相互有交叠的采样子集。

5.3 深度学习中的集成学习

5.3.1 Dropout

Dropout可以作为训练深度神经网络的一种技巧。在每个训练批次中,通过随机让一部分的节点停止工作。同时在预测的过程中让所有的节点都起作用。Dropout经常出现在现有的CNN网络中,可以有效的缓解模型过拟合的情况,也可以在预测时增加模型的精度。
在这里插入图片描述
加入Dropout后的网络结构如下:

# 定义模型
class SVHN_Model1(nn.Module):
    def __init__(self):
        super(SVHN_Model1, self).__init__()
        # CNN提取特征模块
        self.cnn = nn.Sequential(
            nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(),
            nn.Dropout(0.25),
            nn.MaxPool2d(2),
            nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)),
            nn.ReLU(), 
            nn.Dropout(0.25),
            nn.MaxPool2d(2),
        )
        # 
        self.fc1 = nn.Linear(32*3*7, 11)
        self.fc2 = nn.Linear(32*3*7, 11)
        self.fc3 = nn.Linear(32*3*7, 11)
        self.fc4 = nn.Linear(32*3*7, 11)
        self.fc5 = nn.Linear(32*3*7, 11)
        self.fc6 = nn.Linear(32*3*7, 11)
    
    def forward(self, img):        
        feat = self.cnn(img)
        feat = feat.view(feat.shape[0], -1)
        c1 = self.fc1(feat)
        c2 = self.fc2(feat)
        c3 = self.fc3(feat)
        c4 = self.fc4(feat)
        c5 = self.fc5(feat)
        c6 = self.fc6(feat)
        return c1, c2, c3, c4, c5, c6

5.3.2 TTA

测试集数据扩增(Test Time Augmentation,简称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

5.4 结果后处理

在不同的任务中可能会有不同的解决方案,不同思路的模型不仅可以互相借鉴,同时也可以修正最终的预测结果。

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

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

天池赛事零基础入门语义分割-地表建筑物识别任务是一个面向初学者的语义分割竞赛。任务的目标是利用机器学习和计算机视觉技术,对卫星图像中的地表建筑物进行标记和识别。 在这个任务中,参赛者需要使用给定的训练数据集进行模型的训练和优化。训练数据集包含了一系列卫星图像和相应的像素级标注,标注了地表建筑物的位置。参赛者需要通过分析训练数据集中的图像和标注信息,来构建一个能够准确地识别出地表建筑物的模型。 参赛者需要注意的是,语义分割是指将图像中的每个像素进行分类,使得同一类别的像素具有相同的标签。因此,在地表建筑物识别任务中,参赛者需要将地表建筑物区域与其他区域进行区分,并正确地进行标记。这对于初学者来说可能是一个挑战,因此需要掌握基本的图像处理和机器学习知识。 参赛者可以根据自己的理解,选择合适的算法和模型来完成这个任务。常见的方法包括卷积神经网络(CNN),通过设计适当的网络结构和训练方式,提高模型的准确性和泛化能力。同时,数据预处理和数据增强技术也是提高模型性能的关键。参赛者可以通过对数据进行增强和扩充,提高模型的鲁棒性和识别能力。 最后,参赛者需要使用训练好的模型对测试数据集进行预测,并生成预测结果。这些预测结果将用于评估参赛者模型的性能和准确度。评估指标通常包括像素级准确度(Pixel Accuracy)和平均交并比(Mean Intersection over Union),参赛者需要根据这些指标来评估和改进自己的模型。 总之,通过参加这个任务,初学者可以通过实践和挑战来提高自己的图像处理和机器学习技能,并掌握语义分割的基本概念和方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值