我第一次尝试使用 contrib 中的指标,但没有成功使其工作。
以下是我尝试使用的指标以及它们的实现方式:
y_pred_labels = y[:, 1]y_true_labels = tf.cast(y_[:, 1], tf.int32)with tf.name_scope('auc'): auc_score, update_op_auc = tf.contrib.metrics.streaming_auc( predictions=y_pred_labels, labels=y_true_labels ) tf.summary.scalar('auc', auc_score)with tf.name_scope('accuracy_contrib'): accuracy_contrib, update_op_acc = tf.contrib.metrics.streaming_accuracy( predictions=y_pred_labels, labels=y_true_labels ) tf.summary.scalar('accuracy_contrib', accuracy_contrib)with tf.name_scope('error_contrib'): error_contrib, update_op_error = tf.contrib.metrics.streaming_mean_absolute_error( predictions=y_pred_labels, labels=y_[:, 1] ## Needs to use float32 and not int32 ) tf.summary.scalar('error_contrib', error_contrib)
这段代码执行得很完美,在执行过程中我得到了以下结果:
########################################Accuracy at step 1000: 0.633333 # 这是由另一个未显示的代码计算得到的Accuracy Contrib at step 1000: (0.0, 0.0)AUC Score at step 1000: (0.0, 0.0)Error Contrib at step 1000: (0.0, 0.0)########################################
这是输入数据的格式:
y_pred_labels = [0.1, 0.5, 0.6, 0.8, 0.9, 0.1, ...] # 表示二元概率y_true_labels = [1, 0, 1, 1, 1, 0, 0, ...] # 表示真实类别 {0或1}y_[:, 1] = [1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0, ...] # 与 y_true_labels 相同,但格式化为 float32
我认为我已经在官方文档中了解到,在某些条件下这是正常行为…然而,我无法获取我的指标值。
其次,我注意到有两个指标被称为:streaming_accuracy 和 streaming_auc,它们与“非流式”准确率或 AUC 指标的行为有何不同?如果有必要,是否有办法使其成为“非流式”的?
回答:
我刚刚遇到了同样的问题。并发现:
您需要在运行指标操作(如 sess.run(auc_score)
)的同时运行 update_op
(如 sess.run(update_op_auc)
)。