You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:06:02