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?