PyTorch DataLoader returns 批处理作为列表,批处理作为唯一条目。如何从我的 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
我目前有以下情况,我想使用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]),)
,其中唯一的条目是作为张量的批处理。
你会帮助我找到如何优雅地将批处理转换为张量的方法(即使这包括告诉我批量索引单个条目是可以的)。
对于我的回答给您带来的不便,我们深表歉意。
实际上,您不必从张量中创建 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))
我目前有以下情况,我想使用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]),)
,其中唯一的条目是作为张量的批处理。
你会帮助我找到如何优雅地将批处理转换为张量的方法(即使这包括告诉我批量索引单个条目是可以的)。
对于我的回答给您带来的不便,我们深表歉意。
实际上,您不必从张量中创建 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))