深度学习----数据集的准备(二)(重点是代码注释清晰明了)

本文介绍了如何使用torchvision.datasets.ImageFolder方法加载开源网站Kaggle的PotatoDiseaseLeafDataset数据集,包括数据集结构、所需库、预处理步骤和数据加载过程。重点展示了如何配置ImageFolder以适应不同标签的图像文件夹结构。
摘要由CSDN通过智能技术生成

提示:由于torchvision库中的数据集有限且较为简单,不能完全满足特定的目标任务。因此,我们需要在开源网站中去寻找满足特定任务的数据集,以此来应对不同的实际需求。本文将以开源网站Kaggle中的Potato Disease Leaf Dataset(PLD)链接在此)为例,分享加载此类数据集的方式: torchvision.datasets.ImageFolder()


一、使用torchvision.datasets.ImageFolder()加载数据集

1. 前期说明

PLD是一个包含马铃薯叶片图像的数据集,且所有叶片图像共有3类标签或类别,分别是:Early_Blight、Late_Blight、Healthy,共计4062张叶片图像。此外,该原始数据集还被划分为3个子集:训练集、验证集、测试集。

在使用torchvision.datasets.ImageFolder()方法加载PLD数据集之前,我们要确保数据集中的所有叶片图像都按照文件夹进行了保存按照文件夹进行保存的意思是:将所有带Early_Blight标签的图像放入Early_Blight文件夹中,将所有带Late_Blight标签的图像放入Late_Blight文件夹中,将所有带Healthy标签的图像放入Healthy文件夹中。一般来说,从开源网站中下载的数据集都会按照这种方式保存,如果没有按照文件夹保存,那就继承 torch.utils.data.Dataset 类来加载数据集,关于这种方法我会在另外一篇文章中详细讲解。由于下载好的PLD数据集中叶片图像已经按照文件夹保存好了,所以我直接展示一下完整的文件夹组织结构:
在这里插入图片描述
此时可以清晰地看到所有叶片图像均按照文件夹保存好了。接下来将详细地讲述这种方法是如何加载数据集。


2. 导入所需的库

'''
@author: Xiong Bi
@time: 2024/4/22 15:52
'''

'(1)导入所需的库'
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

'(2)手动设置batch_size的值,当然在定义前向传播中也可以用 .view() + 占位符-1 的方式来自动地求batch_size的值'
batch_size = 100

3. 定义数据预处理操作

'使用transforms.Resize()函数将输入图像的尺寸调整为指定的大小,且该函数的输入实参是一个元组,用来指定输入图像的目标大小'
'使用transforms.ToTensor()函数将输入图像转换为Tensor,并将图像的像素值归一化到[0,1]之间,且该函数无输入实参,本身就只是一个转换函数'
'使用transforms.Normalize()函数对输入图像进行标准化,即对输入图像每个通道上的像素值先减去均值,再除以标准差。同时,该函数的输入实参为两个元组,第一个元组是均值元组,第二个元组是标准差元组。'
'最后,使用transforms.Compose([])函数将各类的transforms函数按顺序打包为一个整体,然后作用于输入图像'
transforms = transforms.Compose([
    transforms.Resize((224,224)),
    transforms.ToTensor(),
    
'由于PLD中的叶片图像是彩色图像,其输入通道数为3,所以输入实参为两个三元组,且每个三元组中三个通道上都有值。'
   transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225))
    ])

4. 加载数据集

在指定训练集、验证集、测试集的路径时,为了方便使用相对路径,我将PLD dataset 和 要运行的.py文件放在同一个目录/文件夹下(如下图所示)。这只是本人的习惯用法,感兴趣的朋友也可以使用绝对路径,但建议初学者尝试使用相对路径,因为它既简单,又不容易出现路径错误。
在这里插入图片描述
这里可以清楚看到,PLD dataset 和 .py 文件 都在Data preparation module目录/文件夹下,这样方便在后面使用相对路径。

'指定训练集、验证集、测试集的相对路径'
' ./ 表示定位到当前目录(即Data preparation module目录)'
' ./PLD dataset/Training set 表示定位到当前目录下的PLD dataset文件夹下的Training set子文件夹,以获取子文件夹中的训练数据。对于验证数据和测试数据的获取同理操作。'
train_dataset_path = './PLD dataset/Training set'

val_dataset_path = './PLD dataset/Validation set'
test_dataset_path = './PLD dataset/Testing set'

'torchvision.datasets.ImageFolder()函数用来加载训练数据,且形参root表示训练数据所在的目录/文件夹,形参transform表示对训练数据进行数据预处理操作'
train_dataset = datasets.ImageFolder(root=train_dataset_path, transform=transforms)

val_dataset = datasets.ImageFolder(root=val_dataset_path, transform=transforms)
test_dataset = datasets.ImageFolder(root=test_dataset_path, transform=transforms)

5. 制作数据加载器

'定义训练数据加载器。shuffle=True表示打乱训练数据的顺序,num_workers=0表示只用主进程来加载训练数据,不使用子进程来并行加载图像数据。'
'当num_workers不为0时,有时子进程会在主进程之前启动,这会报错。为了避免报错便将子进程数设置为0'
train_dataloader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True,num_workers=0)

val_dataloader = DataLoader(dataset=val_dataset, batch_size=batch_size, shuffle=False,num_workers=0)
test_dataloader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False,num_workers=0)

6. 检查数据加载器是否正确地加载各批次图像数据

为了验证数据加载器是否正确地加载各批次图像数据(为了简单地展示一下,我们只加载第一个批次的图像数据,然后就停止加载),我们将执行以下代码:

'直接遍历训练数据加载器中的各批次数据,且每个批次数据中包含一组图像数据images和一组标签数据labels'
for images, labels in train_dataloader:

    '查看当前批次中图像数据的形状'
    print('图像数据形状:', images.size())

    '查看当前批次中标签数据的形状'
    print('标签数据形状:', labels.size())

   '当加载完第一个批次数据后,就执行break语句,停止后续各批次数据的加载'
    break
    
for images, labels in val_dataloader:
    print('图像数据形状:', images.size())
    print('标签数据形状:', labels.size())
    break

for images, labels in test_dataloader:
    print('图像数据形状:', images.size())
    print('标签数据形状:', labels.size())
    break

运行结果如下图所示:
在这里插入图片描述
可以看到,数据加载器能够正确地加载各批次图像数据,并且还能知道图像数据images和标签数据labels的形状。

二、总结

当获取到的数据集如果具有标准的文件夹组织结构,如训练集、验证集、测试集分别包含了以各类别名称命名的子文件夹,且每个子文件夹中包含相同标签的图像数据,那么我们可以使用torchvision.datasets.ImageFolder()方法来快捷地加载数据集,而不需要继承torch.utils.data.Dataset 类来自定义加载数据集。

感谢各位的观看,制作也比较耗时,如果有转载的朋友请注明出处,谢谢!!

  • 60
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值