Python tf.keras.loss.category_crossentropy返回数组还是单个值?

Python tf.keras.loss.category_crossentropy返回数组还是单个值?,python,tensorflow,keras,loss-function,Python,Tensorflow,Keras,Loss Function,我正在使用自定义的训练循环。tf.keras.loss.categorical\u crossentropy返回的损失是一个数组,我假设(1,批大小)。这是它应该返回的值还是单个值 在后一种情况下,你知道我做错了什么吗?大多数常见的损失返回原始形状减去最后一个轴 因此,如果原始的y\u pred形状是(示例,…,类),则生成的形状将是(示例,…) 这可能是因为Keras可能会在进一步的计算中使用这个张量,用于样本权重,或者其他事情 在自定义循环中,如果这些维度没有用处,您只需在计算渐变之前取K.

我正在使用自定义的训练循环。
tf.keras.loss.categorical\u crossentropy
返回的损失是一个数组,我假设
(1,批大小)
。这是它应该返回的值还是单个值


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

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

因此,如果原始的
y\u pred
形状是
(示例,…,类)
,则生成的形状将是
(示例,…)

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


在自定义循环中,如果这些维度没有用处,您只需在计算渐变之前取
K.mean(loss\u result)
。(其中
K
keras.backend
tensorflow.keras.backend

如果预测形状为
(批次、类的样本)
tf.keras.loss.Category\u crossentropy
(批次样本,)
的形式返回损失

因此,如果您的标签是:

[[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)

谢谢你,丹尼尔。我已经在申请K.mean(损失结果),但只是想确认一下。谢谢你的详细回答@UmairKhawaja,我的荣幸!如果你感到满意,请接受它或投票,实际上我想我给了你更具体的答案,虽然丹尼尔的答案在一般情况下也很有用。