PyTorch DataLoader 将批次作为列表返回,批次作为唯一条目。如何从我的 DataLoader 获取张量的最佳方式

Posted

技术标签:

【中文标题】PyTorch DataLoader 将批次作为列表返回,批次作为唯一条目。如何从我的 DataLoader 获取张量的最佳方式【英文标题】:PyTorch DataLoader returns the batch as a list with the batch as the only entry. How is the best way to get a tensor from my DataLoader 【发布时间】:2020-02-24 23:40:53 【问题描述】:

我目前有以下情况,我想使用DataLoader来批处理一个numpy数组:

import numpy as np
import torch
import torch.utils.data as data_utils

# Create toy data
x = np.linspace(start=1, stop=10, num=10)
x = np.array([np.random.normal(size=len(x)) for i in range(100)])
print(x.shape)
# >> (100,10)

# Create DataLoader
input_as_tensor = torch.from_numpy(x).float()
dataset = data_utils.TensorDataset(input_as_tensor)
dataloader = data_utils.DataLoader(dataset,
                                   batch_size=100,
                                  )
batch = next(iter(dataloader))

print(type(batch))
# >> <class 'list'>

print(len(batch))
# >> 1

print(type(batch[0]))
# >> class 'torch.Tensor'>

我希望 batch 已经是 torch.Tensor。到目前为止,我像这样索引批次,batch[0] 以获得张量,但我觉得这不是很漂亮,并且使代码更难阅读。

我发现DataLoader 采用了一个名为collate_fn 的批处理函数。但是,设置data_utils.DataLoader(..., collage_fn=lambda batch: batch[0]) 只会将列表更改为元组(tensor([ 0.8454, ..., -0.5863]),),其中唯一的条目是作为张量的批处理。

你会帮助我找出如何优雅地将批处理转换为张量(即使这包括告诉我批量索引单个条目是可以的),这对我有很大帮助。

【问题讨论】:

【参考方案1】:

抱歉给我的回答带来不便。

实际上,你不必从你的张量中创建Dataset,你可以直接传递torch.Tensor,因为它实现了__getitem____len__,这样就足够了:

import numpy as np
import torch
import torch.utils.data as data_utils

# Create toy data
x = np.linspace(start=1, stop=10, num=10)
x = np.array([np.random.normal(size=len(x)) for i in range(100)])

# Create DataLoader
dataset = torch.from_numpy(x).float()
dataloader = data_utils.DataLoader(dataset, batch_size=100)
batch = next(iter(dataloader))

【讨论】:

我不认为你可以将torch.tensor 的列表传递给TensorDataset,相反我们可以这样做TensorDataset(x_tensor, y_tensor)。但这仍然无法弄清楚batch是一个列表的问题。 感谢您的帮助!但是,当我进行以下更改 input_as_tensor = [torch.from_numpy(row).float() for row in x] 并解压缩此列表 dataset = data_utils.TensorDataset(*input_as_tensor) 时,batch = next(iter(dataloader))now 返回长度为 100 的 list。但是,我想要一个形状张量(batch_size,特征),所以在这个示例 (100, 10)。只有当我的批次是torch.Tensor 时,我才能将数据输入到例如torch.nn.Linear() 的实例中。我错过了什么吗?提前谢谢!!! @Auss 很抱歉给您带来不便,基本上您不必创建任何Dataset 即可按照您的意愿工作,请参阅更改后的答案。

以上是关于PyTorch DataLoader 将批次作为列表返回,批次作为唯一条目。如何从我的 DataLoader 获取张量的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch DataLoader 对并行运行的批次使用相同的随机种子

PyTorch DataLoader 在每个时期使用相同的随机变换

PyTorch DataLoader 可以从空数据集开始吗?

Pytorch DataLoader 不返回批处理数据

将 pytorch 数据加载器加载到 GPU 中

pytorch之数据预加载