You need to enable JavaScript to run this app. fastai自定义数据集加载时触发无法推断目标类型的报错问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 14:54:04