Keras 中的 model.evaluate() 返回啥值?

Posted

技术标签:

【中文标题】Keras 中的 model.evaluate() 返回啥值?【英文标题】:What values are returned from model.evaluate() in Keras?Keras 中的 model.evaluate() 返回什么值? 【发布时间】:2018-12-20 08:12:51 【问题描述】:

我的模型从多个 Dense 层获得了多个输出。我的模型将'accuracy' 作为编译中的唯一指标。我想知道每个输出的损失和准确性。这是我的代码的一部分。

scores = model.evaluate(X_test, [y_test_one, y_test_two], verbose=1)

当我打印出分数时,这就是结果。

[0.7185557290413819, 0.3189622712272771, 0.39959345855771927, 0.8470299135229717, 0.8016634374641469]

这些数字代表什么?

我是 Keras 的新手,这可能是一个微不足道的问题。但是,我已经阅读了 Keras 的文档,但我仍然不确定。

【问题讨论】:

【参考方案1】:

引用自evaluate() method documentation:

退货

标量测试损失(如果模型只有一个输出且没有指标)或 标量列表(如果模型有多个输出和/或指标)。 model.metrics_names 属性将为您提供显示标签 用于标量输出。

因此,您可以使用模型的metrics_names 属性来找出每个值对应的内容。例如:

from keras import layers
from keras import models
import numpy as np

input_data = layers.Input(shape=(100,)) 
out_1 = layers.Dense(1)(input_data)
out_2 = layers.Dense(1)(input_data)

model = models.Model(input_data, [out_1, out_2])
model.compile(loss='mse', optimizer='adam', metrics=['mae'])

print(model.metrics_names)

输出以下内容:

['loss', 'dense_1_loss', 'dense_2_loss', 'dense_1_mean_absolute_error', 'dense_2_mean_absolute_error']

表示您在evaluate 方法的输出中看到的每个数字对应于什么。

此外,如果您有很多层,那么 dense_1dense_2 的名称可能有点模棱两可。要解决这种歧义,您可以使用层的name 参数为层分配名称(不一定在所有层上,而仅在输入和输出层上):

# ...
out_1 = layers.Dense(1, name='output_1')(input_data)
out_2 = layers.Dense(1, name='output_2')(input_data)
# ...

print(model.metrics_names)

输出更清晰的描述:

['loss', 'output_1_loss', 'output_2_loss', 'output_1_mean_absolute_error', 'output_2_mean_absolute_error']

【讨论】:

【参考方案2】:

我们应该清楚,“损失”数字是为 x_test 数组中的每个项目计算的 ALL 损失的总和。 x_test 将包含您的测试数据,而 y_test 将包含您的标签。损失值是所有损失的总和,而不仅仅是 x_test 数组中一项的损失。

【讨论】:

以上是关于Keras 中的 model.evaluate() 返回啥值?的主要内容,如果未能解决你的问题,请参考以下文章

Keras model.evaluate() 和 model.predict() 有啥区别?

Keras model.evaluate_generator结果几乎是真实准确度的两倍?

Keras:训练和验证集上的 model.evaluate() 与上次训练时期后的 acc 和 val_acc 不同

keras训练完模型,为啥对训练集进行evaluate和训练时的loss完全不一样?白训练了吗?

从 Keras model.predict_generator 计算准确率

Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同