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

基于图像文件夹与标签文件构建PyTorch数据集及报错解决

解决方案:构建PyTorch数据集并解决读取报错

一、报错根源排查

RuntimeError: Expected a non empty file的常见触发原因:

  • 路径拼接后对应的文件实际不存在(比如文件名拼写错误、大小写不匹配、路径层级错误)
  • 文件本身为空或损坏
  • torchvision.io.read_image对部分老旧图片格式支持有限

快速验证步骤

在调用数据集前先手动检查路径有效性:

test_path = os.path.join(train_path, train_df.iloc[0, 0])
print("文件是否存在:", os.path.exists(test_path))
print("文件大小(字节):", os.path.getsize(test_path) if os.path.exists(test_path) else "文件不存在")

如果输出文件不存在,说明标签文件中的文件名与实际文件夹内的文件不匹配;如果文件大小为0,说明文件损坏需替换。

二、完整数据集构建流程

1. 读取txt标签文件并转为DataFrame

假设txt文件每行格式为文件名 标签(空格分隔),读取并整理为结构化数据:

import pandas as pd
import os
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
from PIL import Image  # 兼容性更强的图片读取方式

def load_labels(txt_path):
    data = []
    with open(txt_path, 'r') as f:
        for line in f:
            line = line.strip()
            if not line:
                continue
            # 根据实际分隔符调整,逗号分隔则用split(',')
            filename, label = line.split()
            data.append({"filename": filename, "label": int(label)})
    return pd.DataFrame(data)

# 加载标签
train_df = load_labels("train.txt")
test_df = load_labels("test.txt")

# 定义文件夹路径
train_path = "train/"
test_path = "test/"

2. 修正自定义Dataset类

加入路径验证逻辑,改用PIL读取图片以兼容更多格式:

class CoViDxDataset(Dataset):
    def __init__(self, df, img_dir, transform=None):
        self.df = df
        self.img_dir = img_dir
        self.transform = transform

    def __len__(self):
        return len(self.df)

    def __getitem__(self, idx):
        row = self.df.iloc[idx]
        img_path = os.path.join(self.img_dir, row["filename"])
        
        # 强制校验文件状态
        if not os.path.exists(img_path):
            raise FileNotFoundError(f"文件不存在:{img_path}")
        if os.path.getsize(img_path) == 0:
            raise ValueError(f"空文件:{img_path}")
        
        # 读取图片并统一转为RGB格式(避免灰度图通道维度问题)
        image = Image.open(img_path).convert("RGB")
        label = row["label"]
        
        if self.transform:
            image = self.transform(image)
        
        return image, label

3. 定义数据预处理(可选)

# 训练集带数据增强
train_transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 测试集仅基础预处理
test_transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

4. 构建Dataset与DataLoader

# 创建数据集实例
train_dataset = CoViDxDataset(train_df, train_path, transform=train_transform)
test_dataset = CoViDxDataset(test_df, test_path, transform=test_transform)

# 构建可迭代的数据加载器
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=4)

三、额外注意事项

  • 确保标签文件中的文件名与实际文件夹内的文件完全一致(包括大小写、后缀名)
  • Windows系统使用多进程加载(num_workers>0)时,需将代码放在if __name__ == "__main__":代码块内
  • 若需使用read_image,需确保图片为JPG/PNG等torchvision官方支持的格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:15:42