面部表情数据集的训练验证测试集拆分

数据挖掘 机器学习 神经网络 交叉验证 计算机视觉 卷积神经网络
2022-02-18 09:05:00

我正在使用卷积神经网络 (CNN),我只想问一下我拆分训练/验证/测试集的方式是否正确。

我一共有55个科目。我计划将它们分成 80-10-10 用于训练(45 个科目)、验证(看不见的 5 个科目)、测试(看不见的 6 个科目)。

验证集是否也应该包含看不见的主题?或者我可以打乱整个训练集并使用其中的一部分(10-20%)作为验证集吗?

我读过使用 N 折交叉验证,整个训练集(实例)被打乱然后分成 N 折,模型被训练和平均 N 次。然而,对于神经网络或 CNN,我们不使用交叉验证,因为它的计算成本非常高。

我只是想知道哪个是正确的,因为使用了一组未见过的主题的验证,我的模型在 3-5 个时期后开始过度拟合并且根本不学习。另一方面,如果我使用 10-20% 的训练集作为我的验证集,我的模型使用 3 层 CNN 以合理的准确度 (45-50%) 学习,但是当使用看不见的测试集进行测试时,我的最佳-1 准确度仅为 15-16% 左右。

非常感谢你。

2个回答

NB 此建议假设您的目标是识别任何人的图片中的表情,而不仅仅是来自您的训练数据的人。

验证集是否也应该包含看不见的主题?

是的。这将为您在要使用网络的任务中提供最准确的性能度量,以便选择最佳泛化并将其用于测试。

如果您的训练网络的最终目标是从训练集中的人的图像中识别表情,您将只使用简单的随机分割。

或者我可以打乱整个训练集并使用其中的一部分(10-20%)作为验证集吗?

不会。如果您在训练和 cv 中出现同一张脸的随机样本,您会高估泛化。我在 Kaggle State Farm Distracted Driver比赛中亲眼目睹了这种效果,你应该在那里的论坛上看到它的讨论。它也可能有助于提高性能的想法。

如果我使用 10-20% 的训练集作为验证集,我的模型使用 3 层 CNN 以合理的准确度 (45-50%) 学习

这是训练和交叉验证之间的数据泄漏——网络已经学会正确分类它已经看到的人的图像中的表情,这就是你通过这种方式进行分割来测量的结果。测试结果与交叉验证的有希望值不匹配也就不足为奇了。

我只是想知道哪个是正确的,因为使用了一组看不见的主题的验证,我的模型在 3-5 个时期后开始过度拟合并且根本不学习

无论您如何拆分训练,CV,您都过度拟合。当您错误地拆分 CV 时,除了过度拟合之外,数据泄漏还会给您带来不好的指导。

看起来您的训练数据几乎没有多样性,而从头开始训练图像分类器需要大量数据。考虑:

  • 收集更多标记数据,也许您可​​以下载其他一些数据集。

  • 为您的模型添加大量正则化(例如多个 dropout 层)

  • 使用预训练的图像分类器网络(例如 VGG-19 或 Inception)作为起点并针对您的分类任务对其进行微调。

  • 无论计算成本如何,都使用完整的 k 折交叉验证,以减轻使用小型训练集的问题。这无助于直接解决您的训练问题,但一旦您解决了该问题,您可以更好地调整网络超参数。

验证集意味着它是通过获取一部分训练数据集获得的。它不可能是看不见的(我假设看不见,你的意思是你不知道或你想检查谁的标签)主题,因为那样我们将无法首先验证(检查准确性/精度以测试我们的模型) . 我认为您正在做的可能是从您用于训练的训练数据集中获取验证集,这也会导致过度拟合。让我详细说明:

让我们假设您有 100 个文档。使用 80 进行训练,休息 20 进行验证。不要使用这 20 个文档进行培训。如果你使用它,你会导致过度拟合(我认为这可能是你过度拟合的答案)。现在,可以测试其他测试数据集(看不见的文档)。