如何在 PyTorch 中使用 BCELoss?

How to use the BCELoss in PyTorch?

我想在 PyTorch 中编写一个简单的自动编码器并使用 BCELoss,但是,我得到了 NaN,因为它期望目标在 0 和 1 之间。有人可以 post 一个简单的BCELoss 的用例?

您可能想在网络末端使用 S 形层。这样,数字就代表了概率。还要确保目标是二进制数。如果您 post 您的完整代码,我们可能会提供更多帮助。

更新

BCELoss 函数过去在数值上并不稳定。看到这个问题https://github.com/pytorch/pytorch/issues/751. However, this issue has been resolved with Pull #1792,所以BCELoss现在数值稳定了!


旧答案

如果您从源代码构建 PyTorch,则可以使用数值稳定函数 BCEWithLogitsLoss(贡献于 https://github.com/pytorch/pytorch/pull/1792),它将 logits 作为输入。

否则,您可以使用以下功能(yzgao 在上一期中提供):

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()