在TensorFlow中获取一批model.evaluate结果的总和

时间:2017-02-07 00:53:52

标签: tensorflow

在一个句子中,我有几个自定义评估指标,一组必须在评估期间分批运行的评估数据,我想得到所有评估批次的这些指标的总和。

更多详情:

我使用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类的图形。

1 个答案:

答案 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']))

我将获得累积的度量标准分数。