Es gibt einen berühmten Trick in der U-Net-Architektur, benutzerdefinierte Gewichtskarten zu verwenden, um die Genauigkeit zu erhöhen.
Wenn ich hier und an mehreren anderen Stellen frage, lerne ich zwei Ansätze kennen. Ich möchte wissen, welcher richtig ist, oder gibt es einen anderen richtigen Ansatz, der korrekter ist?
1) Zuerst ist die torch.nn.Functional
Methode in der Trainingsschleife zu verwenden.
loss = torch.nn.functional.cross_entropy(output, target, w)
Dabei ist w das berechnete benutzerdefinierte Gewicht.
2) Zweitens ist reduction='none'
beim Aufrufen der Verlustfunktion außerhalb der Trainingsschleife zu verwenden
criterion = torch.nn.CrossEntropy(reduction='none')
und dann in der Trainingsschleife mit dem benutzerdefinierten Gewicht multiplizieren-
gt # Ground truth, format torch.long
pd # Network output
W # per-element weighting based on the distance map from UNet
loss = criterion(pd, gt)
loss = W*loss # Ensure that weights are scaled appropriately
loss = torch.sum(loss.flatten(start_dim=1), axis=0) # Sums the loss per image
loss = torch.mean(loss) # Average across a batch
Jetzt bin ich ein bisschen verwirrt, welches richtig ist oder gibt es einen anderen Weg oder beide sind richtig?
quelle
opencv
oder so vorberechnet , und dann werden diese Pixelpositionen für jedes Bild gespeichert und später während des Trainings mit den Verlusttensoren multipliziert, so dass sich der Algorithmus auf die Reduzierung des Verlusts in diesen Bereichen konzentriert.logp = logp.gather(1, target.view(batch_size, 1, H, W))
Beachten Sie, dass torch.nn.CrossEntropyLoss () eine Klasse ist, die torch.nn.functional aufruft. Siehe https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html#CrossEntropyLoss
Sie können die Gewichte verwenden, wenn Sie die Kriterien definieren. Wenn man sie funktional vergleicht, sind beide Methoden gleich.
Nun, ich verstehe Ihre Idee, Verluste innerhalb der Trainingsschleife in Methode 1 und außerhalb der Trainingsschleife in Methode 2 zu berechnen, nicht. Wenn Sie Verluste außerhalb der Schleife berechnen, wie werden Sie dann rückpropagieren?
quelle
torch.nn.CrossEntropyLoss()
undtorch.nn.functional.cross_entropy(output, target, w)
, ich war verwirrt, wie man benutzerdefinierte Gewichtskarten im Verlust verwendet. Bitte lesen Sie dieses Papier - arxiv.org/abs/1505.04597 und lassen Sie mich wissen, wenn Sie immer noch nicht in der Lage sind, herauszufinden, was ich bin Fragengrad can be implicitly created only for scalar outputs
Ich bekomme, wenn ich verlust = verlust * w-Methode laufen lasse