数据集定义与加载

    飞桨框架将深度学习任务中常用到的数据集作为领域API开放,对应API所在目录为与paddle.text.datasets,你可以通过以下代码飞桨框架中提供了哪些数据集。

    1. 视觉相关数据集: ['DatasetFolder', 'ImageFolder', 'MNIST', 'FashionMNIST', 'Flowers', 'Cifar10', 'Cifar100', 'VOC2012']
    2. 自然语言相关数据集: ['Conll05st', 'Imdb', 'Imikolov', 'Movielens', 'UCIHousing', 'WMT14', 'WMT16']

    警告

    这里你可以定义手写数字体的数据集,其他数据集的使用方式也都类似。用mode来标识训练集与测试集。数据集接口会自动从远端下载数据集到本机缓存目录~/.cache/paddle/dataset

    在实际的场景中,更多需要使用你已有的相关数据来定义数据集。你可以使用飞桨提供的paddle.io.Dataset基类,来快速实现自定义数据集。

    1. import paddle
    2. from paddle.io import Dataset
    3. BATCH_SIZE = 64
    4. BATCH_NUM = 20
    5. IMAGE_SIZE = (28, 28)
    6. CLASS_NUM = 10
    7. class MyDataset(Dataset):
    8. """
    9. def __init__(self, num_samples):
    10. """
    11. 步骤二:实现构造函数,定义数据集大小
    12. """
    13. super(MyDataset, self).__init__()
    14. self.num_samples = num_samples
    15. def __getitem__(self, index):
    16. """
    17. 步骤三:实现__getitem__方法,定义指定index时如何获取数据,并返回单条数据(训练数据,对应的标签)
    18. """
    19. data = paddle.uniform(IMAGE_SIZE, dtype='float32')
    20. label = paddle.randint(0, CLASS_NUM-1, dtype='int64')
    21. return data, label
    22. def __len__(self):
    23. """
    24. """
    25. # 测试定义的数据集
    26. custom_dataset = MyDataset(BATCH_SIZE * BATCH_NUM)
    27. print('=============custom dataset=============')
    28. for data, label in custom_dataset:
    29. print(data.shape, label.shape)
    30. break

    飞桨推荐使用paddle.io.DataLoader完成数据的加载。简单的示例如下:

    1. train_loader = paddle.io.DataLoader(custom_dataset, batch_size=BATCH_SIZE, shuffle=True)
    2. # 如果要加载内置数据集,将 custom_dataset 换为 train_dataset 即可
    3. for batch_id, data in enumerate(train_loader()):
    4. x_data = data[0]
    5. y_data = data[1]
    6. print(x_data.shape)
    7. print(y_data.shape)

    通过上述的方法,你就定义了一个数据迭代器train_loader, 用于加载训练数据。通过batch_size=64设置了数据集的批大小为64,通过shuffle=True,在取数据前会打乱数据。此外,你还可以通过设置来开启多进程数据加载,提升加载速度。

    DataLoader 默认用异步加载数据的方式来读取数据,一方面可以提升数据加载的速度,另一方面也会占据更少的内存。如果你需要同时加载全部数据到内存中,请设置use_buffer_reader=False