Existe um truque famoso na arquitetura u-net para usar mapas de peso personalizados para aumentar a precisão. Abaixo estão os detalhes:
Agora, perguntando aqui e em vários outros lugares, conheço duas abordagens. Quero saber qual é a correta ou se existe outra abordagem correta que seja mais correta?
1) Primeiro é usar o torch.nn.Functional
método no loop de treinamento
loss = torch.nn.functional.cross_entropy(output, target, w)
onde w será o peso personalizado calculado.
2) O segundo é usar reduction='none'
na chamada da função de perda fora do loop de treinamento
criterion = torch.nn.CrossEntropy(reduction='none')
e depois no ciclo de treinamento, multiplicando-se pelo 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
Agora, estou meio confuso qual é o certo ou existe alguma outra maneira, ou ambos estão certos?