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?
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!
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()
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.