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

TensorFlow过滤后的子集数据集保存后加载有长度但无内容的问题求助

TensorFlow过滤后的子集数据集保存后加载有长度但无内容的问题求助

Hey Mathlete,我完全懂这种明明数据长度显示正常,但就是拿不到内容的抓狂感!咱们先从最容易忽略的细节开始排查,再一步步解决深层问题:

1. 先解决眼前的低级笔误!

看你加载配对数据集后的遍历代码:

for image, label in pair_ds:  
    print(image)
    print(label)
    arr_img.append(images.numpy()) # 这里用了images,但循环变量是image!
    arr_lab.append(labels.numpy()) # 同理,循环变量是label,不是labels!

你循环里定义的变量是单数的image和label,但后面调用的是复数的images和labels,这直接会触发NameError,导致循环还没往列表里加元素就中断了,所以你看到arr_img和arr_lab是空的——这根本不是数据集的问题,是变量名写错啦!把变量名改一致就能解决这个报错:

for image, label in pair_ds:  
    print(image)
    print(label)
    arr_img.append(image.numpy())
    arr_lab.append(label.numpy())

2. 再排查数据集保存/加载的一致性问题

你保存整个数据集的时候用了train_ds.unbatch(),但保存过滤后的子集时没做同样的处理,这可能导致加载后的数据集结构和你预期的不一样:

  • 保存整个数据集时,你把批量的数据集拆成了单元素(单张图+单个标签)的形式
  • 但保存过滤后的filtered_ds时,如果它还是批量结构,那加载后遍历的每个元素是(批量图数组,批量标签数组),这时候你需要用images和labels作为循环变量,而不是单数的image和label

建议你保持保存逻辑的一致性:要么保存时都unbatch,要么都保持批量。比如保存子集时也加上unbatch:

tf.data.Dataset.save(filtered_ds.unbatch(), os.path.join(path, pairs_names[-1]))

加载后如果需要批量,再手动batch:

pair_ds = tf.data.Dataset.load(os.path.join(test_path, "class[0,1]_ds")).batch(32) # 替换成你原来使用的batch size

3. 避免循环中Lambda的变量捕获陷阱

在循环里用lambda x, y: y == i or y == i+1的时候要注意:Python的lambda会捕获变量的引用,而不是当前循环的具体值。比如当循环结束后,所有lambda里的i都会变成循环的最后一个值,这会导致你保存的数据集实际过滤的是最后一对类别,而不是当前循环的那对!

解决这个问题的办法是把i作为lambda的默认参数传入,固定住当前循环的值:

filtered_ds = data_train.filter(lambda x, y, current_i=i: y == current_i or y == current_i+1)

最后再验证下流程

修改完上面的点后,你可以先不保存,直接遍历filtered_ds看看能不能拿到数据,确认没问题后再保存加载,这样就能一步步定位问题啦!

备注:内容来源于stack exchange,提问作者Mathlete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:44:36