获取 nan 作为损失值
Getting nan as loss value
我已经使用这个 paper 在 Pytorch 中实现了焦点损失。并且 运行 陷入损失问题 - 将 nan 作为损失函数值。
这是焦点损失的实现:
def focal_loss(y_real, y_pred, gamma = 2):
y_pred = torch.sigmoid(y_pred)
return -torch.sum((1 - y_pred)**gamma * y_real * torch.log(y_pred) +
y_pred**gamma * (1 - y_real) * torch.log(1 - y_pred))
Train loop 和我的 SegNet 正在工作,我认为是这样,因为我已经用 dice 和 bce 损失测试了它们。
我认为错误发生在反向传播中。为什么可以呢?也许我的实现是错误的?
这很可能是因为试图计算 log(0)。
我建议像这样更改代码:
EPS = 1e-9
def focal_loss(y_real, y_pred, gamma = 2):
y_pred = torch.sigmoid(y_pred)
y_pred = torch.clamp(y_pred, EPS, 1. - EPS)
return -torch.sum((1 - y_pred)**gamma * y_real * torch.log(y_pred) +
y_pred**gamma * (1 - y_real) * torch.log(1 - y_pred))
此版本有效:
def focal_loss(y_real, y_pred, eps = 1e-8, gamma = 0):
probabilities = torch.clamp(torch.sigmoid(y_pred), min=eps, max=1-eps)
return torch.mean((1 - probabilities)**gamma *
(y_pred - y_real * y_pred + torch.log(1 + torch.exp(-y_pred))))
我已经使用这个 paper 在 Pytorch 中实现了焦点损失。并且 运行 陷入损失问题 - 将 nan 作为损失函数值。
这是焦点损失的实现:
def focal_loss(y_real, y_pred, gamma = 2):
y_pred = torch.sigmoid(y_pred)
return -torch.sum((1 - y_pred)**gamma * y_real * torch.log(y_pred) +
y_pred**gamma * (1 - y_real) * torch.log(1 - y_pred))
Train loop 和我的 SegNet 正在工作,我认为是这样,因为我已经用 dice 和 bce 损失测试了它们。
我认为错误发生在反向传播中。为什么可以呢?也许我的实现是错误的?
这很可能是因为试图计算 log(0)。
我建议像这样更改代码:
EPS = 1e-9
def focal_loss(y_real, y_pred, gamma = 2):
y_pred = torch.sigmoid(y_pred)
y_pred = torch.clamp(y_pred, EPS, 1. - EPS)
return -torch.sum((1 - y_pred)**gamma * y_real * torch.log(y_pred) +
y_pred**gamma * (1 - y_real) * torch.log(1 - y_pred))
此版本有效:
def focal_loss(y_real, y_pred, eps = 1e-8, gamma = 0):
probabilities = torch.clamp(torch.sigmoid(y_pred), min=eps, max=1-eps)
return torch.mean((1 - probabilities)**gamma *
(y_pred - y_real * y_pred + torch.log(1 + torch.exp(-y_pred))))