Machine learning pytorch中的自定义交叉熵损失

Machine learning pytorch中的自定义交叉熵损失,machine-learning,artificial-intelligence,pytorch,cross-entropy,Machine Learning,Artificial Intelligence,Pytorch,Cross Entropy,我已经完成了pytorch交叉熵损失函数的定制实现(因为我需要更大的灵活性,稍后再介绍)。我打算用它来训练的模型需要相当长的时间来训练,可用的资源不能仅仅用于测试功能是否正确实现。我已经实现了矢量化实现,因为它将更快地运行 以下是我的代码: def custom_cross(my_pred,true,batch_size=batch_size): 损失=-torch.mean(torch.sum(true.view(批大小,-1)*torch.log(my_pred.view(批大小,-1)),

我已经完成了pytorch交叉熵损失函数的定制实现(因为我需要更大的灵活性,稍后再介绍)。我打算用它来训练的模型需要相当长的时间来训练,可用的资源不能仅仅用于测试功能是否正确实现。我已经实现了矢量化实现,因为它将更快地运行

以下是我的代码:

def custom_cross(my_pred,true,batch_size=batch_size):
损失=-torch.mean(torch.sum(true.view(批大小,-1)*torch.log(my_pred.view(批大小,-1)),dim=1))
回波损耗
如果你能建议一个更优化的实现,或者如果我现在犯了一个错误,我将不胜感激。该型号将使用Nvidia Tesla K-80进行训练。

如果您需要,您可以利用Pytork定义的优势

import torch.nn.functional as F
loss_func = F.cross_entropy
建议更优化的实现

PyTorch有
F.
loss函数,但您可以使用普通python轻松编写自己的函数。 PyTorch将自动为您的功能创建快速GPU或矢量化CPU代码

因此,您可以检查PyTorch的原始实现,但我认为:

def log_softmax(x):
    return x - x.exp().sum(-1).log().unsqueeze(-1)
这是交叉熵损失的原始实现,现在您可以修改:

nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction)

你需要的东西,你已经拥有了

原因
log(0)
未定义,我认为您需要在预测和目标中添加ε(
1e-10
)。如果
my_pred
是softmax的结果,您可以使用来避免一些指数。@Craig.Li这是一个非常有价值的建议,谢谢。@Jindřich是的,确实我的pred是softmax的结果,但很抱歉,我不确定这会产生什么影响或可能的实现,请允许我要求更多的解释,谢谢。如果您使用softmax
softmax=e^{X}/[sum e^{X}]
,您总是会从除法中得到舍入误差,并以指数形式计算
X
,这不是最快的操作。如果执行
logsoftmax=X-log[sum e^{X}]
,则可以避免舍入错误,并避免对
X
进行幂运算和对数运算。
sum e^{X}
的对数与求和一样快,并且没有舍入误差,因为,