1
votes

ValueError: l'option sampler est mutuellement exclusive avec shuffle pytorch

Je travaille sur un projet de reconnaissance faciale en utilisant pytorch et mtcnn et après avoir formé mon ensemble de données d'entraînement, je veux maintenant faire des prédictions sur l'ensemble de données de test

ceci mon code entraîné

optimizer = optim.Adam(resnet.parameters(), lr=0.001)
scheduler = MultiStepLR(optimizer, [5, 10])

trans = transforms.Compose([
   np.float32,
   transforms.ToTensor(),
   fixed_image_standardization
])
dataset = datasets.ImageFolder(data_dir, transform=trans)
img_inds = np.arange(len(dataset))
np.random.shuffle(img_inds)
train_inds = img_inds[:int(0.8 * len(img_inds))]
val_inds = img_inds[int(0.8 * len(img_inds)):]

train_loader = DataLoader(
   dataset,
   num_workers=workers,
   batch_size=batch_size,
   sampler=SubsetRandomSampler(train_inds)
)
val_loader = DataLoader(
   dataset,
   shuffle=True,
   num_workers=workers,
   batch_size=batch_size,
   sampler=SubsetRandomSampler(val_inds)
)


0 commentaires

3 Réponses :


0
votes

Je ne suis pas sûr du format dans lequel vous testez les données, mais pour sélectionner un échantillon au hasard dans votre ensemble de données, vous pouvez utiliser random.choice à partir du module random .


0 commentaires

1
votes

Vous pouvez utiliser Dataloader avec shuffle = True mais uniquement lorsque sampler = False Avec cet indicateur, les échantillons de l'ensemble de données seront sélectionnés au hasard ( doc ).

<₹Edit1

Je suis d'accord avec @SzymonMaszke: avec SubsetRandomSampler, il n'est pas nécessaire d'utiliser le shuffle, car vos données sont déjà sélectionnées au hasard.


3 commentaires

l'erreur est ValueError: l'option sampler est mutuellement exclusive avec shuffle , et je mettrai à jour la question


mon code est le même que le repo (facenet-pytorch / examples / finetune.ipynb)


@AntonGanichev bien sûr, vous n'avez pas besoin d'utiliser shuffle = True , SubsetRandomSampler mélange déjà (permute pour être exact) les données déjà, d'où shuffle = True ne peut pas être spécifié simultanément.



3
votes

TLDR; Supprimez shuffle = True dans ce cas, car SubsetRandomSampler mélange déjà les données.

Ce que fait torch.utils.data.SubsetRandomSampler (veuillez consulter la documentation en cas de doute ) est-ce prendra une liste d'indices et retournera leur permutation.

Dans votre cas, vous avez des indices correspondant à training (ce sont des indices d'éléments dans le jeu de données d'entraînement ) et validation.

Supposons que cela ressemble à ceci:

module.eval()

total_batches = 0
batch_accuracy = 0
for images, labels in val_loader:
    total_batches += 1
    with torch.no_grad():
        output = module(images)
        # In case it outputs logits without activation
        # If it outputs activation you may have to use argmax or > 0.5 for binary case
        # Item gets float from torch.tensor
        batch_accuracy += torch.mean(labels == (output > 0.0)).item()

print("Overall accuracy: {}".format(batch_accuracy / total_batches))

À chaque passage SubsetRandomSampler renverra un numéro de ces listes au hasard et celles-ci seront à nouveau randomisées une fois qu'elles auront toutes été renvoyées ( __iter __ code> sera appelé à nouveau).

Donc, SubsetRandomSampler pourrait renvoyer quelque chose comme ceci pour val_indices code > (de manière analogue pour train_indices):

module.eval()
with torch.no_grad():
    output = module(dataset[5380])

Maintenant, chacun de ces nombres est un index de votre ensemble de données d'origine code > . Veuillez noter que la validation est mélangée de cette façon, tout comme train sans utiliser shuffle = True . Ces indices ne se chevauchent pas, donc les données sont correctement fractionnées.

Informations supplémentaires

  • shuffle utilise torch.utils.data.RandomSampler sous le capot si shuffle = True est spécifié, voir code source . Cela équivaut à son tour à utiliser torch.utils.data.SubsetRandomSampler avec tous les indices ( np.arange (len (datatest)) ) spécifié .
  • vous n'avez pas besoin de pré-mélanger np.random.shuffle (img_inds) car les index seront mélangés à chaque passage de toute façon
  • n'utilisez pas numpy si torch fournit la même fonctionnalité . Il y a torch.arange , mélanger les deux bibliothèques n'est presque jamais nécessaire.

Inférence

Image unique

Il suffit de la passer à travers votre réseau pour obtenir une sortie, par exemple:

val_indices = [1, 8, 11, 7, 14]  # Epoch 1
val_indices = [11, 7, 8, 14, 1]  # Epoch 2
val_indices = [7, 1, 14, 8, 11]  # Epoch 3

La première ligne met le modèle en mode d'évaluation (change le comportement de certains calques), le gestionnaire de contexte désactive le dégradé (car il n'est pas nécessaire pour les prédictions). Celles-ci sont presque toujours utilisées lors de la "vérification de la sortie du réseau neuronal".

Vérification de l'ensemble de données de validation

Quelque chose dans ce sens, notez les mêmes idées appliquées que pour une seule image:

XXX

Autres cas

Veuillez consulter certains guides pour débutants ou tutoriels et comprenez ces concepts car StackOverflow n'est pas un endroit pour refaire ce travail (questions plutôt concrètes et petites), merci.


8 commentaires

très bien expliqué, mais comment afficher des images de test pour faire des prédictions, je dois terminer mon projet jusqu'à mon projet de dernière année ce mois-ci


@art_cs voulez-vous une prédiction sur une seule image, faites des prédictions sur la validation une partie des données et obtenez une métrique (par exemple, précision ), affichez-la en utilisant tensorboard ou quoi exactement?


oui, c'est ce que je cherchais, mais pour y parvenir! Je suis très nouveau dans pytorch et l'apprentissage en profondeur


@art_cs Voir ma modification, mais commencez très certainement par un guide pour débutants pour vous familiariser avec les concepts liés à Pytorch. Ne sautez pas sur la reconnaissance faciale à l'improviste car cela prendra encore plus de temps que de comprendre les bases (qui sont présentées dans les liens que je vous ai donnés assez directement).


merci beaucoup, y a-t-il un tutoriel sur la reconnaissance faciale avec pytorch, j'ai beaucoup cherché, mais je n'ai pas trouvé


@art_cs la plupart des tâches des réseaux de neurones suivent le même principe (formation et validation avec calculs de métriques, sauvegarde de modèle, chargement, etc.) donc il n'y a pas de "reconnaissance faciale" en particulier, c'est plutôt une application un peu différente des concepts que j'énumère ici . Il y a quelque chose ici mais il vaudrait peut-être mieux que vous compreniez ce que vous faites à l'avance.


merci beaucoup je vais essayer, le problème est que je n'ai pas assez de temps pour suivre un cours pendant cette période il est trop tard pour ma dernière présentation, merci beaucoup encore


désolé, mais comment pouvons-nous utiliser la reconnaissance faciale en temps réel en fonction du modèle formé (resnet) qui comprend les visages formés? merci pour votre réponse