Keras的ImageDataGenerator.flow_from_directory大类别数下图像标签不匹配问题
ImageDataGenerator 多类别标签不匹配问题解答
核心原因
flow_from_directory 方法默认会按照子文件夹名称的字符串字典序生成类别索引映射,而非数值排序规则。
你在10类别以内测试时,0~9的数字字符串的字典序与数值排序完全一致,因此标签匹配正常。当类别数超过10后,数字字符串的字典序和数值排序会出现严重偏差:
举个排序示例,字典序下的顺序为 "1" < "10" < "100" < ... < "1999" < "2" < "20" < "200" < ...,你认为命名为300的文件夹应该对应索引299(0起始),但实际排序中所有以1、2开头的文件夹都会排在"300"前面,最终它的索引就会远大于预期,和你遇到的300类对应标签1948的现象完全吻合。
修复方案
手动传入classes参数,强制指定类别映射顺序即可解决问题:
from tensorflow.keras.preprocessing.image import ImageDataGenerator trainDataGen = ImageDataGenerator(rescale=1./255) # 按你的需求生成顺序正确的类别名称列表,示例为文件夹命名为0~1999的字符串的场景 class_order = [str(i) for i in range(2000)] trainGenSet = trainDataGen.flow_from_directory( './test1', batch_size=8, target_size=(64,64), class_mode='categorical', color_mode='grayscale', classes=class_order, # 手动指定类别顺序,覆盖默认字典序 shuffle=False # 验证阶段可关闭shuffle方便核对标签 )
你可以打印生成器的class_indices属性,核对每个文件夹对应的标签是否符合预期:
print(trainGenSet.class_indices)
内容的提问来源于stack exchange,提问作者JH.KIM
相关产品推荐
相关产品推荐

