Pytorch中torchvision.datasets.ImageFolder的Found 0 files in subfolders错误

本文详细解析了使用PyTorch预训练模型进行猫狗图片分类的过程,针对ImageFolder路径选择常见错误提供了具体解决方案,并分享了从Kaggle获取的数据集加载技巧。

这个错误的主要原因是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代表的狗

### 回答1: `torchvision.datasets.ImageFolder`是PyTorch中的一个内置数据集类,用于加载存储在文件夹中的图像数据集。该类会将所有的图像按照其所在的文件夹进行分类,并将每个文件夹视为一个类别。可以通过指定`root`参数来指定图像数据集所在的文件夹的路径,同时还可以通过`transform`参数指定需要对图像进行的预处理操作,例如缩放、裁剪、旋转等。在创建`ImageFolder`对象后,可以通过调用`__getitem__`方法来获取指定索引的图像及其对应的标签。该类的使用非常方便,适合用于加载小型的图像数据集。 ### 回答2: torchvision.datasets.ImageFolderPyTorch中一个用于加载图像数据集的类。它可用于加载带有标签的图像数据集,以便进行各种类型的图像分类任务。 使用ImageFolder,我们可以指定一个包含子文件夹的根目录,每个子文件夹代表一个类别,包含该类别的图像样本。ImageFolder会自动遍历这些文件夹,并为每个样本分配一个类标签。这个类标签是基于文件夹的索引顺序,例如根目录下的第一个文件夹被分配类标签0,第二个文件夹被分配类标签1,依此类推。 在使用ImageFolder加载数据集时,我们还可以选择是否在加载图像时应用一些预处理操作,如缩放、裁剪、标准化等。这些预处理操作可以在数据加载过程中被定义并应用于所有图像。这在训练深度学习模型时非常有用,可以提高数据效率和数据质量。 使用ImageFolder加载数据集后,我们可以通过迭代器方式访问每个图像样本及其对应的类标签。可以使用这些样本和类标签来进行模型训练、验证和测试。此外,可以与PyTorch中的其他数据加载工具(如DataLoader)结合使用,以实现数据的批处理、并行加载等功能。 总之,torchvision.datasets.ImageFolder是一个功能强大的类,可以简化图像分类任务中数据集的加载和处理过程。它提供了灵活且易于使用的接口,使得加载图像数据集变得更加方便快捷。 ### 回答3: torchvision.datasets.ImageFolderPyTorch中的一个数据加载工具,用于从文件夹加载图像数据集。 ImageFolder类需要指定一个包含图像数据的文件夹路径作为输入。该文件夹路径下应该有多个子文件夹,每个子文件夹代表一个类别,其中包含属于该类别的图像。 ImageFolder类可以通过以下几个重要的参数来进行配置。首先,可以通过transform参数传入一个数据转换函数,用于对图像进行预处理操作,如缩放、裁剪、归一化等。其次,可以通过target_transform参数传入一个目标转换函数,用于对目标进行预处理操作。例如,可以将类别标签从类别名称转换为数字编码。除此之外,还可以通过loader参数指定图像加载函数,默认为PIL加载图像。 使用ImageFolder加载数据集非常简单。首先,需要导入torchvision.datasets模块。然后,使用ImageFolder类实例化一个数据加载器对象,传入数据集文件夹路径和其他可选参数。接下来,可以使用数据加载器对象的属性和方法来访问和操作数据集。例如,可以使用属性classes获取所有类别的名称,使用属性class_to_idx获取类别到索引的映射关系,使用len函数获取数据集的大小,使用getitem方法获取具体的样本数据。 总的来说,torchvision.datasets.ImageFolder是一个方便实用的工具,可以帮助我们加载和操作图像数据集。它可以与其他PyTorch中的数据加载工具(如DataLoader)配合使用,为模型训练和评估提供了便利。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值