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