【问题标题】:Why does not shuffling my train set and validation set result in huge performance gain?为什么洗牌我的训练集和验证集不会带来巨大的性能提升?
【发布时间】:2017-11-10 12:14:43
【问题描述】:

我正在使用 Keras 的 ImageDataGenerator 类,将我的样本加载到神经网络中以解决二元分类问题。

没有。 +ve 训练图像 = 5000,-ve 训练图像 = 5000。类似地,+ve 验证图像 = 5000 和 -ve 验证图像 = 5000。我的批量大小是 64。

我的问题是,当我使用以下代码加载数据和训练时,我的准确率徘徊在 65-67% 左右。但是,如果我设置 shuffle = False,它会在 2-3 个 epoch 后徘徊在 98-100% 左右。

为什么会有如此大的性能提升,洗牌是如何发挥作用的?

另外,我注意到,从 flow_from_directory 生成的每个批次都包含完全来自任何一个类的图像。将正样本和负样本放在一个批次中是否有助于更真实地衡量准确性?

# data augmentation configuration we will use for training
train_datagen = ImageDataGenerator(preprocessing_function=HPF)

# data augmentation configuration we will use for testing
test_datagen = ImageDataGenerator(preprocessing_function=HPF)

# generator, for train data
train_generator = train_datagen.flow_from_directory(
        './data/train',  # this is the target directory
        target_size=(512, 512),  # all images will be resized to 512x512
        batch_size=batch_size,
        color_mode='grayscale',
        shuffle=True,
        class_mode='binary')  # since we use binary_crossentropy loss, we need binary labels

# this is a similar generator, for validation data
validation_generator = test_datagen.flow_from_directory(
        './data/validation',
        target_size=(512, 512),
        color_mode='grayscale',
        batch_size=batch_size,
        shuffle=True,
        class_mode='binary')

Shuffle = True 实际上是做什么的?由于每批中的图像仍然要么全部为正面,要么全部为负面。

可以使用以下代码打印批次:

for i in train_generator:
    idx = (train_generator.batch_index - 1) * train_generator.batch_size
    print(train_generator.filenames[idx : idx + train_generator.batch_size])

【问题讨论】:

  • 你的班级不平衡吗?您的数据集中有多少个0s 和1s?
  • 我的课很平衡。 1 和 0 的数量相等。

标签: tensorflow deep-learning keras


【解决方案1】:

我认为最可能的原因是训练批次和验证批次之间存在某种关联。例如,当训练批次都是正数时,验证也是如此。您的训练集和验证集具有相同的长度这一事实可能会加剧这种情况:相关性可以在多个时期中存活下来。

无论如何,我宁愿相信随机洗牌获得的性能。任何与这些数字没有改组的显着偏差都表明您的数据存在相关性,并提醒您为什么需要使用随机改组并且如此常用。

编辑

这是您所描述的数据中可能存在的相关性。您的训练和验证集有 10000 张图像。两组中的前 5000 个都是/可能都是正面的。因此,在训练期间,您的网络无论如何都会学会将样本标记为阳性。验证样本也是正面的,所以这很合适。然后,我们对所有负面图像进行训练。然后,无论如何,您都会对样本进行调整并将样本标记为负样本。这也与您的验证样本恰好也是负数相关,并且您最终获得了良好的验证分数。

让自己相信非混洗训练的实际性能很差的一种方法是在整个验证集上进行验证,而不是在单个验证批次上进行验证——正如我假设你正在做的那样。

【讨论】:

  • 您能解释一下吗?我的问题与隐写术有关,因此 -ve 样本仅从 +ve 样本生成。我需要区分这两个。因此,我将我的图像数据分成两组,每组 5000 个。一个成为训练集的 +ve 样本,而另一组成为 +ve 验证集。对于这些集合中的每一个,都添加了它们对应的 stego(-ve) 样本来作为第二类进行训练和验证。因此,由于图像完全不同,训练集和验证集之间怎么可能存在相关性。
  • 谢谢。我明白你的意思。我刚刚检查过,即使报告的准确率是 98%,但在验证集上它下降到了 49%。
  • 请同时回答问题的第二部分。
  • Shuffle=True 应该随机化所有样本,而不是批次,据我所知。如果不是这种情况,您可以提交错误报告。
猜你喜欢
  • 2018-10-10
  • 2018-09-05
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
相关资源
最近更新 更多