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

PyTorch自定义DonutOCRDataset返回长度0问题排查求助

排查自定义DonutOCRDataset len()返回0的问题

1. 先确认文件路径是否正确

  • 检查Dataset实例化时传入的root_dir参数是否准确,比如训练集需传入dataset/train,而非仅dataset,否则会找不到子目录内的metadata.jsonl
  • 验证metadata.jsonl的路径拼接逻辑,在Dataset的__init__中必须用os.path.join(root_dir, "metadata.jsonl")生成文件路径,避免硬编码错误路径
  • 可以加入路径校验代码快速定位问题:
import os
metadata_path = os.path.join(root_dir, "metadata.jsonl")
assert os.path.exists(metadata_path), f"Metadata file not found at {metadata_path}"

2. 检查metadata.jsonl文件本身

  • 确认文件非空:直接打开文件查看是否有内容,空文件加载后自然无样本
  • 验证每行JSON格式合法:jsonl要求每行是独立的JSON对象,不能用逗号连接所有内容,也不能有引号不匹配、逗号缺失等语法错误。用以下代码测试加载:
import json
samples = []
with open(metadata_path, 'r', encoding='utf-8') as f:
    for idx, line in enumerate(f):
        line = line.strip()
        if not line:
            continue  # 跳过空行
        try:
            data = json.loads(line)
            samples.append(data)
        except json.JSONDecodeError as e:
            print(f"Invalid JSON at line {idx+1}: {e}")
print(f"Loaded {len(samples)} samples from metadata")

如果输出为0,说明文件格式错误或全是空行。

3. 检查图片文件与metadata的匹配

  • 确认metadata中的图片文件名和目录下的图片完全一致:包括大小写(Linux/macOS下区分大小写,比如img.jpg和IMG.JPG是不同文件)、后缀名
  • 检查Dataset中是否错误过滤了所有样本:如果代码中有类似以下逻辑,需确认是否所有图片都存在,避免因文件名不匹配导致全部样本被跳过:
for data in metadata_samples:
    img_path = os.path.join(root_dir, data["image"])
    if not os.path.exists(img_path):
        print(f"Skipping missing image: {img_path}")
        continue
    self.samples.append(data)

4. 检查__len__方法的实现

  • 确保Dataset的__len__方法返回的是样本列表的实际长度,比如:
def __len__(self):
    return len(self.samples)

如果self.samples在__init__中未被正确填充(比如metadata加载出错导致列表为空),len()自然返回0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:50:06