在一个句子中,我有几个自定义评估指标,一组必须在评估期间分批运行的评估数据,我想得到所有评估批次的这些指标的总和。
更多详情:
我使用TensorFlow的Estimator类构建模型,它适用于培训和评估。问题是,我的评估数据太大了,我需要使用自定义的input_fn
将它们分成批次。
电话看起来像是
eval_res = model.evaluate(input_fn=lambda:eval_input_fn(params['eval_data'], params['batch_size']))
在这种情况下,我将通过终端输出获得评估指标dict(让我们称之为eval_dict
)输出,但eval_res
只有结果最后一次评估批次。
我们假设eval_res
实际上包含eval_dict
的列表,那么我想要的是eval_res
中具有相同密钥的所有元素之和。
一个例子就像
eval_dict = {'metric1': 0.0, 'metric2': 0.0}
eval_list = [{'metric1': 0.1, 'metric2': 0.0}, {'metric1': 0.5, 'metric2': 1.0}]
desired_eval_result = {'metric1': 0.6, 'metric2': 1.0}
我尝试使用tf.add_to_collection
将指标操作存储到图表集合中,然后使用tf.get_collection
来获取它们。但tf.get_collection
的结果总是空的。我想我需要为它指定图形名称,但我不确定如何找到Estimator类的图形。
答案 0 :(得分:1)
每次调用model.evaluate
时,它都会再次运行model_fn
。因此,如果我使用tf.Variable
创建多个变量并使用assign_add
将每个评估批次的度量标准分数更新为变量,那么我可以成功获得所有评估批次的累计度量标准分数。
因为每次调用model_fn
时,tf.Variable(0., dtype=tf.float32)
调用都会将变量重置为0,之前的评估不会影响下次评估的结果。
代码示例如下:
hr_mean_rank_var = tf.Variable(0, name="hr_mean_rank", dtype=tf.float32, trainable=False)
hr_mr_update = hr_mean_rank_var.assign_add(mean_rank_eval_op)
eval_metric_dict = {'hr_mr' : hr_mr_update}
这次我打电话
eval_res = model.evaluate(input_fn=lambda:eval_input_fn(params['eval_data'], params['batch_size']))
我将获得累积的度量标准分数。