PyTorch: comment utiliser DataLoaders pour des ensembles de données personnalisés
comment utiliser le torch.utils.data.Dataset
et torch.utils.data.DataLoader
sur vos propres données (pas seulement l' torchvision.datasets
)?
Est-il possible d'utiliser les fonctions intégrées DataLoaders
qu'ils utilisent sur TorchVisionDatasets
pour être utilisé sur un ensemble de données?
2 réponses
Oui, c'est possible. Il suffit de créer les objets par vous-même, par exemple
import torch.utils.data as data_utils
train = data_utils.TensorDataset(features, targets)
train_loader = data_utils.DataLoader(train, batch_size=50, shuffle=True)
où features
et targets
sont des tenseurs. features
doit être 2-d, c'est-à-dire une matrice où chaque ligne représente un échantillon de formation, et targets
peut être 1-D ou 2-D, selon que vous essayez de prédire un scalaire ou un vecteur.
j'Espère que ça aide!
EDIT: réponse à la question de @sarthak
Fondamentalement, oui. Si vous créez un objet de type TensorData
, puis le constructeur examine si les premières dimensions du tenseur caractéristique (qui est en fait appelé data_tensor
) et le tenseur cible (appelé target_tensor
) ont la même longueur:
assert data_tensor.size(0) == target_tensor.size(0)
cependant, si vous voulez alimenter ces données dans un réseau neuronal par la suite, alors vous devez être prudent. Alors que les couches de convolution travaillent sur des données comme la vôtre, (je pense) tous les autres types de couches s'attendent à ce que les données soient données sous forme de matrice. Si, si vous rencontrez un problème comme celui-ci, alors une solution facile serait de convertir votre ensemble de données 4D (donné comme une sorte de tenseur, par exemple FloatTensor
) dans une matrice en utilisant la méthode view
. Pour votre ensemble de données 5000xnxnx3, cela ressemblerait à ceci:
2d_dataset = 4d_dataset.view(5000, -1)
(La valeur -1
indique à PyTorch de calculer automatiquement la longueur de la deuxième dimension.)
vous pouvez facilement faire cela en étendant le data.Dataset
classe.
Selon l' API, tout ce que vous avez à faire est de mettre en œuvre deux fonction: __getitem__
et __len__
.
vous pouvez ensuite envelopper l'ensemble de données avec le DataLoader comme indiqué dans l'API et dans la réponse de @pho7.
je pense que le ImageFolder
classe est une référence. Voir le code ici.