keras - 图片和标签在 ImageDataGenerator.flow_from_directory 中不匹配

keras - image and label don't match in ImageDataGenerator.flow_from_directory

我想对大约 2000 张 类 图像进行分类。所以我使用了 ImageDataGenerator,flow_from_directory.

我做了主目录和2000个子目录
在主目录中(test1)

在子目录

每个子目录有20张图片

(总共约 40k 张图片)

然后我用这个脚本检查了生成器。

from tensorflow.keras.preprocessing.image import ImageDataGenerator

trainDataGen = ImageDataGenerator(rescale=1./255)
trainGenSet = trainDataGen.flow_from_directory(
    './test1',
    batch_size=8,
    target_size=(64,64),
    class_mode='categorical',
    color_mode='grayscale'
)
import numpy as np
import matplotlib.pyplot as plt

a = trainGenSet.next()

plt.imshow(a[0][0])
print(np.argmax(a[1][0]))
plt.show()

然后我发现那张图片与标签不符

ex) a[0][0] 有第 300 张图片,但是 a[1][0] 有 1948 张!!

但是生成器工作正常不到 10 类。

我测试了10类(数字0~9的图像)

然后生成器工作正常!

为什么生成器可以生成小于 10 类 的正确对而不能生成大于 10 类 的正确对??

在 flow_from_directory 中您没有指定参数 shuffle 的值,因此它默认为 True。尝试将其设置为 False。还要记住,在 python 中,文件和目录 a 是按字母数字顺序获取的。例如,您的 classes 列表就像 [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17 ,18,19,20] class 目录将由生成器以 0,1,10,11,12,13,14,15,16,17,18,19,2,20 的顺序获取, 3,4,5,6,7,8,9。这就是为什么当你有超过 10 个子目录时,顺序不是你所期望的。您可以通过为子目录名称使用“零”填充来避免这种情况,例如 0000 0001 0002 0003 ETC 0001999 请记住,文件也是按字母数字顺序提取的