Pytorch: über Torch.nn.CrossEntropyLoss

Erstellt am 14. Apr. 2017  ·  3Kommentare  ·  Quelle: pytorch/pytorch

über Torch.nn.CrossEntropyLoss,
Ich lerne Pytorch und nehme am Anpr-Projekt teil
(https://github.com/matthewearl/deep-anpr,
http://matthewearl.github.io/2016/05/06/cnn-anpr/)
Als Übung verpflanzen Sie es auf die Pytorch-Plattform.

Es gibt ein Problem, ich verwende nn.CrossEntropyLoss() als Verlustfunktion:
Kriterium=nn.CrossEntropyLoss()

die output.data des Modells ist:
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
[torch.FloatTensor der Größe 4x253]

und target.data ist:
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
1 0 0 ... 0 0 0
[Fackel.DoubleTensor der Größe 4x253]

wenn ich anrufe:
Verlust=Kriterium(Output,Ziele)
Fehler aufgetreten, Informationen sind:
TypeError: FloatClassNLLCriterion_updateOutput hat eine ungültige Kombination von Argumenten erhalten – erhalten (int, Torch.FloatTensor, Torch.DoubleTensor, Torch.FloatTensor, Bool, NoneType, Torch.FloatTensor), aber erwartet (Int-Status, Torch.FloatTensor-Eingabe, Torch.LongTensor-Ziel). , Torch.FloatTensor-Ausgabe, bool sizeAverage, [Torch.FloatTensor-Gewichte oder None], Torch.FloatTensor-Gesamtgewicht)

'erwartete Torch.LongTensor','hat Torch.DoubleTensor', aber wenn ich die Ziele in LongTensor umwandle:
Torch.LongTensor(numpy.array(targets.data.numpy(),numpy.long))
call loss=criterion(output,targets), der Fehler ist:
RuntimeError: Multi-Target nicht unterstützt bei /data/users/soumith/miniconda2/conda-bld/pytorch-0.1.10_1488752595704/work/torch/lib/THNN/generic/ClassNLLCriterion.c:20

meine letzte übung ist mnist, ein beispiel von pytorch, ich habe eine kleine änderung vorgenommen, batch_size ist 4, die verlustfunktion:
loss = F.nll_loss(Ausgänge, Labels)
Ausgänge.Daten:
-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
[torch.FloatTensor der Größe 4x10]

Etiketten.Daten:
8
6
0
1
[torch.LongTensor der Größe 4]

Die Beschriftungen für ein Eingabebild müssen ein einzelnes Element sein, im oberen Beispiel gibt es 253 Zahlen, und in „mnist“ gibt es nur eine Zahl, die Form der Ausgaben unterscheidet sich von den Beschriftungen.

Ich überprüfe das Tensorflow-Handbuch, tf.nn.softmax_cross_entropy_with_logits,
'Logits und Labels müssen dieselbe Form [batch_size, num_classes] und denselben dtype (entweder float32 oder float64) haben.'

Kann ich in diesem Fall Pytorch verwenden oder wie kann ich das tun?
vielen Dank

Hilfreichster Kommentar

Ich würde nicht sagen, dass TF-Dokumente der beste Ort sind, um mehr über die PyTorch-API zu erfahren 1-heiße Vektoren). Es sollte einfach sein, zwischen beiden Darstellungen zu konvertieren, wenn Sie es wirklich brauchen.

Beachten Sie, dass wir GitHub-Issues nur für Fehlerberichte verwenden. Wenn Sie Fragen haben, stellen Sie diese bitte in unseren Foren .

Alle 3 Kommentare

http://pytorch.org/docs/nn.html#crossentropyloss
CrossEntropyLoss-Form:
Eingabe: (N,C) wobei C = Anzahl der Klassen
Ziel: (N) wobei jeder Wert 0 <= Ziele[i] <= C-1 ist

habe ich eine andere Wahl?

Ich würde nicht sagen, dass TF-Dokumente der beste Ort sind, um mehr über die PyTorch-API zu erfahren 1-heiße Vektoren). Es sollte einfach sein, zwischen beiden Darstellungen zu konvertieren, wenn Sie es wirklich brauchen.

Beachten Sie, dass wir GitHub-Issues nur für Fehlerberichte verwenden. Wenn Sie Fragen haben, stellen Sie diese bitte in unseren Foren .

Danke, das Konvertieren der One-Hot-Klassencodierungsmatrix in einen Integer-Vektor hat das CrossEntropyLoss-Problem für mich behoben!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen