Pytorch学习记录(3) Dataloader的使用

Pytorch学习记录(3) Dataloader的使用

这篇博客记录了本人Pytorch的过程,主要目的是为了今后的学习以及复习,仅用于个人学习,不为其他目的。

本次学习主要研究了Dataloader的使用。

  1. Dataloader与Datasets的区别:

torch.utils.data.Dataset是代表了这一数据的抽象类,可以通过继承与重写这个抽象类来实现自己的数据类,只需要定义__len__和__getitem__这两个函数即可。

例如如下代码展示示范:

class Dataset(object):
    """An abstract class representing a Dataset.
    All other datasets should subclass it. All subclasses should override
    ``__len__``, that provides the size of the dataset, and ``__getitem__``,
    supporting integer indexing in range from 0 to len(self) exclusive.
    """
 
    def __getitem__(self, index):
        raise NotImplementedError
 
    def __len__(self):
        raise NotImplementedError
 
    def __add__(self, other):
        return ConcatDataset([self, other])

class MyDataset(Dataset): 
    """ my dataset."""
    
    # Initialize your data, download, etc.
    def __init__(self):
        # 读取csv文件中的数据
        xy = np.loadtxt('data-diabetes.csv', delimiter=',', dtype=np.float32) 
        self.len = xy.shape[0]
        # 除去最后一列为数据位,存在x_data中
        self.x_data = torch.from_numpy(xy[:, 0:-1])
        # 最后一列为标签为,存在y_data中
        self.y_data = torch.from_numpy(xy[:, [-1]])
        
    def __getitem__(self, index):
        # 根据索引返回数据和对应的标签
        return self.x_data[index], self.y_data[index]
        
    def __len__(self): 
        # 返回文件数据的数目
        return self.len

通过覆写__getitem__与__len__两个函数,使得MyDataset类继承了Dataset类,并且可以根据需要获得对应的类参数。

Dataloader是Pytorch中用来处理模型输入数据的一个工具类,组合了数据集(dataset)+采样器(sampler),并在数据集上提供单线程或多线程(num_workers)的可迭代对象。

函数原型如下所示:

torch.utils.data.DataLoader(dataset, batch_size=1, 
    shuffle=False, sampler=None, 
    batch_sampler=None, num_workers=0, 
    collate_fn=None, pin_memory=False, 
    drop_last=False, timeout=0, 
    worker_init_fn=None, multiprocessing_context=None)

其中常用的几个参数介绍如下:

1)dataset:决定数据从哪里读取

2)batch_size:批大小,决定每批传入多少个样本到模型中,因此batch_size决定了每个epoch中有多少个iteration,即:迭代次数(iteration次数)= 样本总数(epoch传入总数)/ batch_size。

3)shuffle:每一个epoch中是否为乱序

4)num_workers:读取数据时,是否采用多进程进行读取

5)drop_last:当样本数不能被batchsize整除时,最后一批数据是否舍弃

6)pin_memory:如果为True会将数据放置到GPU上去

更多关于Dataset与Dataloader的介绍具体可以参考该博文:https://blog.csdn.net/He3he3he/article/details/105441083

  1. Dataloader的使用:

2.1 创建Dataset和Dataloader:

首先引入torchvision,并读取本地的CIFAR10文件,并创建对应的datasets对象,并转换成Tensor类型:

接下来引入Dataloader类,通过torch.utils.data引入,并同样创建一个Dataloader对象,其中将batch_size设置为6,shuffle设置为True,drop_last设置为False:

可以首先查看Dataset的每一行的格式,由于转化为了tensor类型,因此可以观察到其shape和target为:

接下来查看Dataloader的格式,由于batch_size为6,因此所有的图像被分为了每6个一组的形式,通过for循环可以查看每个batch的shape和target:

其中最后一个batch由于凑不齐6个图像,并且在Dataloader的参数中drop_last设置为False,该组batch只有4个图像。

接下来通过Tensorboard对于每一组batch的图像进行查看,为了便于观察,将每一组batch大小设置为64,剩余参数不做修改:

打开Tensorboard,可以查看除最后一组batch外,每一组batch中都含有64个图像:

最后一组batch仅有16张图像:

2.2 drop_last参数的使用:

接下来对于drop_last参数进行调整,将其调整至True,即舍弃最后不足以构成64张图的剩下所有图:

通过Tensorboard进行查看:

可以清晰地观察到,相较于上述的test_data,test_data_droplast少了一组,并且其最后一组的图像数量为64,而并非16,因此可以确定修改了参数之后,最后16个图像被舍弃了。

2.3 shuffle参数的使用:

接下来对shuffle参数进行修改,将其调整为False,因此每次在使用该Dataloader进行读取数据时,每个epoch并不会对所有的图像进行打乱,因此每个epoch得到的结果理论上应该是相同的:

通过Tensorboard进行查看:

可以观察到epoch0与epoch1对应的每一个batch的图像都是相同的,也印证了我们上述的结果。

3. 总结

在本文中总结了DataLoader的使用方法,并通过读取CIFAR10中的数据,借助Tensorboard的展示各种参数的功能,能为后续神经网络的训练奠定基础,同时也能更好的理解pytorch。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值