web-dev-qa-db-fra.com

Comment charger une liste de tableaux numpy dans le chargeur de jeu de données pytorch?

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]]

 ..., 
`
16
deepayan das

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 Datasetou 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.

30
mexmex

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.

0
prosti