web-dev-qa-db-fra.com

Comment utiliser le BCELoss dans PyTorch?

Je veux écrire un simple encodeur automatique dans PyTorch et utiliser BCELoss , cependant, je récupère NaN, car il s'attend à ce que les cibles soient comprises entre 0 et 1. Quelqu'un pourrait-il publier un cas d'utilisation simple de BCELoss?

9
Qubix

Mise à jour

La fonction BCELoss n'était pas utilisée pour être numériquement stable. Voir ce problème https://github.com/pytorch/pytorch/issues/751 . Cependant, ce problème a été résolu avec Pull # 1792 , de sorte que BCELoss est numériquement stable maintenant!


Ancienne réponse

Si vous construisez PyTorch à partir des sources, vous pouvez utiliser la fonction stable numériquement BCEWithLogitsLoss (apportée dans https://github.com/pytorch/pytorch/pull/1792 ), qui prend des logits comme entrée.

Sinon, vous pouvez utiliser la fonction suivante (fournie par yzgao dans le numéro ci-dessus):

class StableBCELoss(nn.modules.Module):
       def __init__(self):
             super(StableBCELoss, self).__init__()
       def forward(self, input, target):
             neg_abs = - input.abs()
             loss = input.clamp(min=0) - input * target + (1 + neg_abs.exp()).log()
             return loss.mean()
17
cheezer

Vous souhaiterez peut-être utiliser une couche sigmoïde à la fin du réseau. De cette façon, le nombre représenterait des probabilités. Assurez-vous également que les cibles sont des nombres binaires. Si vous publiez votre code complet, nous pourrions vous aider davantage.

4
Roger Trullo