我想在 PyTorch 中编写一个简单的自动编码器并使用BCELoss,但是,我得到了 NaN,因为它期望目标在 0 和 1 之间。有人可以发布一个简单的 BCELoss 用例吗?
问问题
28109 次
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 回答