如何用单文件夹与标签文件创建TensorFlow验证数据集?
解决ImageNet验证集加载时类别识别错误的问题
问题排查步骤
验证标签加载是否正确
先确认加载的val_labels是否包含1000个不同类别,运行以下代码:print("标签唯一值数量:", len(set(val_labels)))- 若输出不是1000,说明
val.txt格式或路径存在问题:- 检查
val.txt是否每行仅含一个整数类别编号,无多余空格、空行或注释; - 确认
path_val_labels指向的是正确的验证集标签文件,而非其他文件。
- 检查
- 若输出不是1000,说明
确认图片与标签的顺序匹配
image_dataset_from_directory默认按文件名的字母数字顺序加载图片,需确保val_labels的顺序与图片顺序完全对应(第N个标签对应第N个加载的图片)。运行以下代码验证:import os from pathlib import Path val_image_paths = sorted([str(path) for path in Path(path_val).glob('*.jpg')]) # 打印前5张图片文件名和对应标签 print("前5张图片:", [os.path.basename(p) for p in val_image_paths[:5]]) print("对应标签:", val_labels[:5])- 若文件名顺序与标签不匹配,需调整
val_labels的排序,使其与图片文件名的字母数字顺序一致。
- 若文件名顺序与标签不匹配,需调整
核对图片与标签的数量一致性
确保图片数量和标签数量完全相等:print("图片总数:", len(val_image_paths)) print("标签总数:", len(val_labels))- 若数量不等,检查验证集文件夹是否包含非图片文件,或
val.txt的行数是否正确。
- 若数量不等,检查验证集文件夹是否包含非图片文件,或
替代解决方案:手动构建数据集
若上述排查后仍无法解决问题,可绕过image_dataset_from_directory,手动构建验证集数据集,灵活性更高:
import tensorflow as tf import numpy as np from pathlib import Path path_val = './ILSVRC/Data/val/' path_val_labels = './ILSVRC/Data/val.txt' # 获取排序后的图片路径和标签 val_image_paths = sorted([str(path) for path in Path(path_val).glob('*.jpg')]) val_labels = list(np.loadtxt(path_val_labels).astype(int)) # 定义图片加载函数 def load_and_preprocess_image(path, label): # 读取图片 img = tf.io.read_file(path) # 解码为JPEG格式 img = tf.image.decode_jpeg(img, channels=3) # 调整图片尺寸 img = tf.image.resize(img, (224, 224), interpolation='bilinear') # 根据模型需求添加预处理(例如归一化) # img = img / 255.0 return img, label # 构建数据集 val_dataset_224 = tf.data.Dataset.from_tensor_slices((val_image_paths, val_labels)) # 并行加载图片 val_dataset_224 = val_dataset_224.map(load_and_preprocess_image, num_parallel_calls=tf.data.AUTOTUNE) # 打乱、分批、预取 val_dataset_224 = val_dataset_224.shuffle(buffer_size=5000).batch(32).prefetch(tf.data.AUTOTUNE)
内容的提问来源于stack exchange,提问作者Frost
相关产品推荐
相关产品推荐

