tf.keras.losses.categorical_crossentropy return 是数组还是单个值?
Does tf.keras.losses.categorical_crossentropy return an array or a single value?
我正在使用自定义训练循环。由 tf.keras.losses.categorical_crossentropy
编辑的 return 的损失是我假设 (1,batch_size)
的数组。这是应该的 return 还是单个值?
在后一种情况下,知道我做错了什么吗?
最常见的损失 return 原始形状减去最后一个轴。
因此,如果您原来的 y_pred
形状是 (samples, ..., ..., classes)
,那么您得到的形状将是 (samples, ..., ...)
。
这可能是因为 Keras 可能会在进一步的计算中使用这个张量,用于样本权重和其他东西。
在自定义循环中,如果这些维度没有用,您可以在计算梯度之前简单地取一个K.mean(loss_result)
。 (其中 K
是 keras.backend
或 tensorflow.keras.backend
)
如果您的预测形状为 (samples of batch, classes)
tf.keras.losses.categorical_crossentropy
returns 则损失为 (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]
在大多数情况下,您的模型将使用这些值的 mean 来更新您的模型参数。因此,如果您手动进行更新,您可以使用:
loss = tf.keras.backend.mean(losses)
我正在使用自定义训练循环。由 tf.keras.losses.categorical_crossentropy
编辑的 return 的损失是我假设 (1,batch_size)
的数组。这是应该的 return 还是单个值?
在后一种情况下,知道我做错了什么吗?
最常见的损失 return 原始形状减去最后一个轴。
因此,如果您原来的 y_pred
形状是 (samples, ..., ..., classes)
,那么您得到的形状将是 (samples, ..., ...)
。
这可能是因为 Keras 可能会在进一步的计算中使用这个张量,用于样本权重和其他东西。
在自定义循环中,如果这些维度没有用,您可以在计算梯度之前简单地取一个K.mean(loss_result)
。 (其中 K
是 keras.backend
或 tensorflow.keras.backend
)
如果您的预测形状为 (samples of batch, classes)
tf.keras.losses.categorical_crossentropy
returns 则损失为 (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]
在大多数情况下,您的模型将使用这些值的 mean 来更新您的模型参数。因此,如果您手动进行更新,您可以使用:
loss = tf.keras.backend.mean(losses)