Метрика точности журнала при обучении tf.estimator

Какой самый простой способ распечатать метрики точности вместе с потерями при обучении предварительно подготовленного оценщика?

Большинство учебных пособий и документации, по-видимому, решают проблему создания пользовательского оценщика, что кажется излишним, если вы намерены использовать один из доступных.

В tf.contrib.learn было несколько (теперь устаревших) хуков Monitor. Теперь TF предлагает использовать API-интерфейс ловушек, но, похоже, на самом деле он не содержит ничего, что могло бы использовать метки и прогнозы для генерации числа точности.


person viksit    schedule 18.04.2018    source источник


Ответы (2)


Вы пробовали tf.contrib.estimator.add_metrics(estimator, metric_fn) (doc)? Он берет инициализированный оценщик (может быть предварительно консервирован) и добавляет к нему метрики, определенные metric_fn.

Пример использования:

def custom_metric(labels, predictions):
    # This function will be called by the Estimator, passing its predictions.
    # Let's suppose you want to add the "mean" metric...

    # Accessing the class predictions (careful, the key name may change from one canned Estimator to another)
    predicted_classes = predictions["class_ids"]  

    # Defining the metric (value and update tensors):
    custom_metric = tf.metrics.mean(labels, predicted_classes, name="custom_metric")

    # Returning as a dict:
    return {"custom_metric": custom_metric}

# Initializing your canned Estimator:
classifier = tf.estimator.DNNClassifier(feature_columns=columns_feat, hidden_units=[10, 10], n_classes=NUM_CLASSES)

# Adding your custom metrics:
classifier = tf.contrib.estimator.add_metrics(classifier, custom_metric)

# Training/Evaluating:
tf.logging.set_verbosity(tf.logging.INFO) # Just to have some logs to display for demonstration

train_spec = tf.estimator.TrainSpec(input_fn=lambda:your_train_dataset_function(),
                                    max_steps=TRAIN_STEPS)
eval_spec=tf.estimator.EvalSpec(input_fn=lambda:your_test_dataset_function(),
                                steps=EVAL_STEPS,
                                start_delay_secs=EVAL_DELAY,
                                throttle_secs=EVAL_INTERVAL)
tf.estimator.train_and_evaluate(classifier, train_spec, eval_spec)

Журналы:

...
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [20/200]
INFO:tensorflow:Evaluation [40/200]
...
INFO:tensorflow:Evaluation [200/200]
INFO:tensorflow:Finished evaluation at 2018-04-19-09:23:03
INFO:tensorflow:Saving dict for global step 1: accuracy = 0.5668, average_loss = 0.951766, custom_metric = 1.2442, global_step = 1, loss = 95.1766
...

Как видите, вместе с метриками и потерями по умолчанию возвращается custom_metric.

person benjaminplanche    schedule 18.04.2018
comment
Я думаю, что ОП хочет, чтобы решение работало для готовых оценок, для которых вы не должны напрямую менять model_fn. Следовательно, это может быть не желаемый ответ. - person Y. Luo; 18.04.2018
comment
Пожалуйста, поправьте меня, если я ошибаюсь, но я считаю, что хотя пример на Github демонстрирует пользовательский классификатор, использование хуков, как показано в извлеченных строках, будет работать с любыми готовыми оценщиками, поскольку все они реализуют train(...), evaluate(...), predict(...) с параметром hooks. - person benjaminplanche; 18.04.2018
comment
Быстрая мысль: logging_hook нуждается в точности, вычисляемой в model_fn, и ему нужно имя точности. Ваша извлеченная строка 185 находится внутри model_fn, что не будет контролироваться для готовых оценок. Теперь я не уверен, есть ли аналоги в готовых оценках, которые можно использовать. - person Y. Luo; 18.04.2018
comment
Хм, наверное, ты прав. Из сообщения OP я предположил, что он каким-то образом получил доступ к тензору прогнозирования. Я обновил свой пост, надеюсь, более четкий ответ с использованием tf.contrib.estimator.add_metrics. - person benjaminplanche; 19.04.2018
comment
Отличный ответ! Кажется, это правильное решение. Действительно узнал новую вещь, tf.contrib.estimator.add_metrics. Благодарю вас! - person Y. Luo; 19.04.2018
comment
Спасибо, это супер полезный ответ. Мне любопытно - вы использовали этот подход и для пользовательской оценки? Почему бы не порекомендовать это по сравнению с тем, что сегодня следует большинству руководств? - person viksit; 06.08.2018
comment
Нет, на самом деле я сам никогда не использую предварительно подготовленные оценки - я действительно обнаружил этот подход, пытаясь исправить свой первоначальный ответ. Почему это не так распространено - хороший вопрос... - person benjaminplanche; 07.08.2018

В дополнение к ответу @Aldream вы также можете использовать TensorBoard, чтобы увидеть некоторую графику custom_metric. Для этого добавьте его в сводку TensorFlow следующим образом:

tf.summary.scalar('custom_metric', custom_metric)

Крутая вещь при использовании tf.estimator.Estimator заключается в том, что вам не нужно добавлять сводки в FileWriter, так как это делается автоматически (объединение и сохранение их каждые 100 шагов по умолчанию).

Чтобы увидеть TensorBoard, вам нужно открыть новый терминал и ввести:

tensorboard --logdir={$MODEL_DIR}

После этого вы сможете увидеть графику в своем браузере по адресу localhost:6006.

person tsveti_iko    schedule 30.07.2018