Pytorch: à propos de torch.nn.CrossEntropyLoss

Créé le 14 avr. 2017  ·  3Commentaires  ·  Source: pytorch/pytorch

à propos de torch.nn.CrossEntropyLoss,
j'apprends pytorch et je prends le projet anpr
(https://github.com/matthewearl/deep-anpr,
http://matthewearl.github.io/2016/05/06/cnn-anpr/)
comme exercice, transplantez-le sur la plate-forme pytorch.

il y a un problème, j'utilise nn.CrossEntropyLoss() comme fonction de perte :
critère=nn.CrossEntropyLoss()

la sortie.données du modèle est :
1.00000e-02 *
-2,5552 2,7582 2,5368 ... 5,6184 1,2288 -0,0076
-0,7033 1,3167 -1,0966 ... 4,7249 1,3217 1,8367
-0,7592 1,4777 1,8095 ... 0,8733 1,2417 1,1521
-0,1040 -0,7054 -3,4862 ... 4,7703 2,9595 1,4263
[torche.FloatTensor de taille 4x253]

et target.data est :
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
[torche.DoubleTensor de taille 4x253]

quand j'appelle :
perte=critère(sortie,cibles)
une erreur s'est produite, les informations sont :
TypeError : FloatClassNLLCriterion_updateOutput a reçu une combinaison d'arguments non valide : obtenu (int, torch.FloatTensor, torch.DoubleTensor, torch.FloatTensor, bool, NoneType, torch.FloatTensor), mais attendu (int state, torch.FloatTensor input, torch.LongTensor target , sortie torch.FloatTensor, bool sizeAverage, [torch.FloatTensor weights or None], torch.FloatTensor total_weight)

'expected torch.LongTensor','got torch.DoubleTensor', mais si je convertis les cibles en LongTensor :
torche.LongTensor(numpy.array(targets.data.numpy(),numpy.long))
call loss=criterion(output,targets), l'erreur est :
RuntimeError : multi-cible non pris en charge sur /data/users/soumith/miniconda2/conda-bld/pytorch-0.1.10_1488752595704/work/torch/lib/THNN/generic/ClassNLLCriterion.c:20

mon dernier exercice est mnist, un exemple de pytorch, j'ai fait un peu de modification, batch_size est 4, la fonction de perte :
perte = F.nll_loss(sorties, étiquettes)
sorties.données :
-2.3220 -2.1229 -2.3395 -2.3391 -2.5270 -2.3269 -2.1055 -2.2321 -2.4943 -2.2996
-2,3653 -2,2034 -2,4437 -2,2708 -2,5114 -2,3286 -2,1921 -2,1771 -2,3343 -2,2533
-2,2809 -2,2119 -2,3872 -2,2190 -2,4610 -2,2946 -2,2053 -2,3192 -2,3674 -2,3100
-2,3715 -2,1455 -2,4199 -2,4177 -2,4565 -2,2812 -2,2467 -2,1144 -2,3321 -2,3009
[torche.FloatTensor de taille 4x10]

étiquettes.données :
8
6
0
1
[torche.LongTensor de taille 4]

les étiquettes, pour une image d'entrée, doivent être un seul élément, dans l'exemple supérieur, il y a 253 nombres, et dans 'mnist', il n'y a qu'un seul nombre, la forme des sorties est différente des étiquettes.

je passe en revue le manuel de tensorflow, tf.nn.softmax_cross_entropy_with_logits,
'Les logits et les étiquettes doivent avoir la même forme [batch_size, num_classes] et le même type (float32 ou float64).'

alors, puis-je utiliser pytorch dans ce cas, ou comment puis-je faire?
merci beaucoup

Commentaire le plus utile

Je ne dirais pas que les documents TF sont le meilleur endroit pour en savoir plus sur l'API PyTorch 🙂 Nous n'essayons pas d'être compatibles avec TF, et notre CrossEntropyLoss accepte un vecteur d'indices de classe (cela lui permet de fonctionner beaucoup plus rapidement que s'il utilisait 1-vecteurs chauds). Il devrait être simple de convertir entre les deux représentations si vous en avez vraiment besoin.

Notez que nous utilisons les problèmes GitHub uniquement pour les rapports de bogues. Si vous avez des questions, n'hésitez pas à les poser sur nos forums .

Tous les 3 commentaires

http://pytorch.org/docs/nn.html#crossentropyloss
Forme CrossEntropyLoss :
Entrée : (N,C) où C = nombre de classes
Cible : (N) où chaque valeur est 0 <= cibles[i] <= C-1

ai-je un autre choix ?

Je ne dirais pas que les documents TF sont le meilleur endroit pour en savoir plus sur l'API PyTorch 🙂 Nous n'essayons pas d'être compatibles avec TF, et notre CrossEntropyLoss accepte un vecteur d'indices de classe (cela lui permet de fonctionner beaucoup plus rapidement que s'il utilisait 1-vecteurs chauds). Il devrait être simple de convertir entre les deux représentations si vous en avez vraiment besoin.

Notez que nous utilisons les problèmes GitHub uniquement pour les rapports de bogues. Si vous avez des questions, n'hésitez pas à les poser sur nos forums .

Merci, la conversion de la matrice d'encodage de classe one-hot en un vecteur entier a résolu le problème CrossEntropyLoss pour moi !

Cette page vous a été utile?
0 / 5 - 0 notes