Hay un famoso truco en la arquitectura de u-net para usar mapas de peso personalizados para aumentar la precisión. A continuación se detallan los detalles
Ahora, al preguntar aquí y en muchos otros lugares, conozco dos enfoques. Quiero saber cuál es el correcto o ¿hay algún otro enfoque correcto que sea más correcto?
1) Primero es usar el torch.nn.Functional
método en el ciclo de entrenamiento
loss = torch.nn.functional.cross_entropy(output, target, w)
donde w será el peso personalizado calculado.
2) El segundo es usar reduction='none'
en la función de llamada de pérdida fuera del ciclo de entrenamiento
criterion = torch.nn.CrossEntropy(reduction='none')
y luego en el ciclo de entrenamiento multiplicando con el peso personalizado
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
Ahora, estoy un poco confundido ¿cuál es el correcto o hay alguna otra manera, o ambos tienen razón?