Tensorflow streaming_dynamic_auc возвращает значение 0 и нет операции

#python #tensorflow

#python #tensorflow

Вопрос:

Я пытаюсь понять, как агрегировать метрические переменные в Tensorflow, и я наткнулся tf.contrib.metrics.streaming_dynamic_auc . Он объединяет прогнозы и метки, что кажется простым, но меня озадачивает то, что первый запуск после инициализации дает 0, и все последующие запуски работают нормально. Вот код.

 import tensorflow as tf
import random


random.seed(121231)
n_points = 1000
y_true = [random.randint(0, 1) for _ in xrange(n_points)]
y_pred = [random.random() for _ in xrange(n_points)]
pds = tf.placeholder(tf.float32, [n_points])
lbs = tf.placeholder(tf.int32, [n_points])
with tf.Session() as sess:
    auc_dynamic = tf.contrib.metrics.streaming_dynamic_auc(predictions=pds, labels=lbs)
    auc = tf.metrics.auc(predictions=pds, labels=lbs)
    sess.run(tf.global_variables_initializer())
    sess.run(tf.local_variables_initializer())
    auc_dynamic_val, auc_dynamic_op = sess.run(auc_dynamic, {pds:y_pred, lbs:y_true})
    auc_val, auc_op = sess.run(auc, {pds: y_pred, lbs: y_true})
    print("1st run. Dynamic auc val %.7f, op: %s" % (auc_dynamic_val, auc_dynamic_op))
    print("1st run. Auc val %.7f, op: %s" % (auc_val, auc_op))
    auc_dynamic_val, auc_dynamic_op = sess.run(auc_dynamic, {pds: y_pred, lbs: y_true})
    auc_val, auc_op = sess.run(auc, {pds: y_pred, lbs: y_true})
    print("2nd run. Dynamic auc val %.7f, op: %s" % (auc_dynamic_val, auc_dynamic_op))
    print("2nd run. Auc val %.7f, op: %s" % (auc_val, auc_op))
  

Он печатает:

 1st run. Dynamic auc val 0.0000000, op: None
1st run. Auc val 0.0000000, op: 0.5043121
2nd run. Dynamic auc val 0.5043422, op: None
2nd run. Auc val 0.5043121, op: 0.5043121
  

Существует несоответствие между dynamic auc и auc динамическим auc op всегда None , и его значение равно 0 при первом запуске. Однако при втором запуске значения совпадают.

Ответ №1:

Нет, это предполагаемое поведение. Метрики TF выводят кортеж значений и обновляют op, это значение обновления. Таким образом, при первом запуске фактического значения первый вывод метрики будет равен 0. Если вы просто напечатаете оба значения два раза, вы увидите, что при втором запуске оба значения будут ненулевыми.

 with tf.Session() as sess:
        auc_tf = tf.contrib.metrics.streaming_dynamic_auc(predictions=pds, labels=lbs)
        sess.run(tf.global_variables_initializer())
        sess.run(tf.local_variables_initializer())
        auc_tf_val = sess.run(auc_tf, {pds:y_pred, lbs:y_true})
        print(auc_tf_val)
        auc_tf_val = sess.run(auc_tf, {pds: y_pred, lbs: y_true})
        print(auc_tf_val)
  

PS Я не знаю ваше конкретное приложение и версию TF, которую вы используете, но я думаю, что это лучше использовать tf.metrics.auc . Модуль Contrib будет устаревшим в будущих версиях.
https://www.tensorflow.org/api_docs/python/tf/metrics/auc

Редактировать: в отношении конкретного случая, упомянутого в вопросе. значение update_op всегда None равно, потому что оно вычисляется по-разному, в случае <class 'tensorflow.python.framework.ops.Operation'> , если это метрики модуля contrib , в то время как модуль metrics возвращает простой тензор, который может быть оценен внутри сеанса, поэтому имеет значение.

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

1. Я изучаю другую реализацию aucs, но на самом деле не заинтересован в ее использовании. Другой вопрос в том, что его op всегда None . И я не могу добавить его резюме. Если я это сделаю tf.summary.scalar('metrics_auc', auc_value) , я получу только нули и не могу добавить, tf.summary.scalar('metrics_auc', auc_op) потому auc_op что есть None .

2. Это зависит от того, куда вы смотрите. Тензорная панель? Чтобы добавить туда сводки, вам нужно объединить их и написать с tf.summary.FileWriter

3. Если вы запустите мой код и замените _ на auc_op и посмотрите на него, он всегда None . И добавление его в сводку приводит к ошибке. Также я использую довольно большую систему, основанную на CustomEstoimator . У меня есть перехваты для ведения журнала и перехваты для сохранения сводки, оба выводят нули для этого конкретного auc. auc по умолчанию работает просто отлично.

4. Это легко может быть вызвано данными. Попробуйте использовать его изолированно с некоторыми предопределенными константами в качестве логинов / меток

5. Хм, не уверен, что понимаю. Если я использую приведенный выше код для печати auc_op tf.metrics.auc , он имеет значения при каждом вызове. auc_op для streaming_dynamic_auc всегда есть None . Как это связано с данными? Я использую одни и те же данные для обоих.