1

我正在研究一个自定义指标,我update_op是当前值和上一次运行的值的函数。我该如何使用它们?我有这样的

x, y = f(data)

var1 = metric_variable([], dtypes.float32)
var1_op = state_ops.assign_add(var1, x + y_previous_iteration)

var2 = metric_variable([], dtypes.float32)
var2_op = state_ops.assign_add(var2, y)

value = _aggregate_across_replicas(
            metrics_collections, f2, var1, var2)
update_op = f2(var1_op, var2_op)

更新:指标的工作方式是在每一步的评估过程中,变量都会被聚合。这样做是为了在每一刻,度量值都是迄今为止看到的所有数据的值,而不是上一批计算的值。例如,如果你有var1_op = state_ops.assign_add(var1, x)它意味着在每次迭代var1 = var1_prev + x中。例如,我简化了auc here的计算。我需要做var1 = var1_prev + x + y_prev

4

1 回答 1

0

我解决了这个问题。这个想法的灵感来自streaming_concat于创建一个大小变量2*size(其中size的长度是y),将先前运行的数据保留在第一部分中y,并将新值保留在第二部分中[y_prev, y]。这是代码:

y_var = metric_variable([2 * size], name='y_var')
        copy_op = y_var[size:].assign(y_var[:size])
        with ops.control_dependencies([copy_op]):
            update_ops['y_var'] = state_ops.assign(y_var[:size], y)
于 2019-04-23T18:27:27.667 回答