Метрики Tensorflow с пользовательским оценщиком - PullRequest
0 голосов
/ 01 мая 2018

У меня есть сверточная нейронная сеть, которую я недавно реорганизовал для использования API оценки Tensorflow, в значительной степени следуя этому руководству . Однако во время обучения метрики, добавленные мной в EstimatorSpec, не отображаются в Tensorboard и, по-видимому, не оцениваются в tfdbg, несмотря на то, что область имен и метрики присутствуют в графике, записанном в Tensorboard.

Соответствующие биты для model_fn следующие:

 ...

 predictions = tf.placeholder(tf.float32, [num_classes], name="predictions")

 ...

 with tf.name_scope("metrics"):
    predictions_rounded = tf.round(predictions)
    accuracy = tf.metrics.accuracy(input_y, predictions_rounded, name='accuracy')
    precision = tf.metrics.precision(input_y, predictions_rounded, name='precision')
    recall = tf.metrics.recall(input_y, predictions_rounded, name='recall')

if mode == tf.estimator.ModeKeys.PREDICT:
    spec = tf.estimator.EstimatorSpec(mode=mode,
                                      predictions=predictions)
elif mode == tf.estimator.ModeKeys.TRAIN:

    ...

    # if we're doing softmax vs sigmoid, we have different metrics
    if cross_entropy == CrossEntropyType.SOFTMAX:
        metrics = {
            'accuracy': accuracy,
            'precision': precision,
            'recall': recall
        }
    elif cross_entropy == CrossEntropyType.SIGMOID:
        metrics = {
            'precision': precision,
            'recall': recall
        }
    else:
        raise NotImplementedError("Unrecognized cross entropy function: {}\t Available types are: SOFTMAX, SIGMOID".format(cross_entropy))
    spec = tf.estimator.EstimatorSpec(mode=mode,
                                      loss=loss,
                                      train_op=train_op,
                                      eval_metric_ops=metrics)
else:
    raise NotImplementedError('ModeKey provided is not supported: {}'.format(mode))

return spec

У кого-нибудь есть мысли о том, почему они не пишутся? Я использую Tensorflow 1.7 и Python 3.5. Я попытался добавить их явно через tf.summary.scalar, и хотя они попадают в Tensorboard таким образом, они никогда не обновляются после первого прохода по графику.

1 Ответ

0 голосов
/ 01 мая 2018

Метрический 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), как вы упомянули, что пытались (хотя, похоже, вы добавляли неправильную вещь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...