Правильный способ вычисления AUC в тензорном потоке

Я вычисляю площадь под кривой (AUC) в TensorFlow. Вот часть моего кода:

    with tf.name_scope("output"):
        W = tf.Variable(tf.random_normal([num_filters_total, num_classes], stddev=0.1), name="W")
        b = tf.Variable(tf.constant(0.1, shape=[num_classes]), name="b")
        l2_loss += tf.nn.l2_loss(W)
        l2_loss += tf.nn.l2_loss(b)
        self.scores = tf.nn.xw_plus_b(self.h_drop, W, b, name="scores")
        self.softmax_scores = tf.nn.softmax(self.scores)
        self.predictions = tf.argmax(self.scores, 1, name="predictions")

    # CalculateMean cross-entropy loss
    with tf.name_scope("loss"):
        self.losses = tf.nn.softmax_cross_entropy_with_logits(labels=self.input_y,logits=self.scores)
        self.loss = tf.reduce_mean(self.losses) + l2_reg_lambda * l2_loss 

    # Accuracy
    with tf.name_scope("accuracy"):
        correct_predictions = tf.equal(self.predictions, tf.argmax(self.input_y, 1))
        self.accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")

    # AUC
    with tf.name_scope("auc"):
        self.auc = tf.metrics.auc(labels = tf.argmax(self.input_y, 1), predictions = self.predictions)`

`

В приведенном выше фрагменте кода input_y является тензором формы (batch_size,2), а predictions имеет форму (batch_size,). Следовательно, реальные значения переменных labels и predictions в tf.metrics.auc равны [0,1,1,1,0,0,...]. Интересно, это правильный способ вычисления AUC? Я пробовал с помощью следующей команды:

self.auc = tf.metrics.auc(labels = tf.argmax(self.input_y, 1), predictions = tf.reduce_max(self.softmax_scores,axis=1)) Но это дает мне только нулевые цифры.

Еще одна вещь, которую я заметил, это то, что хотя accuracy в конце процесса обучения остается довольно стабильным, auc, вычисленное первым методом, продолжает увеличиваться. Это правильно? Спасибо.


person lenhhoxung    schedule 02.01.2018    source источник
comment
Это может помочь.   -  person ARAT    schedule 01.01.2019