63

如何在您自己的数据(不仅仅是)上使用torch.utils.data.Dataset和?torch.utils.data.DataLoadertorchvision.datasets

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

4

5 回答 5

68

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

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)

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

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

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

于 2017-02-05T16:04:41.183 回答
12

您可以通过扩展data.Dataset课程轻松做到这一点。根据API,您所要做的就是实现两个功能:__getitem____len__.

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

我认为这个ImageFolder类是一个参考。请参阅此处的代码。

于 2017-02-13T10:41:49.633 回答
2

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

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)

于 2020-09-01T06:06:58.397 回答
0

除了user3693922 的回答接受的回答,分别链接“快速”PyTorch 文档示例为自定义数据集创建自定义数据加载器,并在“最简单”的情况下创建自定义数据加载器,还有更详细的专用官方 PyTorch 教程关于如何创建具有相关预处理的自定义数据加载器:“编写自定义数据集、数据加载器和转换”官方 PyTorch 教程

于 2019-10-07T08:06:48.810 回答
0

是的。PytorchDataLoader旨在将Dataset对象作为输入,但它只需要一个具有__getitem__and__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-03-08T19:43:18.987 回答