Создание пользовательских метрик в оценках тензорного потока - PullRequest
0 голосов
/ 12 апреля 2019

Я занимаюсь классификационной задачей, используя оценки тензорного потока.

Я хочу вычислить оценку f1 для каждой партии данных, а также точность и отзыв.

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

Я также вычисляю fscore, используя формулу, но во время регистрации fscore я получаю ошибку.

pre = tf.metrics.precision(labels=labels,predictions=pred,name="precision")

rec = tf.metrics.recall(labels=labels,predictions=pred,name="recall")

fscore_val = tf.reduce_mean((2*pre[0]*rec[0]) / (pre[0] + rec[0] + 1e-5))
fscore_update = tf.group(pre[1], rec[1])

fscore = (fscore_val, fscore_update)

# logging metric at evaluation time
metrics['precision'] = pre                    
metrics['recall'] = rec
metrics['fscore'] = fscore 

# logging metric at training time                   
tf.summary.scalar('precision', pre[1])
tf.summary.scalar('recall', rec[1])
tf.summary.scalar('fscore', fscore)


Это ошибка, которую яполучить.

TypeError: Expected float32, got <tf.Operation 'metrics_Left_Lane_Type/group_deps' type=NoOp> of type 'Operation' instead.

Я понимаю, почему я получаю эту ошибку.Это потому, что fscore должно быть двумя значениями, похожими на точность и отзыв.

Может кто-нибудь помочь мне, как это сделать в оценках тензорного потока?

1 Ответ

1 голос
/ 12 апреля 2019

Прежде всего, TensorFlow имеет свой собственный показатель f1 tf.contrib.metrics.f1_score, и его довольно просто использовать.Единственный возможный недостаток - то, что он скрывает пороговое значение от пользователя, выбирая лучшее из указанного количества возможных порогов.

predictions = tf.sigmoid(logits)
tf.contrib.metrics.f1_score(labels, predictions, num_thresholds=20)

Если по какой-либо причине вам нужна пользовательская реализация, вам нужно сгруппировать update_ops.Каждая метрика TensorFlow имеет операцию, которая увеличивает ее значение.Вы можете установить порог вручную при определении прогнозов

predictions = tf.greater(tf.sigmoid(logits), 0.5)
def f1_score(labels, predictions):
    precision, update_op_precision = tf.metrics.precision(labels, predictions)
    recall, update_op_recall = tf.metrics.recall(labels, predictions)
    eps = 1e-5 #small constant for numerical stability
    f1 = 2 * precision * recall / (precision + recall + eps)
    f1_upd = 2 * update_op_precision * update_op_recall / (update_op_precision + update_op_recall + eps)
    return f1, f1_upd

f1_score = f1_score(labels, predictions)

Затем вы можете добавить его к eval_metric_ops dict или перейти к summary.scalar

eval_metric_ops = {'f1': f1_score}
tf.summary.scalar('f1', f1_score[1])

Это на самом деле дает очень близкорезультаты с метрикой из модуля contrib

...