Метрический API имеет изюминку, давайте возьмем tf.metrics.accuracy
в качестве примера (все tf.metrics.*
работают одинаково). Это возвращает 2 значения, accuracy
метрика и upate_op
, это похоже на вашу первую ошибку. У вас должно быть что-то вроде этого:
accuracy, update_op = tf.metrics.accuracy(input_y, predictions_rounded, name='accuracy')
accuracy
- это просто значение, ожидаемое для его вычисления, однако обратите внимание, что вам может потребоваться вычислить точность при нескольких вызовах до sess.run
, например, когда вы вычисляете точность большого набора тестов, который не не все вписывается в память. Вот где приходит update_op
, он накапливает результаты, поэтому, когда вы запрашиваете accuracy
, он дает вам счет.
update_op
не имеет зависимостей, поэтому вам нужно либо явно запустить его в sess.run
, либо добавить зависимость. Например, вы можете установить ее в зависимости от функции стоимости, чтобы при вычислении функции стоимости вычислялось update_op
(что приводит к обновлению счетчика для точности):
with tf.control_dependencies(cost):
tf.group(update_op, other_update_ops, ...)
Вы можете сбросить значение метрики с помощью инициализатора локальной переменной:
sess.run(tf.local_variables_initializer())
Вам нужно будет добавить точность в тензорную доску с помощью tf.summary.scalar(accuracy)
, как вы упомянули, что пытались (хотя, похоже, вы добавляли неправильную вещь).