fastai自定义数据集加载时触发无法推断目标类型的报错问题
fastai自定义图像数据集加载报错处理
报错信息
抛出的异常内容:
Exception: Can't infer the type of your targets. It's either because your data source is empty or because your labeling function raised an error.
翻译后:
无法推断目标类型。原因是数据源为空,或是标注函数执行报错。
代码问题定位
你的代码有两处核心错误:
ImageDataBunch.from_folder的train=path参数传了绝对路径。from_folder的train参数是相对于根路径path的子文件夹名,传绝对路径会让fastai在根路径下找不到对应子目录,直接导致数据源为空。- 你已经写好了从文件名提取标签的正则
pat,但加载数据时完全没有使用。from_folder默认从图片所在的父文件夹名称提取标签,如果你的所有图片直接放在解压后的根目录下、没有按类别建子文件夹,fastai找不到标签来源,就会触发报错。
对应解决方法
根据你的数据集结构选一种即可:
方法1:按类别整理文件夹结构(图像分类通用标准结构)
在解压后的数据集根路径下,按类别建子文件夹,每个子文件夹存放对应类别的所有图片,结构示例:
数据集根路径/ ├── 类别1/ │ ├── 图片1.jpg │ ├── 图片2.jpg │ └── ... └── 类别2/ ├── 图片3.jpg ├── 图片4.jpg └── ...
修改数据加载代码,去掉错误的train=path参数:
data = ImageDataBunch.from_folder( path, valid_pct=0.2, ds_tfms=get_transforms(), size=160 ).normalize(imagenet_stats)
方法2:从文件名提取标签(匹配你写的正则规则)
如果你的图片文件名本身包含类别信息(比如类别_编号.jpg格式),改用from_name_re加载,直接用你定义好的正则:
fnames = get_image_files(path) np.random.seed(2) pat = r'/([^/]+)_\d+\.(png|jpg|jpeg)$' data = ImageDataBunch.from_name_re( path, fnames, pat, valid_pct=0.2, ds_tfms=get_transforms(), size=160 ).normalize(imagenet_stats)
冗余代码说明
- 自定义的
URL类仅用于下载数据集,不影响报错逻辑,如果是本地数据集可以直接删掉,untar_data传本地压缩包路径即可。 - 注释掉的Pets数据集测试代码可以直接删除,不影响运行。
内容的提问来源于stack exchange,提问作者Quinn
相关产品推荐
相关产品推荐

