如何在 Keras 中手动计算损失?

How to compute loss manually in Keras?

我正在使用损失函数:

meanAbsoluteError = tf.keras.losses.MeanAbsoluteError()

还有一个模型:

model.compile(optimizer=tf.keras.optimizers.Adam(0.001), loss=meanAbsoluteError)

现在我训练它并获取历史记录:

history = model.fit(train_features, train_labels, epochs=100, validation_data=(test_features, test_labels))

我可以看看最后损失有多低:

print(history.history["val_loss"][-1])

现在我尝试手动计算测试数据的损失,使用与训练时传入 validation_data 相同的数据:

print(meanAbsoluteError(model(test_features), test_labels).numpy())

但这给了我一个完全不同的数字!在我看来,这应该等于我从前面的表达式中得到的损失。但事实并非如此。

为什么两个数不相等,哪个是正确的损失?

我在这里检查了如何调用损失函数:https://www.tensorflow.org/api_docs/python/tf/keras/losses/Loss#call

我将其编辑为使用 history.history["val_loss"] 而不是建议的 history.history["loss"],但它并没有修复它。

您的问题似乎是由批量大小引起的。 history['val_loss']中的loss是在batch上计算的。如果您的 test_features 与训练批次的大小不同,则会给您带来更大的损失。

你应该试试:

print(meanAbsoluteError(model(test_features[:batch_size]), test_labels[:batch_size]).numpy())