调用 Keras flow_from_directory() 方法的正确方法是什么?

数据挖掘 喀拉斯
2021-09-17 19:46:31

下面的文章中有一个说明,数据集需要分为训练、验证和测试文件夹,其中测试文件夹不应包含标记的子文件夹。相反,它应该只包含一个文件夹(即 Test_folder)。

当我使用以下代码时,我收到输出消息,指出未找到图像。

Ver.1:
test_generator = test_datagen.flow_from_directory(
    "dataset\\test\\test_folder\\",
    target_size=(IMG_WIDTH, IMG_HEIGHT),
    batch_size=1,
    class_mode=None,
    shuffle=False,
    seed=10)

Output message: "Found 0 images belonging to 0 classes.".

相反,如果我使用与 train 和 validation 文件夹中相同的文件夹结构(dataset\test\class_a\test_1.jpg 等),一切似乎都很好,并且我设法评估了我的模型。

Ver.2:
test_generator = test_datagen.flow_from_directory(
    "dataset\\test\\",
    target_size=(IMG_WIDTH, IMG_HEIGHT),
    batch_size=32,
    class_mode='categorical',
    shuffle=False,
    seed=10)

Output message: "Found 1500 images belonging to 3 classes.".

我还尝试了指定“类”属性但仍找到 0 个图像的建议。

Ver.3:
test_generator = test_datagen.flow_from_directory(
    "dataset2\\test\\test_folder\\",
    target_size=(IMG_WIDTH, IMG_HEIGHT),
    batch_size=1,
    classes=['test'],
    class_mode=None,
    shuffle=False,
    seed=10)

Output message: Found 0 images belonging to 1 classes.

因此,调用 flow_from_directory() 方法的正确方法是什么?为什么我会收到未找到文件的消息?当我使用 Ver.2 解决方案时,我的模型是否未正确评估?

3个回答

请在此处找到可行的解决方案。

生成器看起来像:

# Data generators
train_datagen = ImageDataGenerator(
      rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')

# Note that the validation data should not be augmented!
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        # This is the target directory
        train_dir,
        # All images will be resized to 150x150
        target_size=(150, 150),
        batch_size=batch_size,
        # Since we use categorical_crossentropy loss, we need binary labels
        class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=batch_size,
        class_mode='categorical')

确保以正确的方式存储图像。例如

...images/train/class1/
...images/train/class2/
...images/val/class1/
...images/val/class2/

生成器函数确实需要这种结构。因此,请确保 train/test 目录中的每个类都有子文件夹。

您还可以使用该data generator功能进行预测,如本文所述

上述场景(Peter 提供)假设 validation_dir 是test_datagen.flow_from_directory(). 所以逻辑是只有你在weblinktest_dir中提供的一对一文件夹结构(./test/folder/image

test_datagen.flow_from_directory( validation_dir,...)是一种方法级联,它是一种允许在同一个对象上调用多个方法的语法。这样就可以使用 的功能了flow_from_directory()

它找不到任何类,因为 test 没有子目录。如您在上面的日志输出中所见,如果没有类,它就无法加载您的图像。但是有一个解决方法,因为您可以指定测试目录的父目录并指定您只想加载测试“类”:

datagen = ImageDataGenerator()
test_data = datagen.flow_from_directory('.', classes=['test'])