使用tf.keras.image_dataset_from_directory洗牌时标签图片不匹配的解决咨询
解决tf.keras.image_dataset_from_directory洗牌时标签与图片不匹配的问题
首先明确:tf.keras.utils.image_dataset_from_directory本身会自动将图片与对应标签绑定后再执行洗牌操作,出现标签不匹配大概率是路径设置错误或使用误区导致的,以下是具体排查和解决方法:
1. 检查数据集路径是否正确
该函数要求传入的directory参数必须直接指向包含类别子文件夹的目录。根据你的目录结构,data_path应该设置为dataset/train(训练集)或dataset/test(测试集),而不是根目录dataset。如果指向根目录,函数会把train、test当成类别,自然会出现标签错误。
修正后的代码:
import tensorflow as tf data_path = "dataset/train" # 指向训练集类别文件夹的父目录 train_dset = tf.keras.utils.image_dataset_from_directory( directory=data_path, batch_size=32, image_size=(256,256), label_mode="int", shuffle=True )
2. 验证图片与标签的对应关系
可以取出一批数据直观验证标签是否正确:
import matplotlib.pyplot as plt # 获取类别名称 class_names = train_dset.class_names # 取出第一批数据 for images, labels in train_dset.take(1): # 展示前3张图片及其标签 for i in range(3): ax = plt.subplot(1, 3, i+1) plt.imshow(images[i].numpy().astype("uint8")) plt.title(class_names[labels[i]]) plt.axis("off") plt.show()
3. 手动实现绑定后洗牌(自定义场景)
如果需要完全自定义洗牌逻辑,可以先创建不洗牌的数据集,再对绑定好的(图片, 标签)对整体洗牌:
# 创建不洗牌的数据集,确保图片与标签一一对应 train_dset_unshuffled = tf.keras.utils.image_dataset_from_directory( directory=data_path, batch_size=32, image_size=(256,256), label_mode="int", shuffle=False ) # 对绑定后的数据集整体洗牌,buffer_size建议大于样本总数以保证充分洗牌 train_dset_shuffled = train_dset_unshuffled.shuffle(buffer_size=1000)
内容的提问来源于stack exchange,提问作者Chinmaya Tewari
相关产品推荐
相关产品推荐

