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?
opencv
o algo así, y luego esas posiciones de píxeles se guardan para cada imagen y luego se multiplican por los tensores de pérdida más adelante durante el entrenamiento para que el algoritmo se centre en reducir la pérdida en esas áreas.logp = logp.gather(1, target.view(batch_size, 1, H, W))
Tenga en cuenta que torch.nn.CrossEntropyLoss () es una clase que llama a torch.nn.functional. Ver https://pytorch.org/docs/stable/_modules/torch/nn/modules/loss.html#CrossEntropyLoss
Puede usar los pesos cuando defina los criterios. Comparándolos funcionalmente, ambos métodos son iguales.
Ahora, no entiendo su idea de calcular la pérdida dentro del ciclo de entrenamiento en el método 1 y fuera del ciclo de entrenamiento en el método 2. si calcula la pérdida fuera del ciclo, ¿cómo va a propagarse hacia atrás?
fuente
torch.nn.CrossEntropyLoss()
ytorch.nn.functional.cross_entropy(output, target, w)
, estaba confundido sobre cómo usar mapas de peso personalizados en la pérdida. Consulte este documento: arxiv.org/abs/1505.04597 y avíseme, si aún no puede entender lo que soy. preguntandograd can be implicitly created only for scalar outputs
funciona. Lo estoy obteniendo cuando ejecuto el método loss = loss * w