我正在构建一个如下所示的二元分类器。我可以替换 BCELoss 来优化 f1 分数吗?
criterion = nn.BCELoss()
preds = model(inputs)
loss = criterion(preds , labels)
Jindřich 提到的 Kaggle 教程中显示的 TensorFlow 示例的一个 PyTorch 实现是:
import torch
def f1(y_true, y_pred):
y_pred = torch.round(y_pred)
tp = torch.sum((y_true * y_pred).float(), dim=0)
tn = torch.sum(((1 - y_true) * (1 - y_pred)).float(), dim=0)
fp = torch.sum(((1 - y_true) * y_pred).float(), dim=0)
fn = torch.sum((y_true * (1 - y_pred)).float(), dim=0)
p = tp / (tp + fp + 1e-7)
r = tp / (tp + fn + 1e-7)
f1 = 2 * p * r / (p + r + 1e-7)
f1 = torch.where(torch.isnan(f1), torch.zeros_like(f1), f1)
return torch.mean(f1)
def f1_loss(y_true, y_pred):
tp = torch.sum((y_true * y_pred).float(), dim=0)
tn = torch.sum(((1 - y_true) * (1 - y_pred)).float(), dim=0)
fp = torch.sum(((1 - y_true) * y_pred).float(), dim=0)
fn = torch.sum((y_true * (1 - y_pred)).float(), dim=0)
p = tp / (tp + fp + 1e-7)
r = tp / (tp + fn + 1e-7)
f1 = 2 * p * r / (p + r + 1e-7)
f1 = torch.where(torch.isnan(f1), torch.zeros_like(f1), f1)
return 1 - torch.mean(f1)