【问题标题】:PyTorch: How to use DataLoaders for custom DatasetsPyTorch:如何将 DataLoaders 用于自定义数据集
【发布时间】:2017-06-14 22:25:18
【问题描述】:

如何在您自己的数据上使用torch.utils.data.Datasettorch.utils.data.DataLoader(不仅仅是torchvision.datasets)?

有没有办法将他们在TorchVisionDatasets 上使用的内置DataLoaders 用于任何数据集?

【问题讨论】:

    标签: python torch pytorch


    【解决方案1】:

    是的,这是可能的。只需自己创建对象,例如

    import torch.utils.data as data_utils
    
    train = data_utils.TensorDataset(features, targets)
    train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True)
    

    其中featurestargets 是张量。 features 必须是二维的,即每行代表一个训练样本的矩阵,targets 可能是一维或二维,这取决于您要预测的是标量还是向量。

    希望有帮助!


    编辑:回复@sarthak 的问题

    基本上是的。如果你创建了一个TensorData类型的对象,那么构造函数会检查特征张量(实际上称为data_tensor)和目标张量(称为target_tensor)的第一个维度是否具有相同的长度:

    assert data_tensor.size(0) == target_tensor.size(0)
    

    但是,如果您想随后将这些数据输入神经网络,则需要小心。虽然卷积层可以处理像您这样的数据,但(我认为)所有其他类型的层都希望数据以矩阵形式给出。因此,如果您遇到这样的问题,那么一个简单的解决方案是使用方法view 将您的 4D 数据集(作为某种张量,例如FloatTensor)转换为矩阵。对于您的 5000xnxnx3 数据集,如下所示:

    2d_dataset = 4d_dataset.view(5000, -1)
    

    -1 的值告诉 PyTorch 自动计算出第二维的长度。)

    【讨论】:

    • 我有 3D 特征:图像为 2D,颜色通道为额外维度。如果我将功能作为 5000xnxnx3 传递,它是否仍然有效? 5000 是数据点的数量 nxnx3 是图像大小
    • 4d 数据集可以作为特征传递,不需要视图语句。
    • @pho7 你说features 矩阵是二维的,包含输入数据行。如果输入数据是 1D(例如语音信号等),这对我来说是有意义的,但如果它是图像(2D)比如 32x32 怎么办? features 矩阵会是什么样子?
    • 它可能是扁平的,当你从DataLoader加载它时你需要重塑它吗?不过我不确定
    【解决方案2】:

    您可以通过扩展 data.Dataset 类轻松做到这一点。 根据API,你只需要实现两个函数:__getitem____len__

    然后,您可以使用 DataLoader 包装数据集,如 API 和 @pho7 的答案中所示。

    我认为ImageFolder 类是一个参考。见代码here

    【讨论】:

      【解决方案3】:

      除了user3693922's answeraccepted answer,分别是link“快速”PyTorch 文档示例,用于为自定义数据集创建自定义数据加载器,并在“最简单”的情况下创建自定义数据加载器,有更详细的官方 PyTorch 教程,介绍如何使用相关的预处理创建自定义数据加载器:"writing custom datasets, dataloaders and transforms" official PyTorch tutorial

      【讨论】:

        【解决方案4】:

        是的,你可以做到。 希望这对未来的读者有所帮助。

        from torch.utils.data import TensorDataset, DataLoader
        import torch.utils.data as data_utils
        
        inputs = [[ 1,  2,  3,  4,  5],[ 2,  3,  4,  5,  6]]
        targets = [ 6,7]
        batch_size = 2
        
        inputs  = torch.tensor(inputs)
        targets = torch.IntTensor(targets)
            
        dataset =TensorDataset(inputs, targets)
        data_loader = DataLoader(dataset, batch_size, shuffle = True)
        
        

        【讨论】:

          【解决方案5】:

          是的。 Pytorch 的DataLoader 旨在将Dataset 对象作为输入,但它只需要一个具有__getitem____len__ 属性的对象,因此任何通用容器都足够了。

          例如将您的特征(x 值)作为第一个元素,将目标(y 值)作为第二个元素的元组列表可以直接传递给 DataLoader,如下所示:

          x = [6,3,8,2,5,9,7]
          y = [1,0,1,0,0,1,1]
          
          data = [*zip(x,y)]
          dataloader = torch.utils.data.DataLoader(data)
          
          for features, targets in dataloader:
              #...
          

          【讨论】:

            猜你喜欢
            • 2021-01-13
            • 1970-01-01
            • 2020-09-28
            • 2019-11-08
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 2021-07-21
            • 2019-01-03
            相关资源
            最近更新 更多