gpt4 book ai didi

python - TensorFlow - AUC 值始终为 0

转载 作者:行者123 更新时间:2023-12-01 01:59:00 24 4
gpt4 key购买 nike

我在查找 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()采用与 tf.confusion_matrix() 不同的参数例如。您不应该将类标签传递给此标签,这与 tf.confusion_matrix() 不同。 .

这里的预测应该是每个类别的概率(您从tf.argmax() ...获得y_pred_class的值)。

标签还应该采用 one_hot 格式,而且采用 bool 张量。 (您可以简单地将其转换为 bool 值,0 将变为 false,1 将变为 true。)

查看您的代码,另一个问题是您必须为运行的每个批处理运行 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 = ... 行中的一些格式更改,这些更改并非绝对必要,仅反射(reflect)我的口味):

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 初始化放在最后,就像“最佳实践”一样,这并不是绝对必要的:

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

关于python - TensorFlow - AUC 值始终为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49887325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com