精华内容
下载资源
问答
  • 这里介绍其中一种带标签扩充数据集的方法。

    前言 

    前一段时间接触了几位用户提的问题,发现很多人在使用训练的时候,给的数据集寥寥无几,有一些甚至一类只有5张图片。modelarts平台虽然给出了每类5张图片就能训练的限制,但是这种限制对一个工业级的应用场景往往是远远不够的。所以联系了用户希望多增加一些图片,增加几千张图片训练。但是用户后面反馈,标注的工作量实在是太大了。我思忖了一下,分析了一下他应用的场景,做了一些策略变化。这里介绍其中一种带标签扩充数据集的方法。

    数据集情况

    数据集由于属于用户数据,不能随便展示,这里用一个可以展示的开源数据集来替代。首先,这是一个分类的问题,需要检测出工业零件表面的瑕疵,判断是否为残次品,如下是样例图片:

    https://bbs-img.huaweicloud.com/blogs/img/1595559670135072001.png

    这是两块太阳能电板的表面,左侧是正常的,右侧是有残缺和残次现象的,我们需要用一个模型来区分这两类的图片,帮助定位哪些太阳能电板存在问题。左侧的正常样本754张,右侧的残次样本358张,验证集同样,正常样本754张,残次样本357张。总样本在2000张左右,对于一般工业要求的95%以上准确率模型而言属于一个非常小的样本。先直接拿这个数据集用Pytorch加载imagenet的resnet50模型训练了一把,整体精度ACC在86.06%左右,召回率正常类为97.3%,但非正常类为62.9%,还不能达到用户预期。

    当要求用户再多收集,至少扩充到万级的数据集的时候,用户提出,收集数据要经过处理,还要标注,很麻烦,问有没有其他的办法可以节省一些工作量。这可一下难倒了我,数据可是深度学习训练的灵魂,这可咋整啊。

    https://bbs-img.huaweicloud.com/blogs/img/1595560604297067949.jpg

    仔细思考了一阵子,想到modelarts上有智能标注然后人工校验的功能,就让用户先试着体验一下这个功能。我这边拿他给我的数据集想想办法。查了些资料,小样本学习few-shot fewshot learning (FSFSL)的常见方法,基本都是从两个方向入手。一是数据本身,二是从模型训练本身,也就是对图像提取的特征做文章。这里想着从数据本身入手。

    首先观察数据集,都是300*300的灰度图像,而且都已太阳能电板表面的正面俯视为整张图片。这属于预先处理的很好的图片。那么针对这种图片,翻转镜像对图片整体结构影响不大,所以我们首先可以做的就是flip操作,增加数据的多样性。flip效果如下:

    https://bbs-img.huaweicloud.com/blogs/img/1595574853682035345.png

    这样数据集就从1100张扩增到了2200张,还是不是很多,但是直接观察数据集已经没什么太好的扩充办法了。这时想到用Modelarts模型评估的功能来评估一下模型对数据的泛化能力。这里调用了提供的SDK:deep_moxing.model_analysis下面的analyse接口。

    def validate(val_loader, model, criterion, args):
        batch_time = AverageMeter('Time', ':6.3f')
        losses = AverageMeter('Loss', ':.4e')
        top1 = AverageMeter('Acc@1', ':6.2f')
        top5 = AverageMeter('Acc@5', ':6.2f')
        progress = ProgressMeter(
            len(val_loader),
            [batch_time, losses, top1, top5],
            prefix='Test: ')
        pred_list = []
        target_list = []
        # switch to evaluate mode
        model.eval()
        with torch.no_grad():
            end = time.time()
            for i, (images, target) in enumerate(val_loader):
                if args.gpu is not None:
                    images = images.cuda(args.gpu, non_blocking=True)
                target = target.cuda(args.gpu, non_blocking=True)
    
                # compute output
                output = model(images)
                loss = criterion(output, target)
                # 获取logits输出结果pred和实际目标的结果target
                pred_list += output.cpu().numpy()[:, :2].tolist()
                target_list += target.cpu().numpy().tolist()
                # measure accuracy and record loss
                acc1, acc5 = accuracy(output, target, topk=(1, 5), i=i)
                losses.update(loss.item(), images.size(0))
                top1.update(acc1[0], images.size(0))
                top5.update(acc5[0], images.size(0))
    
                # measure elapsed time
                batch_time.update(time.time() - end)
                end = time.time()
    
                if i % args.print_freq == 0:
                    progress.display(i)
            # TODO: this should also be done with the ProgressMeter
            print(' * Acc@1 {top1.avg:.3f} Acc@5 {top5.avg:.3f}'
                  .format(top1=top1, top5=top5))
        # 获取图片的存储路径name
        name_list = val_loader.dataset.samples
        for idx in range(len(name_list)):
            name_list[idx] = name_list[idx][0]
        analyse(task_type='image_classification', save_path='/home/image_labeled/',
                pred_list=pred_list, label_list=target_list, name_list=name_list)
        return top1.avg

    上段代码大部分都是Pytorch训练ImageNet中的验证部分代码,需要获取三个list,模型pred直接结果logits、图片实际类别target和图片存储路径name。然后按如上的调用方法调用analyse接口,会在save_path的目录下生成一个json文件,放到Modelarts训练输出目录里,就能在评估结果里看到对模型的分析结果。我这里是线下生成的json文件再上传到线上看可视化结果。关于敏感度分析结果如下:

    https://bbs-img.huaweicloud.com/blogs/img/1595576056671069308.png

    这幅图的意思是,不同的特征值范围图片分别测试的精度是多少。比如亮度敏感度分析的第一项0%-20%,可以理解为,在图片亮度较低的场景下对与0类和其他亮度条件的图片相比,精度要低很多。整体来看,主要是为了检测1类,1类在图片的亮度和清晰度两项上显得都很敏感,也就是模型不能很好地处理图片的这两项特征变化的图片。那这不就是我要扩增数据集的方向吗?

    https://bbs-img.huaweicloud.com/blogs/img/1595576734648007863.png

    好的,那么我就试着直接对全量的数据集做了扩增,得到一个正常类2210张,瑕疵类1174张图片的数据集,用同样的策略扔进pytorch中训练,得到的结果:

    方法

    Acc1

    recall norm

    recall abnorm

    原版

    86.06%

    97.3%

    62.9%

    1100张扩增到2940

    86.31%

    97.6%

    62.5%

    怎么回事,和设想的不太一样啊。。。

    https://bbs-img.huaweicloud.com/blogs/img/1595582113004078931.jpg

    重新分析一下数据集,我突然想到,这种工业类的数据集往往都存在一个样本不均匀的问题,这里虽然接近2:1,但是检测的要求针对有瑕疵的类别的比较高,应该让模型倾向于有瑕疵类去学习,而且看到1类的也就是有瑕疵类的结果比较敏感,所以其实还是存在样本不均衡的情况。由此后面的这两种增强方法只针对了1类也就是有问题的破损类做,最终得到3000张左右,1508张正常类图片,1432张有瑕疵类图片,这样样本就相对平衡了。用同样的策略扔进resnet50中训练。最终得到的精度信息:

    方法

    Acc1

    recall norm

    recall abnorm

    原版

    86.06%

    97.3%

    62.9%

    1100张扩增到2940

    89.13%

    97.2%

    71.3%

    可以看到,同样在验证集,正常样本754张,残次样本357张的样本上,Acc1的精度整体提升了接近3%,重要指标残次类的recall提升了8.4%嗯,很不错。所以直接扩充数据集的方法很有效,而且结合模型评估能让我参考哪些扩增的方法是有意义的。当然还有很重要的一点,要排除原始数据集存在的问题,比如这里存在的样本不均衡问题,具体情况具体分析,这个扩增的方法就会变得简单实用。

    之后基于这个实验的结果和数据集。给帮助用户改了一些训练策略,换了个更厉害的网络,就达到了用户的要求,当然这都是定制化分析的结果,这里不详细展开说明了,或者会在以后的博客中更新。

    引用数据集来自:

    1. Buerhop-Lutz, C.; Deitsch, S.; Maier, A.; Gallwitz, F.; Berger, S.; Doll, B.; Hauch, J.; Camus, C. & Brabec, C. J. A Benchmark for Visual Identification of Defective Solar Cells in Electroluminescence Imagery. European PV Solar Energy Conference and Exhibition (EU PVSEC), 2018. DOI: 10.4229/35thEUPVSEC20182018-5CV.3.15
    2. Deitsch, S.; Buerhop-Lutz, C.; Maier, A. K.; Gallwitz, F. & Riess, C. Segmentation of Photovoltaic Module Cells in Electroluminescence Images. CoRR, 2018, abs/1806.06530
    3. Deitsch, S.; Christlein, V.; Berger, S.; Buerhop-Lutz, C.; Maier, A.; Gallwitz, F. & Riess, C. Automatic classification of defective photovoltaic module cells in electroluminescence images. Solar Energy, Elsevier BV, 2019, 185, 455-468. DOI: 10.1016/j.solener.2019.02.067

    点击这里→了解更多精彩内容

    展开全文
  • 前言要想训练一个好的深度...这样会导致训练集和测试集存在差异,所以在划分数据集的时候需要掌握一些技巧。本篇文章的主要内容来自deeplearning.ai。示例说明问题描述你想开发一个APP,当用户上传图片的时候,系统...

    前言

    要想训练一个好的深度学习模型需要大量的数据,只有当你收集到足够多的数据构成训练集时,算法的效果最好。

    有时候我们很难收集到足够多的数据,为了解决数据量的问题,其实我们可以爬虫或购买数据等手段来获取大量的数据。这样会导致训练集和测试集存在差异,所以在划分数据集的时候需要掌握一些技巧。本篇文章的主要内容来自deeplearning.ai。

    示例说明

    bb840b416104404633f64ad1fd3b2067.png
    • 问题描述

    你想开发一个APP,当用户上传图片的时候,系统能够自动判断图片是不是猫的照片。而你实际能收集到用户使用APP上传的照片只有10000张,为了解决数据量的问题,你通过爬虫从网上下载了200000张照片。

    通过观察发现,通过爬虫下载的照片和用户上传的照片之间还是存在很大差异的。通过爬虫获取的照片相对会比较清晰,而用户上的照片会比较模糊。

    那么我究竟应该如何利用这些数据来组合成数据集训练模型呢?

    • 常规的划分数据集方式
    e51070127e6b399532586b8916337cee.png

    我们将200000张爬虫所获取到的数据与10000张用户使用APP所获取到的数据进行混合打乱,然后随机分配给训练集205000张、开发集2500张、测试集2500张。

    这种分配方式是我们常用的一种划分数据集的方式。

    这样划分数据集的好处在于,可以保证训练集、开发集和测试集中的数据处于同一分布下

    同时也有坏处,仔细观察我们不难发现,210k张图片中,其中有大量的图片都来自于爬虫所获取到的数据,只有很小一部分是来自用户上传的图片。通过计算可以发现,2500张图片中,大约有2381张图片来自于爬虫所获取到的照片,只有119张来自于用户上传的图片,这样就会导致模型过多的关注爬虫所获取到的数据。

    而我们想训练的是一个能够分辨APP上传照片,而不是爬虫所获取的照片。所以,我们需要采用另外一种划分方式。

    • 数据不同分布的划分

    之前在介绍训练集、开发集以及测试集划分的时候需要训练集与开发集在同一分布上,不然可能会带来大的方差。

    现在为了使得我们的系统能够分辨APP上传的照片,而不是爬虫所获取的照片,我们需要改变之前数据集的划分方式。

    在划分数据的时候,我们不将爬虫所获取的照片和APP上传的照片进行混合,而是将APP上传照片的一部分(5000张照片)划分到训练集中将爬虫所获取的照片全部(200000张)划分到训练集中,这样训练集中就有205000张照片,再将剩下的5000张分别划分到开发集和训练集中,这样就能让我们的目标瞄准APP上传的照片,而不是爬虫所获取的照片。

    这样划分数据所带来的缺点就是,训练集与开发集和测试集不在同一分布,但事实证明这样划分数据能够为你的系统带来长期良好的性能,下一篇我会介绍如何处理训练集和开发集数据分布不一致的情况。

    展开全文
  • 前言要想训练一个好的深度...这样会导致训练集和测试集存在差异,所以在划分数据集的时候需要掌握一些技巧。本篇文章的主要内容来自deeplearning.ai。示例说明问题描述你想开发一个APP,当用户上传图片的时候,系统...

    前言

    要想训练一个好的深度学习模型需要大量的数据,只有当你收集到足够多的数据构成训练集时,算法的效果最好。

    有时候我们很难收集到足够多的数据,为了解决数据量的问题,其实我们可以爬虫或购买数据等手段来获取大量的数据。这样会导致训练集和测试集存在差异,所以在划分数据集的时候需要掌握一些技巧。本篇文章的主要内容来自deeplearning.ai。

    示例说明

    c961735908680cc6f99a67e2ca6fe4af.png
    • 问题描述

    你想开发一个APP,当用户上传图片的时候,系统能够自动判断图片是不是猫的照片。而你实际能收集到用户使用APP上传的照片只有10000张,为了解决数据量的问题,你通过爬虫从网上下载了200000张照片。

    通过观察发现,通过爬虫下载的照片和用户上传的照片之间还是存在很大差异的。通过爬虫获取的照片相对会比较清晰,而用户上的照片会比较模糊。

    那么我究竟应该如何利用这些数据来组合成数据集训练模型呢?

    • 常规的划分数据集方式
    41174666a656669d9317d108552b5fb6.png

    我们将200000张爬虫所获取到的数据与10000张用户使用APP所获取到的数据进行混合打乱,然后随机分配给训练集205000张、开发集2500张、测试集2500张。

    这种分配方式是我们常用的一种划分数据集的方式。

    这样划分数据集的好处在于,可以保证训练集、开发集和测试集中的数据处于同一分布下

    同时也有坏处,仔细观察我们不难发现,210k张图片中,其中有大量的图片都来自于爬虫所获取到的数据,只有很小一部分是来自用户上传的图片。通过计算可以发现,2500张图片中,大约有2381张图片来自于爬虫所获取到的照片,只有119张来自于用户上传的图片,这样就会导致模型过多的关注爬虫所获取到的数据。

    而我们想训练的是一个能够分辨APP上传照片,而不是爬虫所获取的照片。所以,我们需要采用另外一种划分方式。

    • 数据不同分布的划分

    之前在介绍训练集、开发集以及测试集划分的时候需要训练集与开发集在同一分布上,不然可能会带来大的方差。

    现在为了使得我们的系统能够分辨APP上传的照片,而不是爬虫所获取的照片,我们需要改变之前数据集的划分方式。

    在划分数据的时候,我们不将爬虫所获取的照片和APP上传的照片进行混合,而是将APP上传照片的一部分(5000张照片)划分到训练集中将爬虫所获取的照片全部(200000张)划分到训练集中,这样训练集中就有205000张照片,再将剩下的5000张分别划分到开发集和训练集中,这样就能让我们的目标瞄准APP上传的照片,而不是爬虫所获取的照片。

    这样划分数据所带来的缺点就是,训练集与开发集和测试集不在同一分布,但事实证明这样划分数据能够为你的系统带来长期良好的性能,下一篇我会介绍如何处理训练集和开发集数据分布不一致的情况。

    展开全文
  • 前言 要想训练一个好的深度学习模型...这样会导致训练集和测试集存在差异,所以在划分数据集的时候需要掌握一些技巧。本篇文章的主要内容来自deeplearning.ai 示例说明 问题描述 你想开发一个APP,当用户上传...

    前言

    要想训练一个好的深度学习模型需要大量的数据,只有当你收集到足够多的数据构成训练集时,算法的效果最好。有时候我们很难收集到足够多的数据,为了解决数据量的问题,其实我们可以爬虫或购买数据等手段来获取大量的数据。这样会导致训练集和测试集存在差异,所以在划分数据集的时候需要掌握一些技巧。本篇文章的主要内容来自deeplearning.ai

    示例说明在这里插入图片描述

    • 问题描述

    你想开发一个APP,当用户上传图片的时候,系统能够自动判断图片是不是猫的照片。而你实际你能收集到用户使用APP上传的照片只有10000张,为了解决数据量的问题,你通过爬虫从网上下载了200000张照片。通过观察发现,通过爬虫下载的照片和用户上传的照片之间还是存在很大差异的。通过爬虫获取的照片相对会比较清晰,而用户上的照片会比较模糊。那么我究竟应该如何利用这些数据来组合成数据集训练模型呢?

    • 常规的划分数据集方式
      在这里插入图片描述
      我们将200000张爬虫所获取到的数据与10000张用户使用APP所获取到的数据进行混合打乱,然后随机分配给训练集205000张、开发集2500张、测试集2500张。这种分配-方式是我们常用的一种划分数据集的方式。这样划分数据集的好处在于,可以保证训练集、开发集和测试集中的数据处于同一分布下。同时也有坏处,仔细观察我们不难发现,210k张图片中,其中有大量的图片都来自于爬虫所获取到的数据,只有很小一部分是来自用户上传的图片。通过计算可以发现,2500张图片中,大约有2381张图片来自于爬虫所获取到的照片,只有119张来自于用户上传的图片,这样就会导致模型过多的关注爬虫所获取到的数据。而我们想训练的是一个能够分辨APP上传照片,而不是爬虫所获取的照片。所以,我们需要采用另外一种划分方式。
    • 数据不同分布的划分
      之前在介绍训练集、开发集以及测试集划分的时候需要训练集与开发集在同一分布上,不然可能会带来大的方差。现在为了使得我们的系统能够分辨APP上传的照片,而不是爬虫所获取的照片,我们需要改变之前数据集的划分方式。在划分数据的时候,我们不将爬虫所获取的照片和APP上传的照片进行混合,而是将APP上传照片的一部分(5000张照片)划分到训练集中将爬虫所获取的照片全部(200000张)划分到训练集中,这样训练集中就有205000张照片,再将剩下的5000张分别划分到开发集和训练集中,这样就能让我们的目标瞄准APP上传的照片,而不是爬虫所获取的照片。这样划分数据所带来的缺点就是,训练集与开发集和测试集不在同一分布,但事实证明这样划分数据能够为你的系统带来长期良好的性能,后面会介绍如何处理训练集和开发集数据分布不一致的情况。
    展开全文
  • 因此,在机器学习项目中,一个关键的问题是,为了达到比如分类器准确度等特定性能指标,我们需要多少训练数据才够。训练数据多少的问题在相关文献中也称为样本复杂度。 在这篇文章中,我们将从回归分析开始到深度...
  • 训练数据集问题

    2021-01-11 20:40:50
    <div><p>h5格式里面的part部分,要求是17*2,我的理解是骨骼点需要...请问官方是怎么转换的呢?或者我哪里做错了?谢谢。</p><p>该提问来源于开源项目:MVIG-SJTU/AlphaPose</p></div>
  • <div><p>该提问来源于开源项目:taosir/cnn_handwritten_chinese_recognition</p></div>
  • keras的数据集源码下载地址太慢。尝试过修改源码中的下载地址,直接报错。从源码或者网络资源下好数据集,下载好以后放到目录 ~/.keras/datasets/ 下面。其中:cifar10需要改文件名为cifar-10-batches-py.tar.gz ,...
  • 使用Keras如果要使用大规模数据集对网络进行训练,就没办法先加载进内存再从内存直接传到显存了,除了使用Sequence类以外,还可以使用迭代器去生成数据,但迭代器无法在fit_generation里开启多进程,会影响数据的...
  • Python用多元线性回归算法对Boston House Price Dataset数据集进行预测中,怎么利用sklearn将pandas读取的数据拆分成训练集和验证集
  • fcn数据集制作及训练自己的数据集

    千次阅读 2018-09-01 10:03:23
    经过数天的爬坑,终于搞定了fcn数据集制作及训练自己的数据集。caffe安装是一个痛苦的过程,没有去编译caffe源码,是用anaconda安装的,有需求的同学可以自行百度一下。下面来讲讲怎么制作自己的数据集。 1.制作...
  • 我的图片数据集没有经过预处理,查了相关资料后,大概意思是要图片格式统一处理后可能会避免这样的报错。 但是即便不进行预处理,应该也可以训练,大佬们可否告知怎么操作? <p>&#...
  • 它有50个主题,每个主题100张图像。那么4500张训练图像和500张测试图像怎么分?我感觉图像和标签怎么对不上?
  • 我用我的训练数据测试了这个模型,但现在我想用我的测试数据运行它。我有一个test.csv文件,我想用它。我该怎么做?我以前对我的培训数据集所做的:#loading my train dataset into pythontrain = pd.read_csv('/...
  • 基于Python的训练集数据标注修改方法研究田红梅;周皎;袁志杰;曲桢【期刊名称】《科技创新导报》【年(卷),期】2020(000)004【摘要】现如今我们的计算机技术得到了显著的发展,在大数据以及人工智能技术的应用下,计算机...
  • 我已经制作了一个卷积神经网络来预测使用MNIST数据集的手写数字但是现在我被困在预测我自己的图像作为cnn的输入,我在训练cnn后保存了权重并且想用它来预测我自己的图像(注意:关心我的输入图像是28×28)码:new_...
  • 从网上下载的ESP game数据集,形式如图所示,![图片说明](https://img-ask.csdn.net/upload/201901/05/1546685365_947807.png) 这些.hvesc文件怎么用,它里面可能是特征,用matlab怎么打开那,为什么有这么多文件?...
  • `Al-bert利用自己训练数据集预训练以及测试LCQMC语义相似度测试## 标题(二) 上一张讲解了怎么构造预训练的数据,这一章讲解训练过程,一起探讨与bert的区别 1.2 run_pretraining.py 的讲解 我们仍然采用debug...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# In[12]:#载入数据集mnist = input_data.read_data_sets("E://YangBen//MNIST_...
  • y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) #此步骤,是为了将训练集与数据集的数据分别保存为CSV文件 #np.column_stack将两个矩阵进行组合连接 train= np.column_stack((X_train,...
  • 数据集的划分,验证集参与训练了吗? 文章目录数据集的划分,验证集参与训练了吗?前言一、验证集怎么用?验证集参与训练了吗?二、为什么需要测试集?三、数据集的划分比例 前言 在周志华老师的《机器学习》这本书...
  • 首先膜拜一下何凯明大神,其实首次知道FCN做语义分割的时候,也产生过是否可以与Faster Rcnn结合的想法,... 必要的开发环境我就不啰嗦了,在代码链接里有,如果只是训练自己的训练集,coco tools就不用下了,win...
  • 1、克隆仓库下来。...(主要是增加自己nvcc的路径,把CUDNN注释掉,不然容易报错,我不知道为啥)修改好了之后,可以编译一下,编译成功,出现可...make # 编译3、准备数据集:我这边的数据集是VOC数据集,需要把转换成Y...
  • yolov4训练自己的数据集

    万次阅读 多人点赞 2020-04-30 20:47:25
    小帅编:努力不一定成功,放弃就等于失败! ... 对于我们的所以所看到的...让我们来看看opencv是怎么读取图片以及一些图片相应的操作。 读取图片和保存图片 import cv2 #读取并显示图片, img = cv2.imread('img_path...
  • 数据集如何预训练

    2020-12-09 12:54:38
    <div><p>您好,请问如果是一个新的数据集怎么进行预训练</p><p>该提问来源于开源项目:thunlp/Chinese_NRE</p></div>
  • 利用tensorflow训练自己的图片数据集——数据准备

    万次阅读 多人点赞 2018-07-18 21:38:57
    用了MNIST数据集,虽然看来对这个数据集用的很多,但是真正这个数据集怎么训练的时候被调用的,以及怎么把它换成自己的数据集都是一脸懵。 直接附上链接:MNIST数据集解析 作者给的代码是python2.x版本的,我...
  • 哦豁,鉴于有些小伙伴想自己拆分数据集,却不大明白怎么实现这个过程,我在这里给小伙伴们讲解一下,具体代码就不写了,告诉你用到哪些东西,可以让大家好好学习。 假设数据集只有10行,拆分为70%训练集,30%为测试...
  • 【Caffe】制作自己的训练数据集

    千次阅读 2019-08-06 11:27:11
    这里怎么标注数据就不说了,labelme,labelImg等都可以标注。 labelImg的标注可以参考博客【DeepLearning】标注工具labelImg的安装和使用。 labelme一张图片对应一个json文件。labelImg一张图片对应一个xml文件。...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# In[12]:#载入数据集mnist = input_data.read_data_sets("E://YangBen//MNIST_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,170
精华内容 468
关键字:

怎么训练数据集