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) )
3 Réponses :
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
.
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.
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 code> ne peut pas être spécifié simultanément.
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.
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é . np.random.shuffle (img_inds)
car les index seront mélangés à chaque passage de toute façon 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. 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".
Quelque chose dans ce sens, notez les mêmes idées appliquées que pour une seule image:
XXX
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.
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 a> 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