Press "Enter" to skip to content

如何理解Keras中的指标Metrics

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

Keras 库提供了一种在训练深度学习模型时计算和报告一套标准指标的方法。除了为分类和回归问题提供标准指标外,Keras 还允许您在深度学习时定义和报告自己的自定义指标。 如果您想在训练期间更好地捕捉模型的性能度量,这将特别有用。

 

在本教程中,您将了解如何使用内置指标,以及如何在 Keras 中训练深度学习模型时定义和使用自己的指标。完成本教程后,您将了解:

Keras 指标的工作原理以及在训练模型时如何使用它们。
如何通过工作示例在 Keras 中使用回归和分类指标。
如何通过工作示例在 Keras 中定义和使用您自己的自定义指标。

1 Keras指标

 

Keras 允许您在模型训练期间列出要监控的指标。您可以通过指定“metrics”参数并为模型上的 compile() 函数提供函数名称(或函数名称别名)列表来做到这一点。 例如:

 

model.compile(..., metrics=['mse'])

 

您列出的特定指标可以是 Keras 函数的名称(如 mean_squared_error)或这些函数的字符串别名(如“mse”)。

 

度量值记录在训练数据集上每个 epoch 的末尾。 如果还提供了验证数据集,则还会为验证数据集计算记录的度量。

 

所有指标都在详细输出和调用 fit() 函数返回的历史对象中报告。 在这两种情况下,度量函数的名称都用作度量值的键。 对于验证数据集的指标,“val_”前缀被添加到键中。

 

损失函数和明确定义的 Keras 指标都可以用作训练指标。

 

2 Keras回归指标

 

以下是您可以在 Keras 中用于回归问题的指标列表。

均方误差:mean_squared_error、MSE 或
平均绝对误差:mean_absolute_error, MAE, mae
平均绝对百分比误差:mean_absolute_percentage_error、MAPE、mape
余弦接近度:cosine_proximity,余弦

上述四个指标,值越小,模型的拟合程度越好,但并不代表模型的预测效果越好,只能假设拟合效果好的模型预测效果也好。换一句不太严谨但很好记的话:上述指标值越小,模型预测效果越好。

 

下面的示例演示了一个简单的人为回归问题的这 4 个内置回归指标。

 

from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from matplotlib import pyplot
# 准备模型
X = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
# create model
model = Sequential()
model.add(Dense(2, input_dim=1))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=['mse', 'mae', 'mape', 'cosine'])
# 训练模型
history = model.fit(X, X, epochs=500, batch_size=len(X), verbose=2)
# 画图看指标
pyplot.plot(history.history['mean_squared_error'])
pyplot.plot(history.history['mean_absolute_error'])
pyplot.plot(history.history['mean_absolute_percentage_error'])
pyplot.plot(history.history['cosine_proximity'])
pyplot.show()

 

注意:您的结果可能会因算法或评估过程的随机性或数值精度的差异而有所不同。 考虑运行该示例几次并比较平均结果。

 

运行该示例会在每个 epoch 结束时打印度量值。

 

...
Epoch 96/100
0s - loss: 1.0596e-04 - mean_squared_error: 1.0596e-04 - mean_absolute_error: 0.0088 - mean_absolute_percentage_error: 3.5611 - cosine_proximity: -1.0000e+00
Epoch 97/100
0s - loss: 1.0354e-04 - mean_squared_error: 1.0354e-04 - mean_absolute_error: 0.0087 - mean_absolute_percentage_error: 3.5178 - cosine_proximity: -1.0000e+00
Epoch 98/100
0s - loss: 1.0116e-04 - mean_squared_error: 1.0116e-04 - mean_absolute_error: 0.0086 - mean_absolute_percentage_error: 3.4738 - cosine_proximity: -1.0000e+00
Epoch 99/100
0s - loss: 9.8820e-05 - mean_squared_error: 9.8820e-05 - mean_absolute_error: 0.0085 - mean_absolute_percentage_error: 3.4294 - cosine_proximity: -1.0000e+00
Epoch 100/100
0s - loss: 9.6515e-05 - mean_squared_error: 9.6515e-05 - mean_absolute_error: 0.0084 - mean_absolute_percentage_error: 3.3847 - cosine_proximity: -1.0000e+00

 

然后在训练时期创建 4 个指标的线图。

 

 

请注意,指标是使用字符串别名值 [‘mse‘, ‘mae‘, ‘mape‘, ‘cosine‘] 指定的,并使用它们的扩展函数名称作为history对象上的键值引用。

 

我们还可以使用扩展名称指定指标,如下所示:

 

model.compile(loss='mse', optimizer='adam', metrics=['mean_squared_error', 'mean_absolute_error', 'mean_absolute_percentage_error', 'cosine_proximity'])

 

如果函数名被导入到脚本中,我们也可以直接指定它们。

 

from keras import metrics
model.compile(loss='mse', optimizer='adam', metrics=[metrics.mean_squared_error, metrics.mean_absolute_error, metrics.mean_absolute_percentage_error, metrics.cosine_proximity])

 

您还可以将损失函数用作度量。例如,您可以将均方对数误差(mean_squared_logarithmic_error,MSLE 或 msle)损失函数用作度量,如下所示:

 

model.compile(loss='mse', optimizer='adam', metrics=['msle'])

 

3 Keras分类指标

 

以下是您可以在 Keras 中用于分类问题的指标列表。

二进制精度:binary_accuracy,acc
分类准确度:categorical_accuracy, acc
稀疏分类准确度:sparse_categorical_accuracy
Top k Categorical Accuracy:top_k_categorical_accuracy(需要你指定一个k参数)
稀疏 Top k 分类准确度:sparse_top_k_categorical_accuracy(需要您指定 k 参数)

准确性是特殊的。无论您的问题是二分类问题还是多类分类问题,您都可以指定“accuracy”指标来报告准确性。

 

下面是一个二进制分类问题的示例,其中演示了内置的准确度指标。

 

from numpy import array
from keras.models import Sequential
from keras.layers import Dense
from matplotlib import pyplot
# 准备数据
X = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
y = array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
# 创建模型
model = Sequential()
model.add(Dense(2, input_dim=1))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型
history = model.fit(X, y, epochs=400, batch_size=len(X), verbose=2)
# 绘制指标
pyplot.plot(history.history['accuracy'])
pyplot.show()

 

注意:您的结果可能会因算法或评估过程的随机性或数值精度的差异而有所不同。 考虑运行该示例几次并比较平均结果。

 

运行该示例会报告每个训练时期结束时的准确性。

 

...
Epoch 396/400
0s - loss: 0.5934 - acc: 0.9000
Epoch 397/400
0s - loss: 0.5932 - acc: 0.9000
Epoch 398/400
0s - loss: 0.5930 - acc: 0.9000
Epoch 399/400
0s - loss: 0.5927 - acc: 0.9000
Epoch 400/400
0s - loss: 0.5925 - acc: 0.9000

 

 

4 在Keras中自定义指标

 

您还可以在调用 compile() 函数时定义自己的指标并在“metrics”参数的函数列表中指定函数名称。

 

自定义指标我还没用过,甚至没有见到别人用过。因此猜测自定义指标的适用情况很少。当你选用自定义指标时,至少要问自己三个问题:常用指标真的不能满足需求吗?用以衡量模型的常用指标选择正确吗,有没有用分类的指标衡量回归问题?我的数学好到可以正确理解“metrics”参数的函数列表中哪些函数是干什幺用的了吗?至少我被第一个问题拦住了去路。以后用到自定义指标再补写着部分吧。^_^

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。