查看sklearn和bceloss in pytorch中的logloss的文档,这些文档应该是相同的,即仅使用权重的正常日志损失。但是,它们的行为有所不同 - 无论是在施加权重的情况下还是没有权重。有人可以向我解释吗?我找不到Bceloss的源代码(它是指内部binary_cross_entropy(。
input = torch.randn((3, 1), requires_grad=True)
target = torch.ones((3, 1), requires_grad=False)
w = torch.randn((3, 1), requires_grad=False)
# ----- With weights
w = F.sigmoid(w)
criterion_test = nn.BCELoss(weight=w)
print(criterion_test(input=F.sigmoid(input), target=F.sigmoid(target)))
print(log_loss(y_true=target.detach().numpy(),
y_pred=F.sigmoid(input).detach().numpy(), sample_weight=w.detach().numpy().reshape(-1), labels=np.array([0.,1.])))
print("")
print("")
# ----- Without weights
criterion_test = nn.BCELoss()
print(criterion_test(input=F.sigmoid(input),target=F.sigmoid(target)))
print(log_loss(y_true=target.detach().numpy(),
y_pred=F.sigmoid(input).detach().numpy(), labels=np.array([0.,1.])))
关于没有权重的计算,使用BCEWithLogitsLoss
,您获得的结果与sklearn.metrics.log_loss
:
import torch
import torch.nn as nn
from sklearn.metrics import log_loss
import numpy as np
input = torch.randn((3, 1), requires_grad=True)
target = torch.ones((3, 1), requires_grad=False)
# ----- Without weights
criterion = torch.nn.BCEWithLogitsLoss()
criterion(input, target)
print('{:.6f}'.format(criterion(input, target)))
print('{:.6f}'.format((log_loss(y_true=target.detach().numpy(),
y_pred=torch.sigmoid(input).detach().numpy(),
labels=np.array([0.,1.])))))
请注意:
此损失结合了一个sigmoid层和一个单一的bceloss 班级。这个版本在数值上比使用平原更稳定 Sigmoid,然后将操作结合到一个 层,我们利用数值的log-sum-exp技巧 稳定性。
实际上,我发现了。事实证明,当权重总和超过输入数组的维度时,Bceloss和log_loss的行为。有趣的。