图像分类的数据改组
Data shuffling for Image Classification
我想开发一个 CNN 模型来识别美国手语中的 24 个手势。我创建了一个自定义 dataset,每个手势包含 3000 张图像,即整个数据集中的 72000 张图像。
为了训练模型,我将使用 80-20 数据集拆分(训练集中 2400 images/hand 登录,验证集中 600 images/hand 登录)。
我的问题是:
创建数据集时我应该随机打乱图像吗?为什么?
根据我之前的经验,这导致验证损失低于训练损失,验证准确率高于训练准确率。 Check this link.
数据随机洗牌是所有机器学习管道中的标准程序,图像分类也不例外;它的目的是打破数据准备过程中可能存在的偏见——例如首先将所有猫图像,然后是狗图像放入 cat/dog 分类数据集中。
以著名的鸢尾花数据集为例:
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 折 CV,所有 您的折将仅包含一个标签。 不好...顺便说一句,这不仅仅是理论上的可能性,它有。
即使不存在这种偏见,洗牌也无妨,所以我们总是这样做只是为了安全起见(你永远不知道......)。
Based on my previous experience, it led to validation loss being lower than training loss and validation accuracy more than training accuracy. Check this link.
正如那里的答案所指出的,这不太可能是由于改组造成的。数据洗牌并不复杂——本质上,它相当于洗牌;有一次你坚持 "better" 洗牌,结果你拿到了同花顺,但显然这不是因为 "better" 洗牌。
这是我对这个话题的两分钱。
首先确保为每个手势提取具有相同数量样本的测试集。 (手势#1 - 500 个样本,手势#2 - 500 个样本等等)
我认为这被称为分层抽样。
说到训练集,把整个集打乱不会有太大的错误。但是,将训练集拆分为训练集和验证集时,请确保验证集足以代表测试集。
我个人的洗牌经历之一:
将训练集拆分为训练集和验证集后,验证集变得非常容易预测。因此,我看到了良好的学习指标值。然而,该模型在测试集上的表现非常糟糕。
我想开发一个 CNN 模型来识别美国手语中的 24 个手势。我创建了一个自定义 dataset,每个手势包含 3000 张图像,即整个数据集中的 72000 张图像。
为了训练模型,我将使用 80-20 数据集拆分(训练集中 2400 images/hand 登录,验证集中 600 images/hand 登录)。
我的问题是: 创建数据集时我应该随机打乱图像吗?为什么?
根据我之前的经验,这导致验证损失低于训练损失,验证准确率高于训练准确率。 Check this link.
数据随机洗牌是所有机器学习管道中的标准程序,图像分类也不例外;它的目的是打破数据准备过程中可能存在的偏见——例如首先将所有猫图像,然后是狗图像放入 cat/dog 分类数据集中。
以著名的鸢尾花数据集为例:
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 折 CV,所有 您的折将仅包含一个标签。 不好...顺便说一句,这不仅仅是理论上的可能性,它有
即使不存在这种偏见,洗牌也无妨,所以我们总是这样做只是为了安全起见(你永远不知道......)。
Based on my previous experience, it led to validation loss being lower than training loss and validation accuracy more than training accuracy. Check this link.
正如那里的答案所指出的,这不太可能是由于改组造成的。数据洗牌并不复杂——本质上,它相当于洗牌;有一次你坚持 "better" 洗牌,结果你拿到了同花顺,但显然这不是因为 "better" 洗牌。
这是我对这个话题的两分钱。
首先确保为每个手势提取具有相同数量样本的测试集。 (手势#1 - 500 个样本,手势#2 - 500 个样本等等) 我认为这被称为分层抽样。
说到训练集,把整个集打乱不会有太大的错误。但是,将训练集拆分为训练集和验证集时,请确保验证集足以代表测试集。
我个人的洗牌经历之一: 将训练集拆分为训练集和验证集后,验证集变得非常容易预测。因此,我看到了良好的学习指标值。然而,该模型在测试集上的表现非常糟糕。