PyTorch:批训练下的数据读取机制DataLoader

先明确几个常见的名词含义:batch、epoch、iteration
batch: 通常我们将一个数据集分割成若干个小的样本集,然后一小部分一小部分喂给神经网络进行迭代,每一小部分样本称为一个batch。
epoch: 将训练集中全部数据在模型中进行过一次完整的训练(包括一次正向传播和一次反向传播),成为一个epoch。
iteration: 使用一个batch对模型的参数进行一次更新的过程,成为一个iteration(一次迭代)。

首先导入包。下面介绍的包都位于torch.util.data中。

下面我们手动创建一个数据集,包括1000个样本,每个样本有两个特征。因此样本集是一个1000×2的Tensor,标签集是一个1000×1的Tensor。每个样本的两个特征随机得到,标签符合 y = 2 x 1 − 5 x 2 + 3 y = 2x_1 - 5x_2 + 3 y=2x15x2+3再加上一个符合正太分布的误差。

import torch
import torch.utils.data as Data
import numpy as np

# 生成数据集
feature_num = 2   # 两个输入x1、x2
sample_num = 35   # 创建35个样本,当然在实际情况中我们不可能使用这么小的数据集,这里仅做演示用
true_w = [2, -5]
true_b = 3
samples = torch.randn(sample_num, feature_num, dtype=torch.float32) # 生成1000*2的张量,作为输入的样本
labels = true_w[0] * samples[:,0] + true_w[1] * samples[:,1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float32)

一、TensorDataset类:将数据包装成数据集

对于给定的数据,包括数据的样本和标签,将二者包装成一个Dataset,类型为torch.utils.data.dataset.TensorDataset。

注意:1. 输入的参数必须都是Tensor。
2. 两个参数的第一个维度必须是一致的,即样本和标签可以按行一一对应并组合起来。

一个dataset可以表示成下图所示的状态。

我们将上面的数据集生成数据集。

dataset = Data.TensorDataset(samples, labels)
print(type(dataset))

输出为

二、DataLoader类:加载数据集

加载dataset,根据设置的参数返回迭代器。

DataLoader类的初始化方式为

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,
		generator=None, *, 
		prefetch_factor=2, persistent_workers=False)

常用参数的含义如下。

  1. dataset:Dataset类型,加载数据的数据集。
  2. batch_size:int类型。每个batch中包含的样本数量,默认值为1。
  3. shuffle:bool类型。设置为True时,会在每个epoch都打乱数据。
  4. sampler:Sampler类型。用来指定从数据集中提取样本的策略,如果指定sampler,则shffle必须设置成False。
    几个常见的取值如下。
  • torch.utils.data.sampler.SequentialSampler(dataset):样本元素按顺序采样,始终以相同的顺序。
  • torch.utils.data.sampler.RandomSampler(dataset):样本元素随机采样,没有替换。
  • torch.utils.data.sampler.SubsetRandomSampler(indices):样本元素从指定的索引列表中随机抽取,没有替换。
  1. num_workers:int类型。定义使用多少个子进程加载数据,0表示数据在主进程中加载。
  2. pin_memory:bool类型。如果为True,则在返回Tensor前将它们拷贝到CUDA的pinned memory中。
  3. drop_last:bool类型。当数据集大小不能被batch_size整除时,若设置为True,会删除最后一个不完整的batch。如果设置为False则会保留这个batch。
  4. timeout:数值类型,必须大于等于0。用来设置读取数据的超时时间,如果为正数,则超过这个时间还未读取到数据会报错。

将上文中生成的数据集进行随机的小批量读取。

batch_size = 10
data_iter = Data.DataLoader(dataset, batch_size, shuffle=False, 
		sampler=torch.utils.data.sampler.RandomSampler(dataset))

我们可以读取并打印每一个batch的样本。注意,data_iter中的X、y并不是单个样本的X和y,而是一个batch中所有的X和所有的y。

for X, y in data_iter:
  print("X = ", X, "\ny = ", y)

输出结果为

可以看出35个数据被分成了4个batch,其中前三个batch中有10个样本,最后一个batch由于样本数不够,故只有5个样本。

三、关于Dataset的常用操作

1. Dataset的大小

使用len()函数可以判断Dataset中有多少个样本。

size = len(dataset)
print(size)

输出为

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值