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?
opencv
ou algo assim, e essas posições de pixel são salvas para cada imagem e depois multiplicadas pelos tensores de perda mais tarde durante o treinamento, para que o algoritmo se concentre em reduzir a perda nessas áreas.logp = logp.gather(1, target.view(batch_size, 1, H, W))
Observe que torch.nn.CrossEntropyLoss () é uma classe que chama torch.nn.funcional. Consulte https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html#CrossEntropyLoss
Você pode usar os pesos ao definir os critérios. Comparando-os funcionalmente, ambos os métodos são os mesmos.
Agora, não entendo sua idéia de calcular a perda dentro do loop de treinamento no método 1 e fora do loop de treinamento no método 2. se você calcular a perda fora do loop, como irá retropropagar?
fonte
torch.nn.CrossEntropyLoss()
etorch.nn.functional.cross_entropy(output, target, w)
, eu estava confuso como usar o peso mapas personalizados no loss.Please ver este papel - arxiv.org/abs/1505.04597 e deixe-me saber, se você ainda não são capazes de descobrir o que eu sou perguntagrad can be implicitly created only for scalar outputs
quando eu corro perda = perda * w método