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

标签 python tensorflow keras tensor cross-entropy

我想在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/

相关文章:

python - django-rest-framework:无法处理 unicode 输入(无效的连续字节)

python - python 中空白/标点符号的小问题?

batch-file - CNN 上的快速损失收敛意味着什么?

python - 我无法在 gridsearch 中添加优化器参数

python - Scrapy 和代理

Python: "Multiple"函数中有多个参数

audio - 我可以使用Tensorflow使用旧模型训练新数据吗?

python - 如何将我自己的图像输入 Cifar10 训练模型并获得标签作为输出?

python - 即使使用相同的数据,Keras 训练和验证指标值也不同(逻辑回归)

python-3.x - 如何在 Keras 回归模型中包含特征的归一化?