我已经对PyTorch交叉熵损失函数进行了自定义实现(因为我需要在以后引入更多的灵活性)。我打算用这个模型进行训练,但它需要相当长的时间来训练,而且可用资源不能仅用于测试函数是否正确实现。我已经实现了向量化实现,因为它运行起来更快。
以下是我编写的代码:
def custom_cross(my_pred,true,batch_size=BATCH_SIZE):
loss= -torch.mean(torch.sum(true.view(batch_size, -1) * torch.log(my_pred.view(batch_size, -1)), dim=1))
return loss
我希望你能提出一种更优化的实现方案,或者指出我当前的实现方案存在的错误。该模型将使用Nvidia Tesla K-80进行训练。
log(0)
未定义,我认为您需要在预测值和目标值中添加一个epsilon(1e-10
)。 - Craig.Limy_pred
是softmax的结果,您可以使用LogSoftmax
来避免一些指数。 - Jindřichsoftmax = e^{X} / [sum e^{X}]
,你总是会从除法中得到舍入误差,并且你会对X
进行指数运算,这不是最快的操作。如果你使用logsoftmax = X - log [sum e^{X}]
,你可以避免舍入误差,并且摆脱对X
进行指数和对数运算。由于聪明的实现,sum e^{X}
的对数与仅求和一样快,而且没有舍入误差。 - Jindřich