如何在 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()
我想在 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()