gpt4 book ai didi

python - keras.losses.binary_crossentropy 输出张量的形状

转载 作者:太空宇宙 更新时间:2023-11-03 20:36:11 25 4
gpt4 key购买 nike

我想在keras中基于binary_crossEntropy实现自定义损失函数。我对 Keras.losses.binary_crossentropy 的输出调整器的形状有疑问。我期望它应该是一个长度为batch_size的一维张量。但它返回一个形状为[批量大小,类别]的张量,所有类别的每行损失量相同。我应该手动使用 max 沿行吗?有没有更好的办法?为什么 K.binary_crossentropy 的输出不是一维张量?与数学概念有关吗?

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)

最佳答案

binary_crossentropy的计算公式为

−(ylog(p)+(1−y)log(1−p))

but it returns a tensor with shape of [batch size, classes] with identical loss amount in each row for all classes.

这是因为 binary_crossentropy 应用于每个位置。采用提供的示例中的第一组,y_true = [0.0, 1.0] 和 y_pred = [0.8, 0.2]

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

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

>>> y_true = tf.constant([0.0, 1.0])
>>> y_pred = tf.constant([0.8, 0.2])
>>> K.eval(K.binary_crossentropy(y_true, y_pred))
array([1.6094381, 1.609438 ], dtype=float32)

should i manually use max along rows?

不,由于值是单热编码的,因此必须取平均值。

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

https://github.com/keras-team/keras/blob/ed07472bc5fc985982db355135d37059a1f887a9/keras/losses.py#L76

或者,可以使用categorical_crossentropy,因为值是一次性编码的。

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

关于python - keras.losses.binary_crossentropy 输出张量的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57154569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com