为什么不改组我的火车组和验证装置会带来巨大的性能提升?

时间:2017-06-08 16:51:03

标签: tensorflow deep-learning keras

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

没有。 + ve train images = 5000,-ve train images = 5000.类似地,+ ve验证图像= 5000和-ve验证图像= 5000。我的批量是64。

我的问题是,当我使用以下代码加载数据和培训时,我的准确率徘徊在65-67%左右。但是,如果我设置shuffle = False,它会在2-3个时期之后徘徊在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])

1 个答案:

答案 0 :(得分:0)

我认为最可能的原因是您在列车和验证批次之间存在某种相关性。例如,当培训批次都是肯定的时候,那么验证也是。您的训练和验证集具有相同的长度,这可能会加剧这种情况:相关性可以通过时代生存。

在任何情况下,我宁愿相信通过随机改组获得的性能。没有改组的任何重大偏离这些数字都表明您的数据存在相关性,并提醒您为何需要使用随机改组并且如此常用。

修改

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

一种让自己相信未洗脑培训的真实表现不好的方法是验证整个验证集,而不是单个验证批次 - 正如我假设您正在做的那样。