先明确几个常见的名词含义: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=2x1−5x2+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)
对于给定的数据,包括数据的样本和标签,将二者包装成一个Dataset,类型为torch.utils.data.dataset.TensorDataset。
注意:1. 输入的参数必须都是Tensor。
2. 两个参数的第一个维度必须是一致的,即样本和标签可以按行一一对应并组合起来。
我们将上面的数据集生成数据集。
dataset = Data.TensorDataset(samples, labels)
print(type(dataset))
加载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)
常用参数的含义如下。
将上文中生成的数据集进行随机的小批量读取。
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个样本。
使用len()函数可以判断Dataset中有多少个样本。
size = len(dataset)
print(size)