TensorFlow - 始终获得AUC值0

时间:2018-04-17 20:53:15

标签: python tensorflow roc auc

我在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获取完整代码。

感谢。

1 个答案:

答案 0 :(得分:2)

不幸的是,令人困惑的是,tf.contrib.metrics.streaming_auc()采用的参数不同于tf.confusion_matrix()。与tf.confusion_matrix()不同,您应该将类标签传递给此标签。

此处predictions应该是每个班级的概率(y_pred_class来自tf.argmax()的价值......)。

此外,标签应采用one_hot格式,此外还应采用布尔值Tensor。 (您可以简单地将其强制转换为布尔值,0将变为false,1为真。)

查看您的代码,另一个问题是您必须为您运行的每个批次运行AUC update_op,以便AUC可以累积数据。另一方面,一旦您完成一定数量的操作,您需要将AUC的内部变量重置为零,以便进行进一步的计算,例如用于验证的AUC或下一次培训批量不包括以前的数据。要做到这一点,你需要能够在所有变量中剔除这些变量,因此我将它放在一个可变范围内我会调用" AUC"。把这一切放在一起,我已经改变了代码的一些部分(将附加完整运行的,经过测试的代码以供底部参考):

如果定义了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)

此外,将会话初始化放在最后,就像"最佳实践",这不是绝对必要的:

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 )

这样,输出为:

  

培训时代1 --- Tr Acc:51.6%,Tr AUC:51.0%,Val Acc:46.1%,Val AUC:46.1%,Val Loss:4.893
  培训时代2 --- Tr Acc:53.9%,Tr AUC:53.0%,Val Acc:53.5%,Val AUC:55.3%,Val Loss:0.691
  训练大纪元3 --- Tr Acc:65.6%,Tr AUC:63.9%,Val Acc:65.2%,Val AUC:69.0%,Val Loss:0.647
  训练大纪元4 --- Tr Acc:71.1%,Tr AUC:71.6%,Val Acc:68.0%,Val AUC:74.8%,Val Loss:0.586
  培训时代6 --- Tr Acc:73.0%,Tr AUC:76.8%,Val Acc:69.5%,Val AUC:75.9%,Val损失:0.588
  训练大纪元7 --- Tr Acc:77.3%,Tr AUC:82.4%,Val Acc:73.8%,Val AUC:77.7%,Val Loss:0.563
  训练大纪元8 --- Tr Acc:81.2%,Tr AUC:87.0%,Val Acc:78.9%,Val AUC:85.2%,Val Loss:0.475
  训练大纪元9 --- Tr Acc:83.6%,Tr AUC:90.9%,Val Acc:75.0%,Val AUC:83.5%,Val Loss:0.517
  训练纪元11 --- Tr Acc:91.8%,Tr AUC:94.3%,Val Acc:73.0%,Val AUC:81.4%,Val Loss:0.646
  (请参阅下面附带的train.htmltrain.ipynb中的详细信息)

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

Runnable经过测试的主要代码(请注意,您需要将代码中的数据路径调整为特定设置,批量大小调整为硬件容量),格式如下: train.ipynb train.html train.py

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