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
相关产品推荐
相关产品推荐

