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
请记住,文件也是按字母数字顺序提取的
我想对大约 2000 张 类 图像进行分类。所以我使用了 ImageDataGenerator,flow_from_directory.
我做了主目录和2000个子目录
每个子目录有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 请记住,文件也是按字母数字顺序提取的