我尝试使用 SparseCategoricalCrossEntropy
进行一些自定义设置,但当概率总和不等于1时,我发现结果与预期不符。
我是不是理解错了什么?它在底层做了什么?
回答:
让我们看看keras 对 numpy 的损失函数实现:
def categorical_crossentropy(target, output, from_logits=False):
if from_logits:
output = softmax(output)
else:
output /= output.sum(axis=-1, keepdims=True)
output = np.clip(output, 1e-7, 1 - 1e-7)
return np.sum(target * -np.log(output), axis=-1, keepdims=False)
如你所见,输出被所有概率的总和所除,因此我们有:
-np.log(.89/(.5 + .89 + .6)) # 0.8046684549923527