тензорный поток больше показателей с пользовательской оценкой

#tensorflow #metrics #tensorboard #tensorflow-estimator

#tensorflow #показатели #тензорная доска #tensorflow-оценщик

Вопрос:

Я создал пользовательский оценщик, который использовался binary_classification_head() под капотом. Все работает хорошо, но проблема заключается в видимых показателях. Я использую ведение журнала с помощью level tf.logging.set_verbosity(tf.logging.INFO) и tensorboard, но я вижу только значение потерь. Я добавил этот код, но это ничего не помогает.

 def my_accuracy(labels, predictions):
    return {'accuracy': tf.metrics.accuracy(labels, predictions['logistic'])}
classifier = tf.contrib.estimator.add_metrics(classifier, my_accuracy)
  

Вы знаете какой-нибудь другой способ добавления показателей?

Ответ №1:

Вам нужно разместить соответствующую функцию показателей внутри вашего model_fn .

Например:

 tf.summary.image('input_image', input_image, max_outputs)

for v in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):
        tf.summary.histogram(v.name, v)
  

Метрики, которые включают в себя update_op , такие как точность оценки f1, должны быть переданы в eval_metric_ops . Срез используется, потому что они выводят два значения, значение метрики и операцию обновления

 f1 = tf.contrib.metrics.f1_score(labels, predictions, num_thresholds)
accuracy = tf.metrics.accuracy(labels, predictions)
tf.summary.scalar('accuracy', accuracy[1])

eval_metric_ops = {
    'f1_score': f1,
    'accuracy': accuracy
}

return tf.estimator.EstimatorSpec(mode=mode,
                                  loss=loss,
                                  train_op=train_op,
                                  eval_metric_ops=eval_metric_ops,
                                  )
  

eval_metric_ops dict может подаваться как в режиме обучения, так и в режиме оценки.

В случае, если вы используете стандартный оценщик, вы можете просто использовать add_metrics

Редактировать: Согласно официальной документации, вы можете использовать binary_classification_head с готовым оценщиком или внутри функции model_fn, которая возвращает estimator_spec. Смотрите

 my_head = tf.contrib.estimator.binary_classification_head()
my_estimator = tf.estimator.DNNEstimator(
    head=my_head,
    hidden_units=...,
    feature_columns=...)
  

В этом случае вы должны иметь возможность добавлять показатели даже без функции add_metrics

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

1. Спасибо за ответ. Проблема в том, что я использую binary_classification_head() вместо tf.estimator. Оценочные спецификации, у которых нет параметра eval_metric_ops. Было бы жаль, если бы пришлось отказаться от него только из-за метрик.