Torchvision加载CelebA数据集时无法识别已存在的下载文件夹问题
报错核心原因
torchvision内置的CelebA数据集加载逻辑,会同时校验图片文件、标注文件、属性文件、边界框文件、分区文件共5类资源的完整性和MD5值,哪怕图片下载完成,只要其余任意一类文件缺失、下载不完整、校验失败,都会触发该报错。
国内网络环境下该问题高发:CelebA默认的谷歌云盘下载源被墙,通常只有图片分片能下载成功,其余元数据文件下载中断后,残留的不完整文件不会被自动清理,后续就算重新设置download=True,代码也会跳过已存在的不完整文件,始终无法通过校验。
解决方案
方案1:手动补全所有所需文件
在你设置的root目录下新建celeba文件夹,将以下所有资源放入该文件夹即可:
- 已下载完成的
img_align_celeba图片文件夹 - 5个元数据文件:
list_attr_celeba.txt、list_bbox_celeba.txt、list_landmarks_align_celeba.txt、list_eval_partition.txt、identity_CelebA.txt
所有元数据文件可从CelebA官方站点或国内镜像站下载,无需额外解压,直接放入对应目录即可。
方案2:自定义数据集类跳过元数据校验
如果训练只需要用到图片,不需要属性、标注等元数据,可以自定义轻量数据集类直接加载图片,完全避开官方CelebA类的校验逻辑,示例代码如下:
import os from PIL import Image from torch.utils.data import Dataset from torchvision import transforms class CustomCelebA(Dataset): def __init__(self, img_dir, transform=None): self.img_dir = img_dir self.img_list = [f for f in os.listdir(img_dir) if f.endswith('.jpg')] self.transform = transform def __len__(self): return len(self.img_list) def __getitem__(self, idx): img_path = os.path.join(self.img_dir, self.img_list[idx]) img = Image.open(img_path).convert('RGB') if self.transform: img = self.transform(img) return img # 调用示例 celeba_transforms = transforms.Compose([ transforms.CenterCrop(140), transforms.Resize([64, 64]), transforms.ToTensor() ]) dataset = CustomCelebA(img_dir="你的img_align_celeba文件夹完整路径", transform=celeba_transforms)
方案3:代理环境下重新下载完整数据集
如果需要使用官方CelebA类的所有功能,可以先配置全局代理,删除root目录下所有已下载的CelebA相关文件,重新运行带download=True参数的代码,确保所有资源完整下载并通过校验。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

