PyTorch:如何将 DataLoader 用于自定义数据集
PyTorch: How to use DataLoaders for custom Datasets
如何在您自己的数据上使用 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
。对于您的 5000xnxnx3 数据集,它看起来像这样:
2d_dataset = 4d_dataset.view(5000, -1)
(值-1
告诉PyTorch自动算出第二个维度的长度。)
您可以通过扩展 data.Dataset
class 轻松地做到这一点。
根据 API,你所要做的就是实现两个函数:__getitem__
和 __len__
。
然后您可以使用 DataLoader 包装数据集,如 API 和 @pho7 的回答中所示。
我觉得ImageFolder
class是个参考。见代码 here.
除了 and the , which respectively link the "quick" PyTorch documentation example to create custom dataloaders for custom datasets, and create a custom dataloader in the "simplest" case, there is a much more detailed dedicated official PyTorch tutorial on how to create a custom dataloader with the associated preprocessing: "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:
#...
如何在您自己的数据上使用 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
。对于您的 5000xnxnx3 数据集,它看起来像这样:
2d_dataset = 4d_dataset.view(5000, -1)
(值-1
告诉PyTorch自动算出第二个维度的长度。)
您可以通过扩展 data.Dataset
class 轻松地做到这一点。
根据 API,你所要做的就是实现两个函数:__getitem__
和 __len__
。
然后您可以使用 DataLoader 包装数据集,如 API 和 @pho7 的回答中所示。
我觉得ImageFolder
class是个参考。见代码 here.
除了
是的,你可以做到。 希望这对未来的读者有所帮助。
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:
#...