Python keras.Loss.binary_交叉熵输出张量的形状

Python keras.Loss.binary_交叉熵输出张量的形状,python,tensorflow,keras,tensor,cross-entropy,Python,Tensorflow,Keras,Tensor,Cross Entropy,我想在keras中实现一个基于二进制交叉熵的自定义损失函数。我对Keras.Loss.binary_交叉熵的输出tnesor的形状有疑问。我希望它应该是一个1D张量,长度为批量大小。但它返回一个张量,其形状为[batch size,classes],所有类的每行损失量相同。 我应该沿行手动使用max吗?有更好的办法吗? 为什么K.二元交叉熵的输出不是一维张量?它与数学概念有关吗 def custom_loss(y_true, y_pred): loss_tensor = K.binary

我想在keras中实现一个基于二进制交叉熵的自定义损失函数。我对Keras.Loss.binary_交叉熵的输出tnesor的形状有疑问。我希望它应该是一个1D张量,长度为批量大小。但它返回一个张量,其形状为[batch size,classes],所有类的每行损失量相同。 我应该沿行手动使用max吗?有更好的办法吗? 为什么K.二元交叉熵的输出不是一维张量?它与数学概念有关吗

def custom_loss(y_true, y_pred):
    loss_tensor = K.binary_crossentropy(y_true, y_pred)
    # return K.max(loss_tensor, axis=1)
    return  loss_tensor

# model.compile(loss={'classifier':'kullback_leibler_divergence'},optimizer='Nadam',metrics=['acc'])


tmp_y_true = tf.constant([[0.0, 1.0], [1.0, 0.0]])
tmp_y_pred = tf.constant([[0.8, 0.2], [0.75, 0.25]])
output = custom_loss(tmp_y_true, tmp_y_pred)
tmp_out = K.eval(output)

二进制交叉熵是一个令人困惑的名字。它并不意味着每个数据点都有一个
0
1
的二进制。它用于解决多类问题。例如,预测图像是否有
0只狗,0只猫
1只狗,0只猫
0只狗,1只猫
1只狗,1只猫
。每个类对它是否存在都有自己的独立预测。损失是二进制的,因为每个类都是二进制的(存在与否)。因此,预期的输出形状是
[批量大小,类]

有关更多信息,请访问:


计算二进制交叉熵的公式是

−(ylog(p)+(1−y)log(1−p))
但它返回一个张量,其形状为[batch size,classes],带有 所有类别的每行损失金额相同

这是因为二进制交叉熵应用于每个位置。以提供的示例中的第一个集合为例,y_true=[0.0,1.0]和y_pred=[0.8,0.2]

y_true=0,y_pred=0.8,应用公式,损耗=-(0*log(0.8)+1*log(1-0.8))=1.609

y_true=1,y_pred=0.2,应用公式,损耗=-(1*log(0.2)+0*log(1-0.2))=1.609

我应该沿行手动使用max吗

不,因为值是一个热编码的,所以必须取平均值

>>> K.eval(K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1))
1.609438

或者,可以使用
categorical\u crossentropy
,因为这些值是一个热编码的值

>>> K.eval(K.categorical_crossentropy(y_true, y_pred))
1.609438
>>> K.eval(K.categorical_crossentropy(y_true, y_pred))
1.609438