这个错误的主要原因是ImageFolder的路径选择错误
应选择数据集图片的上层路径,比如建立一个cat的文件夹存放猫的图片,建立一个dog的文件夹存放狗的图片,这两个文件夹放在train的文件夹内,那么ImageFolder的路径应选择为'.\\train'
这样调用 data_image = datasets.ImageFolder(root='.\\train', transform=transform)后
可以读取到 data_image.classes 为 ['cat', 'dog']
data_image.class_to_idx 为{'cat': 0, 'dog': 1}
len(data_image) 为 猫和狗的图片的数量总和
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
最近在用pytorch的预训练模型做猫狗大战
主要参考的博文为:https://zhuanlan.zhihu.com/p/30315331
由于是第一次使用torchvision.datasets.ImageFolder载入数据集,遇到了一点问题
数据集是从kaggle上下载的猫狗大战数据集,分别为训练集猫狗图片各12500张,测试集猫狗图片一共12500张
kaggle官网下载链接:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/data
解压后为两个文件夹:train,test
其中train文件夹内为12500张cat图片和12500张dog图片,分别命名为 cat.0.jpg ~ cat.12499.jpg ,dog.0.jpg ~ dog.12499.jpg
参考的原文代码为:
path = "dog_vs_cat"
transform = transforms.Compose([transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.5,0.5,0.5], [0.5,0.5,0.5])])
data_image = {x:datasets.ImageFolder(root = os.path.join(path,x),
transform = transform)
for x in ["train", "val"]}
data_loader_image = {x:torch.utils.data.DataLoader(dataset=data_image[x],
batch_size = 4,
shuffle = True)
for x in ["train", "val"]}
classes = data_image["train"].classes
classes_index = data_image["train"].class_to_idx
print(classes)
print(classes_index)
print(len(data_image["train"]))
print(len(data_image["val"]))
原文中的返回应为:
['cat', 'dog']
{'cat': 0, 'dog': 1}
20000
5000
若将root改为自己的存放路径 root = 'D:\DataSets\catsvsdog\\train' 后直接运行会出现报错
RuntimeError: Found 0 files in subfolders of: D:\DataSets\catsvsdog\train
Supported extensions are: .jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif
而将路径改为root= 'D:\DataSets\catsvsdog'后可以读取到
['test', 'train']
{'train': 1, 'test': 0}
37500
可以看到是将两个文件夹作为了数据集的folder,文件名为标签,数量可以看到是训练集和测试集的总和(25000+12500)
原因是原文是把训练集分成了两个部分,猫狗各10000张作为训练集放入train文件夹内,2500张作为验证集方式val文件夹中,然后使用一个字典分别将数据读入data_image[train]中和data_image[val]中,以便于后面的调用
(这边解释下os.path.join(path,x)这个函数,这个函数是将两个路径何在一起,比如 path= 'dog_vs_cat' ,x = 'train',那么os.path.join(path,x)返回的就是'dog_vs_cat\trian')
我没有使用验证集,而是在train文件夹内新建了cat和dog两个文件夹,分别存放12500张图片
然后将路径改为:root = 'D:\DataSets\catsvsdog\\train' 可以读取到了
['cat', 'dog']
{'dog': 1, 'cat': 0}
25000
可以看到0代表的是猫 1代表的狗