我希望 tensorflow 在评估我的估计器期间计算确定系数(R 平方)。根据官方指标的实现,我尝试通过以下方式松散地实现它:
def r_squared(labels, predictions, weights=None,
metrics_collections=None,
updates_collections=None,
name=None):
total_error = tf.reduce_sum(tf.square(labels - tf.reduce_mean(labels)))
unexplained_error = tf.reduce_sum(tf.square(labels - predictions))
r_sq = 1 - tf.div(unexplained_error, total_error)
# update_rsq_op = ?
if metrics_collections:
ops.add_to_collections(metrics_collections, r_sq)
# if updates_collections:
# ops.add_to_collections(updates_collections, update_rsq_op)
return r_sq #, update_rsq_op
然后,我将此函数用作 EstimatorSpec 中的度量:
estim_specs = tf.estimator.EstimatorSpec(
...
eval_metric_ops={
'r_squared': r_squared(labels, predictions),
...
})
但是,这失败了,因为我的 R 平方实现没有返回 update_op。
TypeError: Values of eval_metric_ops must be (metric_value, update_op) tuples, given: Tensor("sub_4:0", dtype=float64) for key: r_squared
现在我想知道, update_op 到底应该做什么?我真的需要实现 update_op 还是我可以以某种方式创建某种虚拟 update_op?如果有必要,我将如何实施?