【发布时间】:2017-06-14 22:25:18
【问题描述】:
如何在您自己的数据上使用torch.utils.data.Dataset 和torch.utils.data.DataLoader(不仅仅是torchvision.datasets)?
有没有办法将他们在TorchVisionDatasets 上使用的内置DataLoaders 用于任何数据集?
【问题讨论】:
如何在您自己的数据上使用torch.utils.data.Dataset 和torch.utils.data.DataLoader(不仅仅是torchvision.datasets)?
有没有办法将他们在TorchVisionDatasets 上使用的内置DataLoaders 用于任何数据集?
【问题讨论】:
是的,这是可能的。只需自己创建对象,例如
import torch.utils.data as data_utils
train = data_utils.TensorDataset(features, targets)
train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True)
其中features 和targets 是张量。 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 自动计算出第二维的长度。)
【讨论】:
features 矩阵是二维的,包含输入数据行。如果输入数据是 1D(例如语音信号等),这对我来说是有意义的,但如果它是图像(2D)比如 32x32 怎么办? features 矩阵会是什么样子?
除了user3693922's answer 和accepted answer,分别是link“快速”PyTorch 文档示例,用于为自定义数据集创建自定义数据加载器,并在“最简单”的情况下创建自定义数据加载器,有更详细的官方 PyTorch 教程,介绍如何使用相关的预处理创建自定义数据加载器:"writing custom datasets, dataloaders and transforms" official PyTorch tutorial
【讨论】:
是的,你可以做到。 希望这对未来的读者有所帮助。
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)
【讨论】:
是的。 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:
#...
【讨论】: