如何修复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
相关产品推荐
相关产品推荐

