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

FastAi使用GrandparentSplitter拆分数据集验证集为空问题求助

问题原因与解决方案

核心问题1:数据集扫描范围错误

你调用db.dataloaders()时仅传入了path/'train/images'作为根路径,get_image_files只会扫描该路径下的图片,完全不会读取valid文件夹下的内容,GrandparentSplitter找不到归属验证集的样本,自然返回空验证集。

核心问题2:标签函数路径写死

现有label_func固定返回train/masks下的文件,后续就算扫描到验证集图片,也会找不到对应valid/masks下的掩码文件。

修复步骤

1. 修正标签匹配函数

动态根据输入图片的路径层级,匹配对应掩码位置:

def label_func(x): 
    # x为单张图片的完整路径,通过父层级自动判断归属train/valid
    return x.parent.parent/'masks'/f'{x.stem}_mask.png'

2. 调整数据集根路径

调用dataloaders时传入总根目录,让工具同时扫描训练、验证集的图片:

codes = np.array(['background', 'prostate'])

db = DataBlock(blocks=(ImageBlock(), MaskBlock(codes)),
              splitter=GrandparentSplitter(train_name='train', valid_name='valid'),
              get_items=get_image_files,
              get_y=label_func)

# 传入数据集总根路径,不要限制为train/images
dls = db.dataloaders(path, bs=1)
dls.show_batch()

排查验证方法

如果修改后仍有问题,可通过以下步骤定位:

  • 打印所有扫描到的图片路径确认覆盖范围:print(get_image_files(path))
  • 手动验证拆分逻辑是否正常:
    all_imgs = get_image_files(path)
    train_idx, valid_idx = GrandparentSplitter()(all_imgs)
    print(f"训练集样本数:{len(train_idx)}, 验证集样本数:{len(valid_idx)}")
    
  • 随机取一张图片调用标签函数,确认返回的掩码路径存在:print(label_func(all_imgs[0]).exists())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 15:12:02