#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)