2022机器学习深度学习学习笔记第二十一周


前言

学习pytorch的Dataset 和 Dataloader ,了解Dataset类 和 Dataloader类的作用;在自定义dataset类时,必须实现三个函数,以及DataLoader每个参数的含义;最后通过代码了解Dataset 和 Dataloader具体是如何获取和加载数据集的。


一、Dataset 和 Dataloader概述

Dataset类是用来处理单个训练样本的,也就是如何从磁盘中读取训练数据集,包括特征和标签,最终映射成(x,y)的形式。

Dataloader类是对多个样本而言的,DataLoader是Pytorch中用来处理模型输入数据的一个工具类。

怎样在torch中构建自己的dataset类?

自定义的dataset类必须实现: __ init __, __ len __,以及 __ getitem __这三个函数。

  • __ init __(self, annotations_file, img_dir, transform=None, target_transform=None) :通常要传入读取数据集所在的目录/文件路径。
  • __ len __:函数返回整个数据库的大小。
  • __ getitem __(self, idx):通过index返回一个样本(image,label)。
    举例:
def __getitem__(self, idx):
        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0]) //通过index 找到照片的路径
        image = read_image(img_path) //将照片加载到内存中
        label = self.img_labels.iloc[idx, 1] //通过index得到label
        if self.transform: //通过transform对image和label进行一系列的变换
            image = self.transform(image)
        if self.target_transform:
            label = self.target_transform(label)
        return image, label

dataset结束后要把单个样本组成一个个的minibatch。当我们训练模型的时候,希望传到模型中的是一个个小的批次 minibatch。

介绍 DataLoader(object) 中的参数含义

  • dataset(Dataset):dataset类的一个实例化对象,传入的数据集

  • batch_size(int, optional):默认值为1,每个batch有多少个样本

  • shuffle(bool, optional):在每个训练周期后是否要对数据进行打乱,为true的话,顺序打乱,为false的话,顺序不变。

  • sampler(Sampler, optional):决定怎样对数据进行采样。如果指定这个参数,那么shuffle必须为False。sampler和shuffle是互斥的,不能同时设置。如果自定义sample,就不需要shuffle,没有意义。

  • batch_sampler(Sampler, optional):与sampler类似,但是一次只返回一个batch的indices(索引),需要注意的是,一旦指定了这个参数,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive)。batch_sampler是batch级别的采样,Sampler是样本级别的采样。

  • num_workers (int, optional):这个参数决定了有几个进程来处理data loadin,0意味着所有的数据都会被load进主进程。(默认为0)

  • collate_fn (callable, optional):将一个list的sample组成一个mini-batch的函数,对sample培养的小批次进行再处理。

  • pin_memory (bool, optional): 如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中.

  • drop_last (bool, optional):如果总样本的数目不是batch_size的整数倍的话,设为true则把最后的一小批次丢掉。 比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了;如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。

  • timeout(numeric, optional):如果是正数,表明等待从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。numeric应总是大于等于0,默认为0。

二、Dataset 和 Dataloader的使用

Dataset 练习

1.先创建一个类MyData,继承自Dataset类


class Mydata(Dataset):                      #继承Dataset类
    def __init__(self,root_dir,lable_dir):  #类的实例化,主函数创建实例对象时,自动调用该函数,主要作为外部信息传入类中私有方法的接口
        self.root_dir=root_dir              #图片的目录地址。函数中的变量不能赋值给另一个函数,但self可以
        self.lable_dir=lable_dir            #图片的标签信息
        self.img_name=os.listdir(self.root_dir)#os打开目录,listdir函数返回目录下文件(夹)的名称列表
    def __getitem__(self, idx):             #实例化__getitem__方法,idx代表索引。实力对象通过:对象[idx],python会自动调用该函数
        img_name=self.img_name[idx]         #列表中索引为idx的值(文件名称,此处值图片名称)赋给img_name
        img_path=os.path.join(self.root_dir,img_name)#具体的图片路径,用os.path.join方法连接两个路径
        img=Image.open(img_path)            #打开图片,将图片信息赋值给img,具体图片包含的信息可以在python console中查看
        lable = self.lable_dir              #lable赋值
        return img,lable                    #返回图片信息和标签
    def __len__(self):                      #实例化__len__方法
        return len(self.img_name)           #返回一共多少张图片,即列表的长度

2.获取数据集

root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)

dataloader练习

1.准备数据集(使用torchvision提供的自定义的数据集)
2.使用dataloader加载测试集
3.使用for循环取出dataloader的返回值
4.使用tensorboard对数据进行展示

import torchvision
#准备的测试数据集
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter

# train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, download=True)
# test_set = torchvision.datasets.CIFAR10(root="./dataset", train=False, download=True)
test_data = torchvision.datasets.CIFAR10(root="./dataset", train=False, transform=torchvision.transforms.ToTensor())
# 下载路径  ,  测试集为false  ,  转为tensor数据集
test_loader = DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)
# batch_size=4  每次从test_data中取四个数据集进行打包,比如从dataset中取img0,img1,img2,img3打包为imgs,取target0,target1,target2,target3打包为targets;imgs和targets作为dataloader的返回

#测试数据集中第一张图片及target
img, target = test_data[0]
print(img.shape)
# torch.Size([3, 32, 32]) 3表示三通道RGB,32x32的彩色图片
print(target)
# 输出3
writer = SummaryWriter("dataloader")
step = 0
for data in test_loader:
    imgs, targets = data
    print(img.shape)
    print(targets)
    writer.add_images("test_data", imgs, step)
    step = step+1

writer.close()

总结

通过学习了解到dataset主要是告诉程序数据集在什么样的位置,dataloader则是将数据集加载到神经网络当中,从dataset中取数据,取多少,怎么取由dataloader中的参数进行确定。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值