1

我正在 Keras 中使用 CNN 训练、验证和测试图像分类器。我正在使用 flow_from_directory 生成训练、验证和测试数据集。

问题是,在 test_datagen 中,当我将 shuffle 标志设为 True 时,准确性下降,系统似乎没有给出任何好的结果,但我在训练和验证生成器中保持 shuffle = True。生成器如下:

训练和验证数据生成器:

datagen = ImageDataGenerator(rescale=1./255,
                                   validation_split=0.20) # set validation split

train_generator = datagen.flow_from_directory(
    data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    subset='training',
    shuffle=True) 

validation_generator = datagen.flow_from_directory(
    data_dir, # same directory as training data
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    subset='validation',
    shuffle=True)

测试数据生成器如下:

test_datagen = ImageDataGenerator(rescale=1./255) # set test split


test_generator = test_datagen.flow_from_directory(
    test_dir, 
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='categorical',
    shuffle=True)

对于模型.预测:

  1. shuffle= False结果如下:

精度:0.6472019464720195

  1. shuffle= True结果如下:

精度:0.30170316301703165

如果有人能解释这种行为,我将不胜感激

4

1 回答 1

0

洗牌数据的目的是减少方差并确保模型保持一般性和过度拟合。

所以当你设置

洗牌=真

你得到了真正的准确性,因为改组减少了方差并防止了过度拟合,而且你的数据可能有点嘈杂,所以由于你没有提供整个代码,我必须建议你使用 dropout。

此外,请务必监控您在训练集和测试集上的损失,因为您的模型可能会过度拟合数据。

您可以查看此链接以了解如何监控您的损失并随着时间的推移降低您的 learning_rate

这是关于为什么改组对您的模型有好处的另一个参考。

另外这里是我在网上找到的一篇文章Image Data Pre-Processing for Neural Networks,我认为这在一篇关于如何训练网络的文章中肯定很好。

编辑:

洗牌=真

shuffle 应该会产生更好的结果,特别是当您运行更多 epoch 时,因此在设置 shuffle = True 时增加 epoch 的数量应该可以解决问题。

设置 shuffle = True 时准确性较低的原因是因为类的顺序发生了变化。

洗牌=假

1.jpg -> 熊猫
2.jpg -> 猫
3.jpg -> 狼

洗牌=真

2.jpg -> 猫
3.jpg -> 狼
1.jpg -> 熊猫

简单来说,当你打乱数据时,你基本上只是从随机类中挑选随机图片,并要求模型对其进行分类,因此模型很难快速捕捉模式,它只需要更多时间(epochs)。

另一方面,当 shuffle = False 时,您只是为模型提供了一个按字母数字顺序排序的数据集。

如果增加 epochs 的数量仍然不能提高模型的性能,我建议你手动预处理图像,因为它们可能很嘈杂,同时确保在训练模型时使用BatchNormalization 。

于 2020-10-28T06:23:09.530 回答