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