我在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获取完整代码。
感谢。
答案 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.html
或train.ipynb
中的详细信息)
数据: Data is on Kaggle, from the Dogs vs. Cats competition (train.zip)
Runnable经过测试的主要代码(请注意,您需要将代码中的数据路径调整为特定设置,批量大小调整为硬件容量),格式如下: train.ipynb train.html train.py
必填(导入)文件,将其放在与train
相同的文件夹中:
dataset.py