60 votes

PyTorch : Comment utiliser les DataLoaders pour les 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 les torchvision.datasets ) ?

Existe-t-il un moyen d'utiliser le système intégré de gestion de l'eau ? DataLoaders qu'ils utilisent sur TorchVisionDatasets à utiliser sur n'importe quel ensemble de données ?

65voto

pho7 Points 676

Oui, c'est possible. Il suffit de créer les objets par vous-même, par ex.

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 d'entraînement, et targets peut être 1-D ou 2-D, selon que l'on cherche à prédire un scalaire ou un vecteur.

J'espère que cela vous aidera !


EDIT : réponse à la question de @sarthak

En gros, oui. Si vous créez un objet de type TensorData alors le constructeur vérifie si les premières dimensions du tenseur de caractéristiques (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)

Toutefois, si vous souhaitez introduire ces données dans un réseau neuronal par la suite, vous devez faire attention. Alors que les couches de convolution fonctionnent sur des données comme les vôtres, (je pense) que tous les autres types de couches attendent que les données soient fournies sous forme de matrice. Donc, si vous rencontrez un tel problème, une solution facile serait de convertir votre ensemble de données 4D (donné comme une sorte de tenseur, par exemple FloatTensor ) en 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).

0 votes

J'ai des fonctions 3D : 2D pour une image et une dimension supplémentaire pour les canaux de couleur. Cela fonctionnerait-il encore si je passais les caractéristiques sous la forme 5000xnxnx3. 5000 est le nombre de points de données, nxnx3 est la taille de l'image.

0 votes

Un ensemble de données 4d peut être transmis en tant que caractéristiques, il n'est pas nécessaire d'utiliser la déclaration de vue.

0 votes

@pho7 Vous dites que le features est en 2D et contient des lignes de données d'entrée. Cela me semble logique si les données d'entrée sont 1D (comme un signal vocal ou autre), mais qu'en est-il si c'est une image (2D), disons 32x32 ? Comment la features ressemble à une matrice ?

12voto

user3693922 Points 143

Vous pouvez facilement le faire en étendant la fonction data.Dataset classe. Selon le API il suffit d'implémenter deux fonctions : __getitem__ et __len__ .

Vous pouvez ensuite envelopper le jeu de données avec le DataLoader comme indiqué dans l'API et dans la réponse de @pho7.

Je pense que le ImageFolder est une référence. Voir le code ici .

1voto

Khubaib Raza Points 174

Oui, vous pouvez le faire. J'espère que cela aidera les futurs lecteurs.

from torch.utils.data import TensorDataset, DataLoader
import torch.utils.data as data_utils

inputs = [[ 1,  2,  3,  4,  5],[ 2,  3,  4,  5,  6]]
targets = [ 6,7]
batch_size = 2

inputs  = torch.tensor(inputs)
targets = torch.IntTensor(targets)

dataset =TensorDataset(inputs, targets)
data_loader = DataLoader(dataset, batch_size, shuffle = True)

0voto

Blupon Points 108

En plus de La réponse de user3693922 et le réponse acceptée qui respectivement lien l'exemple "rapide" de la documentation PyTorch pour créer des dataloaders personnalisés pour des ensembles de données personnalisés, et créer un dataloader personnalisé dans le cas le plus "simple", il existe un tutoriel officiel dédié à PyTorch beaucoup plus détaillé sur la façon de créer un dataloader personnalisé avec le prétraitement associé : "écrire des ensembles de données, des chargeurs de données et des transformations personnalisés" tutoriel officiel de PyTorch

0voto

ukemi Points 3499

Oui. Pytorch's DataLoader est conçu pour prendre un Dataset en tant qu'entrée, mais tout ce qu'il faut, c'est un objet avec un objet __getitem__ et __len__ de sorte que n'importe quel conteneur générique suffira.

Par exemple, une liste de tuples avec vos caractéristiques (valeurs x) comme premier élément, et vos cibles (valeurs y) comme deuxième élément peut être passée directement à DataLoader comme ça :

x = [6,3,8,2,5,9,7]
y = [1,0,1,0,0,1,1]

data = [*zip(x,y)]
dataloader = torch.utils.data.DataLoader(data)

for features, targets in dataloader:
    #...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X