解决深度学习模型中「too many values to unpack (expected 3)」报错
「too many values to unpack (expected 3)」错误修复方案
一、直接触发报错的原因
你的函数get_dataset_partition_tf最后返回了4个值:return train_ds, val_ds ,val_ds, test_ds(重复写了一次val_ds),但接收返回值时只声明了3个变量,数量不匹配直接导致拆包错误。
二、函数内部的其他必改错误
除了返回值问题,代码里还有多处逻辑和拼写错误,不修复的话即使解决拆包问题也无法正常划分数据集:
- 参数拼写错误:函数定义里写的是
trin_split,但代码里用的是train_split,名称不匹配会导致参数无法正常读取。 - 变量未定义:
test_split没在函数参数里声明,assert语句里用到的test_split不存在;同时val_split_ds_size也是未定义的变量。 val_size计算错误:你把ds.skip(val_split_ds_size)(一个数据集对象)赋值给了val_size,但val_size应该是整数类型的验证集样本数,正确写法是int(val_split * ds_size)。- 数据集划分逻辑错误:TensorFlow的
take和skip是基于原数据集的操作,你当前写法会导致验证集和测试集范围重叠。正确逻辑是:先取训练集,再从剩余数据里取验证集,最后剩下的就是测试集。
三、修复后的完整代码
def get_dataset_partition_tf(ds, train_split=0.8, val_split=0.1, test_split=0.1, shuffle=True, shuffle_size=10000): ds_size = len(ds) assert (train_split + test_split + val_split) == 1, "三个划分比例之和必须为1" if shuffle: ds = ds.shuffle(shuffle_size, seed=12) train_size = int(train_split * ds_size) val_size = int(val_split * ds_size) train_ds = ds.take(train_size) # 从训练集之后的剩余数据中取验证集 val_ds = ds.skip(train_size).take(val_size) # 跳过训练集和验证集,剩余部分作为测试集 test_ds = ds.skip(train_size + val_size) return train_ds, val_ds, test_ds
四、调用验证
保持原有接收方式即可正常运行:
train_ds, val_ds, test_ds = get_dataset_partition_tf(data)
内容的提问来源于stack exchange,提问作者Ashique Mahmud
相关产品推荐
相关产品推荐

