12

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

4

2 回答 2

20

更新

BCELoss函数过去不是数值稳定的。请参阅此问题https://github.com/pytorch/pytorch/issues/751。但是,此问题已通过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()
于 2017-06-29T18:38:17.310 回答
4

您可能希望在网络末端使用 sigmoid 层。这样,数字将代表概率。还要确保目标是二进制数。如果您发布完整的代码,我们可能会提供更多帮助。

于 2017-05-05T18:34:07.170 回答