如何在PyTorch中加载Kaggle下载的ImageNet数据集?
解决Kaggle版ImageNet在PyTorch中的加载问题
问题背景
从Kaggle下载ImageNet数据集(原网站已无法获取)后,使用PyTorch官方的torchvision.datasets.ImageNet()加载时触发错误:
RuntimeError: The archive ILSVRC2012_devkit_t12.tar.gz is not present in the root directory or is corrupted. You need to download it externally and place it in
原因是Kaggle提供的ImageNet包不包含该devkit压缩包,且val文件夹的结构不符合PyTorch加载要求。
数据集目录结构
当前Kaggle下载的数据集目录如下:
/media/SSD2/ILSVRC/ |----Annotation |----ImageSets |----Data |----CLS-LOC |----test |----ILSVRC2012_val_00000009.JPEG |----ILSVRC2012_val_00000010.JPEG |----... |----train |----n01440764 # 类别文件夹 |----ILSVRC2012_val_00000010.JPEG |----ILSVRC2012_val_00000010.JPEG |----n01443537 |----... |----val |----ILSVRC2012_val_00000009.JPEG |----ILSVRC2012_val_00000010.JPEG |----...
原尝试的加载代码
我之前使用的加载逻辑(带自定义数据变换):
加载代码
trainset = torchvision.datasets.ImageNet(root='path_to_dataset', split='train', download=False, transform=transform_train) trainloader = torch.utils.data.DataLoader(trainset, batch_size=bs, shuffle=True, num_workers=8)
自定义变换
transform_train = transforms.Compose([ transforms.RandomCrop(32, padding=4), transforms.Resize(size), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)), ])
解决步骤
1. 补充ILSVRC2012_devkit_t12.tar.gz
PyTorch的ImageNet数据集类依赖该devkit文件解析类别标签,需单独下载后放到数据集根目录(即/media/SSD2/ILSVRC/下),无需手动解压,torchvision会自动处理。
2. 调整val文件夹结构
Kaggle下载的val文件夹直接存放所有图片,而PyTorch要求val文件夹下按类别划分子目录。可通过以下脚本整理:
#!/bin/bash # 切换到val目录(根据实际路径调整,示例:cd /media/SSD2/ILSVRC/Data/CLS-LOC/val) cd val # 从devkit读取标签映射,创建对应类别文件夹 while read line; do arr=($line) mkdir -p "${arr[1]}" done < ../ILSVRC2012_devkit_t12/data/ILSVRC2012_validation_ground_truth.txt # 读取图片列表,将图片移动到对应类别文件夹 while read line; do arr=($line) mv "${arr[0]}" "${arr[1]}" done < ../ILSVRC2012_devkit_t12/data/ILSVRC2012_validation_image_list.txt
注意:执行脚本前需确保devkit已解压,或根据实际路径调整脚本中devkit文件的位置。
完成以上两步后,即可正常使用torchvision.datasets.ImageNet()加载数据集。
内容的提问来源于stack exchange,提问作者Penguin
相关产品推荐
相关产品推荐

