如何在 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())
我正在使用损失函数:
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())