我正在使用Keras的ImageDataGenerator类,在神经网络中加载我的样本以解决二进制分类问题 .
没有,列车图像= 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 回答
我认为最可能的原因是您在列车和验证批次之间存在某种相关性 . 例如,当培训批次都是肯定的时候,那么验证也是 . 您的训练和验证集具有相同的长度这一事实可能会加剧这种情况:相关性可以通过时代生存 .
在任何情况下,我宁愿相信通过随机改组获得的性能 . 没有改组的任何显着偏离这些数字都表明您的数据存在相关性,并提醒您为什么需要使用随机改组并且如此常用 .
编辑
这是您描述的数据中可能的相关性 . 您的训练和验证集有10000张图像 . 两组中的前5000个都是/可能都是正数 . 因此,在培训期间,无论如何,您的网络都会将样本标记为正数 . 验证样本也是正面的,所以这很合适 . 然后,我们训练所有负面图像 . 无论如何,您都可以自适应并标记样本为负数 . 这也与您的验证样本相关,这些样本恰好也是负面的,并且您最终获得了良好的验证分数 .
让自己确信无组织培训的真实表现不好的一种方法是验证整个验证集,而不是单个验证批 - 就像我假设你正在做的那样 .