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

解决深度学习模型中「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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 00:03:24