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

