J'ai une énorme liste de tableaux numpy, où chaque tableau représente une image et je veux la charger en utilisant l'objet torch.utils.data.Dataloader. Mais la documentation de torch.utils.data.Dataloader mentionne qu'il charge les données directement à partir d'un dossier. Comment puis-je le modifier pour ma cause? Je suis nouveau sur pytorch et toute aide serait grandement appréciée. mon tableau numpy pour une seule image ressemble à ceci. Les images sont des images 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]]
...,
`
Je pense que ce que DataLoader nécessite réellement est une entrée qui sous-classe Dataset
. Vous pouvez soit écrire votre propre classe d'ensemble de données qui sous-classe Dataset
ou utiliser TensorDataset
comme je l'ai fait ci-dessous:
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
Travaille pour moi. J'espère que cela vous aide.
PyTorch DataLoader
a besoin d'un DataSet
comme vous pouvez le vérifier dans docs . La bonne façon de le faire est d'utiliser:
torch.utils.data.TensorDataset(*tensors)
Il s'agit d'un ensemble de données pour envelopper les tenseurs, où chaque échantillon sera récupéré en indexant les tenseurs le long de la première dimension. Les paramètres *tensors
signifie des tenseurs qui ont la même taille que la première dimension.
L'autre class torch.utils.data.Dataset
est une classe abstraite.
Voici comment convertir des tableaux numpy en tenseurs:
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)
La réponse acceptée utilise le torch.Tensor
construire. Si vous avez une image avec des pixels de 0 à 255, vous pouvez utiliser ceci:
timg = torch.from_numpy(img).float()
Ou torchvision to_tensor
, qui convertit une image PIL ou numpy.ndarray en tensor.
Mais voici une petite astuce, vous pouvez mettre vos tableaux numpy directement.
x1 = np.array([1,2,3])
d1 = DataLoader( x1, batch_size=3)
Cela fonctionne également, mais si vous imprimez d1.dataset
type:
print(type(d1.dataset)) # <class 'numpy.ndarray'>
Bien que nous ayons réellement besoin de tenseurs pour travailler avec CUDA, il est préférable d'utiliser des tenseurs pour alimenter le DataLoader
.