【问题标题】:Data shuffling for Image Classification图像分类的数据混洗
【发布时间】:2020-04-14 19:29:57
【问题描述】:

我想开发一个 CNN 模型来识别美国手语中的 24 个手势。我创建了一个自定义 dataset,其中包含每个手势的 3000 张图像,即整个数据集中的 72000 张图像。

为了训练模型,我将使用 80-20 数据集拆分(训练集中 2400 张图像/手签,验证集中 600 张图像/手签)。

我的问题是: 创建数据集时我应该随机打乱图像吗?为什么?

根据我之前的经验,它导致验证损失低于训练损失,验证准确度高于训练准确度。 Check this link.

【问题讨论】:

    标签: machine-learning deep-learning neural-network computer-vision shuffle


    【解决方案1】:

    数据的随机洗牌是所有机器学习管道中的标准程序,图像分类也不例外;其目的是打破数据准备过程中可能出现的偏差——例如首先将所有猫图像,然后将狗图像放入猫/狗分类数据集中。

    以著名的鸢尾花数据集为例:

    from sklearn.datasets import load_iris
    X, y = load_iris(return_X_y=True)
    y
    # result:
    array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
           0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
           2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
    

    您可以清楚地看到,数据集的准备方式是,前 50 个样本都是标签 0,接下来的 50 个样本都是标签 1,最后 50 个样本都是标签 2。尝试在这样的数据集中执行 5 折交叉验证而不进行改组,你会发现大部分折叠只包含一个标签;尝试 3 折简历,所有您的折页将只包含一个标签。 不好...顺便说一句,这不仅仅是理论上的可能性,它有actually happened。

    即使不存在这样的偏见,洗牌永远不会伤害,所以我们总是这样做只是为了安全起见(你永远不知道......)。

    根据我之前的经验,它导致验证损失低于训练损失,验证准确度高于训练准确度。 Check this link.

    正如那里的答案所述,这极不可能是由于洗牌造成的。数据洗牌并不是什么复杂的东西——本质上,它相当于洗牌;可能曾经发生过你坚持“更好”的洗牌,然后你最终拿到一手同花顺,但显然这不是因为牌的“更好”洗牌。

    【讨论】:

    • 谢谢,那么在这种情况下如何确定模型是否训练有素(val acc 大于training acc)?
    • @mayuresh_sa 这完全是另一个问题,您已经在其他地方发布并得到了答案。简而言之,在这种情况下没有必然有任何问题(已经在回复中指出)。而且你的学习曲线看起来还不错。
    【解决方案2】:

    这是我关于这个话题的两分钱。

    首先确保为每个手势提取具有相同样本数的测试集。 (手势 #1 - 500 个样本,手势 #2 - 500 个样本,依此类推) 我认为这被称为分层抽样。

    当涉及到训练集时,将整个集洗牌并没有太大的错误。但是,在将训练集拆分为训练集和验证集时,请确保验证集足以作为测试集的表示。

    我个人洗牌的经验之一: 将训练集拆分为训练集和验证集后,验证集非常容易预测。因此,我看到了很好的学习指标值。然而,模型在测试集上的表现却很糟糕。

    【讨论】:

    • 你的意思是“洗牌没有大的错误”?有小的吗?最后一段与洗牌有什么关系,特别是,这就是问题所在(而不是一般的分裂)?您似乎将糟糕的测试性能(尽管验证效果很好)归因于改组......
    • 在我的数据集中,我尝试为验证集创建一个更硬的数据集来代表测试集,但是即使使用像 Conv2D(64, 128, 256, 512 - 3x3)>密集(512)>密集(24)。每个 Conv2D 后面跟着 Maxpool2D(2x2)
    • @desertnaut 通过“洗牌没有大错误”,我的意思是您不必担心。请原谅我不清楚,我的主要想法是在某些情况下验证集太容易预测。这可能是由错误的训练/验证拆分方法引起的。最后,我想将此事告知 mayuresh_sa。
    • @mayuresh_sa 我明白了。尽管无论如何我都不是专家,但我认为您不应该明确地尝试使用更难的验证集。平衡的训练/验证集通常对我有用。另外,我猜难的样本比其他的更容易区分?您能否为我们提供难以/中等预测训练/验证/测试的样本比率?
    • @Bilguun 我没有清楚地理解最后一个问题。我正在使用 80-20 训练验证拆分。通过更难的数据集——我在训练集中有纯背景的手势(白色和红色),在验证集中有不同背景图案的手势。您可以在kaggle.com/mayureshamberkar/… 上查看数据集。如果我对所有图像进行了洗牌 - 自训练开始以来,val 准确度高于训练 acc,并且在另一个问题中得到了回答(链接已添加到此问题中)
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 2012-01-25
    • 2021-02-11
    • 2014-01-10
    • 1970-01-01
    • 2019-05-06
    相关资源
    最近更新 更多