博客
关于我
PyTorch学习笔记——(6)数据加载Dataset和DataLoader的使用
阅读量:600 次
发布时间:2019-03-12

本文共 1904 字,大约阅读时间需要 6 分钟。

PyTorch 数据集与数据加载器详解

在深度学习项目中,数据处理是至关重要的一环。而随着深度学习模型复杂度的不断提升,训练数据量日益膨胀。直接处理海量数据往往会面临内存不足及计算速度受限的问题。因此,如何高效地加载与处理数据成为开发者关注的重点。

数据集类(Dataset Class):基石性质

在PyTorch中,数据集的处理从核心库torch.utils.data.Dataset开始。这个基类为创建自定义数据集提供了基础框架。具体来说,开发者需要实现两个核心方法:

  • __len__():返回数据集的长度,用于确定数据的总数。
  • __getitem__():通过索引获取对应位置的单个数据样本。
  • 通过继承Dataset类并实现上述两种方法,可以快速实现读取和处理数据的功能。例如:

    import pandas as pd
    from torch.utils.data import Dataset
    class MyDataset(Dataset):
    def __init__(self):
    self dataSet = pd.read_csv("./data/wendu_8_4_9_2.csv").values
    def __getitem__(self, index):
    return selfDataSetToTensor(selfDataSet[index])
    def __len__(self):
    return len(selfDataSet)
    @staticmethod
    def toTensor(data):
    return torch.from_numpy(data)

    这个例子展示了如何将CSV文件数据加载到PyTorch环境中。通过MyDSataset类,可以依据索引加载对应位置的数据,同时数据通过toTensor()方法转换为PyTorch张量形式。

    数据迭代器(DataLoader):批量处理与多线程加载

    在原始数据集中类方法中得到数据加载能力后,如何实现批量处理和数据打乱成为关键。PyTorch中的DataLoader充当了这个角色,功能包涵包括:

    • 批量处理:根据指定批量大小,将数据按块读取。
    • 随机打乱:在每次加载前对数据进行随机打乱。
    • 多线程加载:开启内置线程池以加速数据读取过程。
    • 数据切片:则数据末尾不足一个批量时自动删减或补充以达到批量大小。

    DataLoader的使用示例如下:

    from torch.utils.data import DataLoader
    import pandas as pd
    import torch
    dataSet =MyDataset() # 实例化自定义数据集
    # 指定数据加载参数
    dataLoader = DataLoader(
    dataSet=dataSet,
    batch_size=32,
    shuffle=True,
    num_workers=2
    )
    for batch in dataLoader:
    print(batch)
    print('*' * 50)

    DataLoader的各参数含义:

  • dataset:传入需要加载的数据集实例。
  • batch_size:设置一次装载的数据样本数,常取值如32、64、128等。
  • shuffle:布尔标志,表示每个批次内部是否打乱数据顺序。
  • num_workers:启动数据加载的线程数量,默认为0(即单线程)。
  • drop_last:默认为False,当最后一个批次样本不足时是否剪裁。
  • 此外,DataLoader生成的迭代器返回形式为 batches(批),其中每个batches是形状相同的张量序列,适于通过模型进行训练或推理操作。

    注意事项与性能优化

    在使用DataLoader时,需要注意以下几点:

  • 批量大小选择:选择合适的批量大小既保持内存效率,又能保证训练流程的连贯性。通常情况下,较大的批量尺寸可以提高训练速度,但需要确保电脑内存资源充足。

  • 数据随机打乱:为了防止模型出现训练数据泄漏等问题,建议在加载过程中对数据进行打乱。

  • 多线程读取:根据硬件配置合理设置num_workers,提升数据读取效率。

  • 处理尾端数据:若数据集中存在不完整批次,可通过drop_last参数选择是否删除末尾不足的样本。

  • 通过合理配置DataLoader,能显著提升数据加载效率,同时确保数据的多样性和训练模型的鲁棒性。

    转载地址:http://jqetz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现图片腐蚀(附完整源码)
    查看>>
    Objective-C实现图片膨胀(附完整源码)
    查看>>
    Objective-C实现图的邻接矩阵(附完整源码)
    查看>>
    Objective-C实现圆球的表面积和体积(附完整源码)
    查看>>
    Objective-C实现在Regex的帮助下检查字谜算法(附完整源码)
    查看>>
    Objective-C实现在指定区间 [a, b] 中找到函数的实根,其中 f(a)*f(b) < 0算法(附完整源码)
    查看>>
    Objective-C实现均值滤波(附完整源码)
    查看>>
    Objective-C实现埃拉托斯特尼筛法算法(附完整源码)
    查看>>
    Objective-C实现域名解析(附完整源码)
    查看>>
    Objective-C实现域名转IP(附完整源码)
    查看>>
    Objective-C实现培根密码算法(附完整源码)
    查看>>
    Objective-C实现基于 LIFO的堆栈算法(附完整源码)
    查看>>
    Objective-C实现基于 LinkedList 的添加两个数字的解决方案算法(附完整源码)
    查看>>
    Objective-C实现基于opencv的抖动算法(附完整源码)
    查看>>
    Objective-C实现基于事件对象实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于信号实现线程同步(附完整源码)
    查看>>
    Objective-C实现基于文件流拷贝文件(附完整源码)
    查看>>
    Objective-C实现基于模板的双向链表(附完整源码)
    查看>>
    Objective-C实现基于模板的顺序表(附完整源码)
    查看>>
    Objective-C实现基本二叉树算法(附完整源码)
    查看>>