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?

27
demandé sur jrbedard 2017-01-29 21:31:24

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)

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

27
répondu pho7 2017-02-14 19:14:46

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.

8
répondu user3693922 2017-02-13 10:41:49