Tensorflow вычисляет update_op для метрики, используя значения из предыдущей итерации

#python #tensorflow

#python #tensorflow

Вопрос:

Я работаю над пользовательской метрикой, и моя 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 здесь. Мне нужно сделать var1 = var1_prev x y_prev .

Комментарии:

1. Не понятно, о чем вы спрашиваете… Пожалуйста, будьте более конкретными.

2. Извините. Я расширил свой вопрос.

Ответ №1:

Я решил проблему. Идея вдохновлена 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)