如何将numpy数组列表加载到pytorch数据集加载器?

时间:2017-06-08 07:22:58

标签: python numpy pytorch

我有一个巨大的numpy数组列表,其中每个数组代表一个图像,我想使用torch.utils.data.Dataloader对象加载它。但是torch.utils.data.Dataloader的文档提到它直接从文件夹加载数据。我如何根据自己的原因修改它?我是pytorch的新手,任何帮助都会受到极大的关注。 我的单个图像的numpy数组看起来像这样。这种海藻是RBG图像。

`[[[ 70  82  94]
  [ 67  81  93]
  [ 66  82  94]
  ..., 
  [182 182 188]
  [183 183 189]
  [188 186 192]]

 [[ 66  80  92]
  [ 62  78  91]
  [ 64  79  95]
  ..., 
  [176 176 182]
  [178 178 184]
  [180 180 186]]

 [[ 62  82  93]
  [ 62  81  96]
  [ 65  80  99]
  ..., 
  [169 172 177]
  [173 173 179]
  [172 172 178]]

 ..., 
`

4 个答案:

答案 0 :(得分:18)

我认为DataLoader实际需要的是一个子类Dataset的输入。您可以编写自己的子类Dataset的数据集类,也可以使用TensorDataset,如下所示:

import torch.utils.data as utils

my_x = [np.array([[1.0,2],[3,4]]),np.array([[5.,6],[7,8]])] # a list of numpy arrays
my_y = [np.array([4.]), np.array([2.])] # another list of numpy arrays (targets)

tensor_x = torch.stack([torch.Tensor(i) for i in my_x]) # transform to torch tensors
tensor_y = torch.stack([torch.Tensor(i) for i in my_y])

my_dataset = utils.TensorDataset(tensor_x,tensor_y) # create your datset
my_dataloader = utils.DataLoader(my_dataset) # create your dataloader

适合我。希望它可以帮到你。

答案 1 :(得分:6)

由于有图像,您可能要对它们执行转换。因此,TensorDataset不是这里的最佳选择。相反,您可以创建自己的Dataset。像这样:

import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
from PIL import Image


class MyDataset(Dataset):
    def __init__(self, data, targets, transform=None):
        self.data = data
        self.targets = torch.LongTensor(targets)
        self.transform = transform

    def __getitem__(self, index):
        x = self.data[index]
        y = self.targets[index]

        if self.transform:
            x = Image.fromarray(self.data[index].astype(np.uint8).transpose(1,2,0))
            x = self.transform(x)

        return x, y

    def __len__(self):
        return len(self.data)

# Let's create 10 RGB images of size 128x128 and ten labels {0, 1}
data = list(np.random.randint(0, 255, size=(10, 3, 128, 128)))
targets = list(np.random.randint(2, size=(10)))

transform = transforms.Compose([transforms.Resize(64), transforms.ToTensor()])
dataset = MyDataset(data, targets, transform=transform)
dataloader = DataLoader(dataset, batch_size=5)

答案 2 :(得分:0)

PyTorch N需要一个DataLoader,因为您可以签入docs。正确的方法是使用:

DataSet

这是用于包装张量的数据集,其中每个样本将通过沿第一维索引张量来检索。 参数torch.utils.data.TensorDataset(*tensors) 表示具有与第一维相同大小的张量。

另一个*tensors是一个抽象类。

以下是将numpy数组转换为张量的方法:

class torch.utils.data.Dataset

可接受的答案使用import torch import numpy as np n = np.arange(10) print(n) #[0 1 2 3 4 5 6 7 8 9] t1 = torch.Tensor(n) # as torch.float32 print(t1) #tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) t2 = torch.from_numpy(n) # as torch.int32 print(t2) #tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=torch.int32) 构造。 如果您的图像像素在0-255之间,则可以使用以下方法:

torch.Tensor

或torchvision to_tensor方法,可将PIL图像或numpy.ndarray转换为张量。


但这是一个小技巧,您可以直接放置numpy数组。

timg = torch.from_numpy(img).float()

这也可以,但是如果您打印x1 = np.array([1,2,3]) d1 = DataLoader( x1, batch_size=3) ,请输入:

d1.dataset

虽然我们实际上需要Tensors才能使用CUDA,所以最好使用Tensors来填充print(type(d1.dataset)) # <class 'numpy.ndarray'>

答案 3 :(得分:-1)

对于上述内容,要创建由@Andreas K.给定的自己的数据集,我们得到的名称“ transforms”未定义。