基于图像文件夹与标签文件构建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
相关产品推荐
相关产品推荐

