如何使用tf.keras.image_dataset_from_directory获取数据集的验证子集
报错原因解释
你遇到的too many values to unpack (expected 2)报错是因为:当你给tf.keras.utils.image_dataset_from_directory指定subset参数时,函数仅会返回1个对应子集的tf.data.Dataset对象,而不是训练+验证两个数据集,你用两个变量接收自然会触发解包错误。
70/15/15 数据集拆分实现步骤
你可以先拆分出70%训练集、30%的验证+测试混合集,再把30%混合集对半拆分得到15%验证集、15%测试集,实现代码如下:
import tensorflow as tf # 第一步:拆分70%训练集 train_ds = tf.keras.utils.image_dataset_from_directory( train, # 替换为你的数据集根目录路径 labels="inferred", label_mode="categorical", color_mode="grayscale", batch_size=32, seed=1, # 固定随机种子保证拆分可复现 image_size=(48, 48), validation_split=0.3, subset="training" ) # 第二步:拆分出30%的验证+测试混合集 val_test_ds = tf.keras.utils.image_dataset_from_directory( train, labels="inferred", label_mode="categorical", color_mode="grayscale", batch_size=32, seed=1, # 必须和上一步种子完全一致,避免数据泄漏 image_size=(48, 48), validation_split=0.3, subset="validation" ) # 第三步:将混合集对半拆为15%验证集、15%测试集 val_test_batch_count = tf.data.experimental.cardinality(val_test_ds).numpy() val_ds = val_test_ds.take(val_test_batch_count // 2) test_ds = val_test_ds.skip(val_test_batch_count // 2) # 可选:验证各数据集大小是否符合预期 print(f"训练集batch数:{tf.data.experimental.cardinality(train_ds).numpy()}") print(f"验证集batch数:{tf.data.experimental.cardinality(val_ds).numpy()}") print(f"测试集batch数:{tf.data.experimental.cardinality(test_ds).numpy()}")
注意事项
- 两次调用
image_dataset_from_directory时除subset外所有参数必须完全一致,尤其是seed参数,否则会出现训练集和验证/测试集样本重叠的问题 - 如果数据集总样本数不是偶数,拆分后差1-2个样本不影响训练效果,无需额外处理
- 拆分完成后可以按需对三个数据集执行
prefetch、数据增强等后续操作
内容的提问来源于stack exchange,提问作者SS-Salt
相关产品推荐
相关产品推荐

