【问题标题】:Does tf.keras.losses.categorical_crossentropy return an array or a single value?tf.keras.losses.categorical_crossentropy 是返回数组还是单个值?
【发布时间】:2020-04-16 23:22:36
【问题描述】:

我正在使用自定义训练循环。 tf.keras.losses.categorical_crossentropy 返回的损失是我假设 (1,batch_size) 的数组。这是它应该返回的值还是单个值?

在后一种情况下,知道我做错了什么吗?

【问题讨论】:

    标签: python tensorflow keras loss-function


    【解决方案1】:

    大多数常见的损失会返回原始形状减去最后一个轴。

    因此,如果您的原始 y_pred 形状是 (samples, ..., ..., classes),那么您的最终形状将是 (samples, ..., ...)

    这可能是因为 Keras 可能会在进一步的计算中使用这个张量,用于样本权重和其他事情。

    在自定义循环中,如果这些尺寸无用,您可以在计算梯度之前简单地取一个K.mean(loss_result)。 (其中Kkeras.backendtensorflow.keras.backend

    【讨论】:

    • 谢谢丹尼尔。我已经在申请 K.mean(loss_result) 但只是想确认一下。
    【解决方案2】:

    如果您的预测形状为(samples of batch, classes) tf.keras.losses.categorical_crossentropy,则以(samples of batch,) 的形状返回损失。

    所以,如果你的标签是:

    [[1. 0. 0.]
     [0. 1. 0.]
     [0. 0. 1.]]
    

    你的预测是:

    [[0.9  0.05 0.05]
     [0.5  0.89 0.6 ]
     [0.05 0.01 0.94]]
    

    你会得到这样的损失:

    [0.10536055 0.8046684  0.06187541]
    

    在大多数情况下,您的模型将使用这些值的均值来更新您的模型参数。因此,如果您手动进行更新,您可以使用:

    loss = tf.keras.backend.mean(losses)
    

    【讨论】:

    • 感谢您的详细解答!
    • @UmairKhawaja 很高兴!如果您满意,请接受或点赞,实际上我想我给了您更具体的答案,尽管丹尼尔的回答在一般情况下也很有用。
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 2021-03-27
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多