Как загрузить список массивов 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]]

 ..., 
`

Ответ 1

Я думаю, что DataLoader на самом деле требует ввода Dataset подклассов Dataset. Вы можете написать свой собственный класс набора данных, который подклассов Dataset или использовать TensorDataset как я сделал ниже:

import torch
import numpy as np
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

Работает для меня. Надеюсь, это поможет вам.

Ответ 2

PyTorch DataLoader нужен DataSet как вы можете проверить в документах. Правильный способ сделать это - использовать:

torch.utils.data.TensorDataset(*tensors)

Это набор данных для переноса тензоров, где каждый образец будет получен путем индексации тензоров по первому измерению. Параметры *tensors означают тензоры, которые имеют одинаковый размер первого измерения.

Другой class torch.utils.data.Dataset является абстрактным классом.

Вот как конвертировать массивы NumPy в тензоры:

n = np.arange(10)
t1 = torch.Tensor(n)  # same as torch.FloatTensor
t2 = torch.from_numpy(n)  #alternative

Принятый ответ использовал torch.Tensor. torch.Tensor конструкция. Если у вас есть изображение с пикселями от 0 до 255, вы можете использовать это:

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

Или метод to_tensor to_tensor, который преобразует изображение PIL или numpy.ndarray в тензор.


Но вот небольшая хитрость, которую вы можете поместить в свои массивы напрямую.

x1 = np.array([1,2,3])
d1 = DataLoader( x1, batch_size=3)

Это также работает, но если вы печатаете d1.dataset типа:

print(type(d1.dataset)) # <class 'numpy.ndarray'>

Хотя нам действительно нужны Tensors для работы с CUDA, поэтому лучше использовать Tensors для подачи данных в DataLoader.