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

如何修复tf.keras加载数据集时出现ValueError: too many values to unpack (expected 2)错误

错误原因

tf.keras.preprocessing.image_dataset_from_directory返回的是tf.data.Dataset类型的批次迭代器,而非直接打包好的完整数据集元组。该迭代器每遍历一次只会返回单组*(当前批次特征张量, 当前批次标签张量)*,返回的总组数由数据集大小和batch_size共同决定,远不止2组。你写的(x_train, y_train), (x_test, y_test) = train_ds试图将迭代器拆分为2组各2个元素,和实际返回结构不匹配,因此触发too many values to unpack报错。
此外你的拆分逻辑存在问题:你已经通过两次调用接口分别生成了训练集train_ds和验证集val_ds,不需要再从train_ds中二次拆分测试集;同时两次调用的validation_split参数分别为0.1和0.2,拆分比例不一致,会存在数据泄漏风险,建议统一为同一个值。

修复方案

方案1:直接使用Dataset对象训练(官方推荐,性能最优)

TensorFlow的模型训练接口原生支持传入tf.data.Dataset对象,不需要手动解包成数组,直接调用fit方法即可:

model.fit(
  train_ds,
  validation_data=val_ds,
  epochs=你的训练轮次
)

方案2:将数据集加载到内存转为numpy数组(仅适合小数据集)

如果你的场景必须拿到全量的数组格式数据,可以遍历迭代器拼接所有批次:

import numpy as np

# 拼接训练集
x_train = []
y_train = []
for batch_imgs, batch_labels in train_ds:
    x_train.append(batch_imgs.numpy())
    y_train.append(batch_labels.numpy())
x_train = np.concatenate(x_train, axis=0)
y_train = np.concatenate(y_train, axis=0)

# 拼接验证集
x_val = []
y_val = []
for batch_imgs, batch_labels in val_ds:
    x_val.append(batch_imgs.numpy())
    y_val.append(batch_labels.numpy())
x_val = np.concatenate(x_val, axis=0)
y_val = np.concatenate(y_val, axis=0)

注意:该方案会将所有数据加载到内存,数据集过大时会触发内存不足报错,大数据集请优先使用方案1。

内容的提问来源于stack exchange,提问作者Pimtida Promaut

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 03:06:01