zoukankan      html  css  js  c++  java
  • ubuntu之路——day6(今天对数据集的建立有了更深的体会)

    两个重点:

    一.举个例子,如果建立一个图像识别的数据集,你的训练集和你的训练验证集是从网上爬下来的(也就是说这些图片的大小、像素、后期制作都可能很精美),你真正的测试集是用户的手机上传(不同的手机、环境、光线、时间等等会造成不同的效果)

        这两个集合必定不是同分布的,虽然在transfer learning中我们鼓励这种研究方式,但是在单个模型的训练中,不管你的模型建立的多么好,从这个数据集建立开始的那一刻起就注定了你的结果不会很好。所以,在建立自己的数据集时,必须保证同分布的条件,当然这很困难,但是建立一个好的数据集将有助于提升你算法最终的效果。

        我在进行植物图片分类时,就自己从网上找了一些图片,结果证明分类效果很差,这有时并不是因为模型的问题。而是因为这些图片取自真正的自然情况,可能在一张图片中包含多种植物,甚至可能有些图片是单株植物,有些图片是成群的,还有一些图片包含了水系和天空,甚至有些图片可能还有人工景色如亭台楼阁等。干扰太大,从像素到时间到光线到取景,从建立数据集的那一刻起就注定了实验的失败。

        那么如何才能建立一个标准化的数据集呢?我们都知道可以从各种大赛还有官方的数据集网站上下载数据集,但是当你自己做一种应用场景的实验或者是论文的时候,如果不单单是改进算法,避免数据集的重复就很重要。毕竟phd阶段的算法改进必须放在标准数据集下与它人的结果进行比较,但是master degree下的应用场景就使得你不得不想法设法的建立自己的应用环境(也就是自己的数据集)

       打个比方,当你对植物进行分类的时候,最好的方法其实是,不要对自然场景下的植物直接进行分类,对植物的叶片或者果实进行提取,然后找到一个标准的背景板,比如一张A4白纸,在最中心的地方摆放各种植物的叶片或者是果实之类的提取物,使用同一台相机,在相同的位置进行拍摄,重复这一过程,这就叫标准数据集的建立。

    二.对数据集的划分不应该train/test,更加标准的做法是train/dev/test,前者必定导致过拟合(如果有人管自己的训练验证集叫测试集,然后宣称自己从算法上改进了过拟合,保持警惕他很有可能是胡说八道)

    按照我以往进行的机器学习实验来看,我们通常都是把数据集data set划分为训练集train和测试集test两个集合进行实验,比如十次十折交叉验证,就是一个原始数据集划分十等份,然后每次拿其中的一份出来做测试,然后做十次求一个均值。

    但是真正好的做法是划分三个集合:train+Dev+test

    顾名思义 dev即development也就是验证集,训练集+验证集其本质就是我们以往划分的交叉验证法的两个集合,与此同时必须划分出一个独立的没有被训练时引入的集合作为真正的测试集test

    这样的好处是保证了无偏性能评估,因为如果在训练的时候引入了测试集,过拟合是必定会出现而且理论上无法避免的

    如果有人没有划分独立的真正的test date set,那么在查看这种结果时应当报以警惕,显然地这种测试必定是过拟合的。

  • 相关阅读:
    browser浏览器类型判断
    泛型函数Func<>
    前台JS端排除重复录入数据方法(取值对比)
    判断字符串是否为空字符串
    Linq语法及用法
    new Array( ) 使用
    性能测试
    [排序N大件之]快速排序
    [排序N大件之]归并排序
    [排序N大件之]谢尔排序
  • 原文地址:https://www.cnblogs.com/NWNU-LHY/p/11180366.html
Copyright © 2011-2022 走看看