TensorFlow - 始终获得 0 的 AUC 值

TensorFlow - always getting an AUC value of 0

我在 TensorFlow 中查找 AUC 值时遇到问题。我执行了以下操作来找到 AUC:

auc,update_op = tf.contrib.metrics.streaming_auc(predictions=y_pred_class,labels=y_true_class,curve='ROC')

然后,我做了以下操作:

session.run(tf.initialize_all_variables())
    session.run(tf.initialize_local_variables())
    auc_value, _ = session.run([auc,update_op], feed_dict=feed_dict_validate)

代码运行,但总是得到值0。我可能做错了什么?

通过预测的类和tf.contrib.metrics.streaming_auc中的正确标签是否正确?

编辑

您可以从 here 获得完整代码。

谢谢。

不幸的是,令人困惑的是,tf.contrib.metrics.streaming_auc() takes different parameters than tf.confusion_matrix() for example. You should not pass the class labels to this one, unlike for tf.confusion_matrix()

这里 predictions 应该是每个 class 的概率(你从 tf.argmax()... 中得到 y_pred_class 的值)。

标签也应该是 one_hot 格式,而且是布尔张量。 (你可以简单地将它转换为布尔值,0 将变为假,1 变为真。)

查看您的代码,另一个问题是您必须 运行 每个批次的 AUC update_op 运行 以便 AUC 可以累积数据。另一方面,一旦你完成了一定数量,你需要重置 AUC 的内部变量为零,以便进一步计算,如用于验证的 AUC,或下一个训练批次不包括以前的数据。为此,您需要能够从所有变量中找出这些变量,因此我将其放在一个变量范围内,我称之为 "AUC"。综上所述,我更改了代码的几个部分(将在底部附上完整的 运行ning 测试代码以供参考):

定义 auc 的地方(注意,我已经从 contrib 中已弃用的版本切换到当前版本 tf.metrics.auc()):

with tf.variable_scope( "AUC" ):
    auc, auc_update_op = tf.metrics.auc( predictions=y_pred, labels=y_true, curve = 'ROC' )
auc_variables = [ v for v in tf.local_variables() if v.name.startswith( "AUC" ) ]
auc_reset_op = tf.initialize_variables( auc_variables )

show_progress() 函数(注意 msg = ... 行中的一些格式更改,这些不是绝对必要的,但仅反映我的品味):

def show_progress(epoch, feed_dict_train, feed_dict_validate, val_loss):
    acc, auc_value = session.run([ accuracy, auc_update_op ], feed_dict=feed_dict_train)
    session.run( auc_reset_op )
    val_acc, val_auc_value = session.run([ accuracy, auc_update_op ], feed_dict=feed_dict_validate)
    session.run( auc_reset_op )
    msg = 'Training Epoch {} --- Tr Acc: {:>6.1%}, Tr AUC: {:>6.1%}, Val Acc: {:>6.1%}, Val AUC: {:>6.1%}, Val Loss: {:.3f}'
    print(msg.format(epoch + 1, acc, auc_value, val_acc, val_auc_value, val_loss))

最后,在 train() 函数中,注意插入的 auc_update_op:

session.run( [ optimizer, auc_update_op ], feed_dict=feed_dict_tr)

另外,把session初始化放在最后,就像"best practice"一样,这不是绝对必要的:

with tf.Session() as session:
    #session.run(tf.initialize_all_variables())
    # need to init local variables for internal auc calculations
    init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
    session.run( init ) 
    train( num_iteration=10000 )

有了这个,输出是:

Training Epoch 1 --- Tr Acc: 51.6%, Tr AUC: 51.0%, Val Acc: 46.1%, Val AUC: 46.1%, Val Loss: 4.893
Training Epoch 2 --- Tr Acc: 53.9%, Tr AUC: 53.0%, Val Acc: 53.5%, Val AUC: 55.3%, Val Loss: 0.691
Training Epoch 3 --- Tr Acc: 65.6%, Tr AUC: 63.9%, Val Acc: 65.2%, Val AUC: 69.0%, Val Loss: 0.647
Training Epoch 4 --- Tr Acc: 71.1%, Tr AUC: 71.6%, Val Acc: 68.0%, Val AUC: 74.8%, Val Loss: 0.586
Training Epoch 6 --- Tr Acc: 73.0%, Tr AUC: 76.8%, Val Acc: 69.5%, Val AUC: 75.9%, Val Loss: 0.588
Training Epoch 7 --- Tr Acc: 77.3%, Tr AUC: 82.4%, Val Acc: 73.8%, Val AUC: 77.7%, Val Loss: 0.563
Training Epoch 8 --- Tr Acc: 81.2%, Tr AUC: 87.0%, Val Acc: 78.9%, Val AUC: 85.2%, Val Loss: 0.475
Training Epoch 9 --- Tr Acc: 83.6%, Tr AUC: 90.9%, Val Acc: 75.0%, Val AUC: 83.5%, Val Loss: 0.517
Training Epoch 11 --- Tr Acc: 91.8%, Tr AUC: 94.3%, Val Acc: 73.0%, Val AUC: 81.4%, Val Loss: 0.646
(see more in attached train.html or train.ipynb below)


数据: Data is on Kaggle, from the Dogs vs. Cats competition (train.zip)

可运行测试的主要代码(请注意,您需要根据您的特定设置调整代码中的数据路径,并根据您的硬件容量调整批处理大小)三种格式: train.ipynb train.html train.py

需要(导入的)文件,将其放在与train相同的文件夹中: dataset.py