带有 TF 后端的 Keras 指标与 tensorflow 指标
Keras metrics with TF backend vs tensorflow metrics
当 Keras 2.x 删除某些指标时,变更日志说这样做是因为它们 "Batch-based" 因此并不总是准确的。这是什么意思? tensorflow 中包含的相应指标是否存在相同的缺点?例如:精确率和召回率指标。
我们以精度为例。 stateless version which was removed 是这样实现的:
def precision(y_true, y_pred):
"""Precision metric.
Only computes a batch-wise average of precision.
Computes the precision, a metric for multi-label classification of
how many selected items are relevant.
"""
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
如果 y_true
包含数据集中的所有标签并且 y_pred
具有与所有这些标签对应的模型预测,这很好。
问题是人们经常将他们的数据集分成批次,例如通过对 1000 张图像进行 运行 10 次评估来评估 10000 张图像。这可能是适应内存限制所必需的。在这种情况下,您将获得 10 个不同的精度分数,无法将它们组合起来。
有状态指标通过在持续整个评估的变量中保留中间值来解决这个问题。因此,在 precision
的情况下,有状态指标可能具有 true_positives
和 predicted_positives
的持久计数器。 TensorFlow 指标是有状态的,例如tf.metrics.precision.
当 Keras 2.x 删除某些指标时,变更日志说这样做是因为它们 "Batch-based" 因此并不总是准确的。这是什么意思? tensorflow 中包含的相应指标是否存在相同的缺点?例如:精确率和召回率指标。
我们以精度为例。 stateless version which was removed 是这样实现的:
def precision(y_true, y_pred):
"""Precision metric.
Only computes a batch-wise average of precision.
Computes the precision, a metric for multi-label classification of
how many selected items are relevant.
"""
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
如果 y_true
包含数据集中的所有标签并且 y_pred
具有与所有这些标签对应的模型预测,这很好。
问题是人们经常将他们的数据集分成批次,例如通过对 1000 张图像进行 运行 10 次评估来评估 10000 张图像。这可能是适应内存限制所必需的。在这种情况下,您将获得 10 个不同的精度分数,无法将它们组合起来。
有状态指标通过在持续整个评估的变量中保留中间值来解决这个问题。因此,在 precision
的情况下,有状态指标可能具有 true_positives
和 predicted_positives
的持久计数器。 TensorFlow 指标是有状态的,例如tf.metrics.precision.