pytorch深度学习——dataset(附数据集下载)

目录

一、Dataset的作用

 二、Dataset的使用

1.数据集下载

2.类的定义

3.测试

三、源码展示


在学习深度学习的时候,我们需要考虑如何去处理数据去训练我们的模型,pytorch为我们提供了Dataset和DataLoader两个类来对数据进行处理,前者作用是提供了一种方式来获取数据及其label,后者的作用是为网络提供不同的数据形式。本文主要讲第一个类——Dataaet.

一、Dataset的作用

如图,我们举个例子,我们这里有很多和数据(左边每一个图形代表一个数据),其中我们需要获取圆形的数据,通过Dataset,我们可以将所有的圆拿出来,放到我们的数据集当中,并且每一个数据都有自己的label,比如说红色、绿色。并且数据集会将每一个数据进行编号,所以我们可以归纳出Dataset的作用:

1.获取每一个数据以及其label

2.告诉我们在数据集中有多少个数据

 二、Dataset的使用

1.数据集下载

在使用Dataset之前,建议大家先去下载一个数据集,下面提供一个国内的数据集下载地址:

数据集下载icon-default.png?t=N7T8https://aistudio.baidu.com/datasetoverview/2/1

下载解压后放在项目文件夹下就行。

2.类的定义

我们创建一个新文件,起名为demo1.py

导入工具:

from torch.utils.data import Dataset
from PIL import Image
import os

我们通过查看文档可知,所有的数据集都应该继承Dataset类,并且子类都必须重写__getitem__方法,该方法的主要作用是获取每一个数据以及其label,也可以选择性重写__len__方法,获取数据集的大小。

所以我们定义一个类MyData

MyData(Dataset):
#构造方法,将文件夹名称以及子文件夹传入
    def __init__(self,root_dir,label_dir):
        self.root_dir = root_dir
        self.label_dir=label_dir
        self.path=os.path.join(self.root_dir+self.label_dir)
        self.Img_path=os.listdir(self.path)
    
#获取数据集中第idx个数据以及其label,我们可以通过索引获取数据对象
    def __getitem__(self, inx):
        Img_name = self.Img_path[inx]
        Img_item_path = os.path.join(self.root_dir,self.label_dir,Img_name)

        img = Image.open(Img_item_path)
        label = self.label_dir
        return img,label

#获取数据集的长度
    def __len__(self):
        return len(self.Img_path)

3.测试

我们通过以下代码来进行演示:

在我的项目中,有flowers这个数据集,然后下面又分了几个文件夹代码不同的花的数据集 

我们想获取第4张雏菊的照片,我们的根数据集是flowers,我们就可以创建daisy_label数据集对象。

root_dir = "folwers\\"#表示根目录为flowers,这里用两杠是因为要构成转义字符
daisy_dir = "daisy" #表示我们需要的数据在“daisy”文件夹下面
daisy_dataset = MyData(root_dir,daisy_dir)

然后,我们获取第4个数据和它的label并将其展现出来

img,lebel = daisy_dataset.__getitem__(4)
img.show()
print(lebel)

我们得到以下运行结果:

成功获取到了目标数据和它的label。

三、源码展示

MyData(Dataset):
#构造方法,将文件夹名称以及子文件夹传入
    def __init__(self,root_dir,label_dir):
        self.root_dir = root_dir
        self.label_dir=label_dir
        self.path=os.path.join(self.root_dir+self.label_dir)
        self.Img_path=os.listdir(self.path)
    
#获取数据集中第idx个数据以及其label,我们可以通过索引获取数据对象
    def __getitem__(self, inx):
        Img_name = self.Img_path[inx]
        Img_item_path = os.path.join(self.root_dir,self.label_dir,Img_name)

        img = Image.open(Img_item_path)
        label = self.label_dir
        return img,label

#获取数据集的长度
    def __len__(self):
        return len(self.Img_path)


root_dir = "flowers\\"
daisy_label_dir = "daisy"
daisy_dataset = MyDate(root_dir,flowers_label_dir)

img,lebel = daisy_dataset.__getitem__(4)
img.show()
print(lebel)

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PyTorch 中,自定义数据集可以通过继承 `torch.utils.data.Dataset` 类来实现。这个类需要实现两个方法:`__len__` 和 `__getitem__`。 `__len__` 方法返回数据集的长度,即样本数量。`__getitem__` 方法返回数据集中一个索引对应的样本。 下面是一个简单的例子,假设我们有一个文件夹 `data`,里面包含若干张图片和对应的标签,我们要把这个数据集PyTorch 加载起来: ```python import os from PIL import Image import torch.utils.data as data class CustomDataset(data.Dataset): def __init__(self, root_dir): self.root_dir = root_dir self.img_list = os.listdir(root_dir) def __len__(self): return len(self.img_list) def __getitem__(self, index): img_path = os.path.join(self.root_dir, self.img_list[index]) img = Image.open(img_path).convert('RGB') label = int(self.img_list[index].split('_')[0]) return img, label ``` 在上面的例子中,我们定义了一个 `CustomDataset` 类,它有一个构造函数 `__init__`,接收一个参数 `root_dir` 表示数据集所在的文件夹路径。`__init__` 方法初始化了 `img_list` 属性,里面保存了所有图片文件名。 `__len__` 方法返回了 `img_list` 的长度,即数据集中样本的数量。 `__getitem__` 方法接收一个索引 `index`,返回了数据集中第 `index` 个样本的图片和标签。具体地,它首先获取了图片文件的路径,然后用 `PIL` 库打开图片并转换成 RGB 模式。最后,它从文件名中解析出标签信息,并把图片和标签一起返回。 有了这个自定义数据集类,我们就可以用 PyTorch 的 `DataLoader` 类来加载数据集了。例如: ```python import torch.utils.data as data dataset = CustomDataset('data') dataloader = data.DataLoader(dataset, batch_size=32, shuffle=True) ``` 在上面的例子中,我们创建了一个 `CustomDataset` 对象 `dataset`,然后用 `DataLoader` 类来初始化 `dataloader` 对象。`DataLoader` 的第一个参数是数据集对象,第二个参数是批量大小,第三个参数是是否打乱数据集顺序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值