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
我在 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 attachedtrain.html
ortrain.ipynb
below)
数据: Data is on Kaggle, from the Dogs vs. Cats competition (train.zip)
可运行测试的主要代码(请注意,您需要根据您的特定设置调整代码中的数据路径,并根据您的硬件容量调整批处理大小)三种格式: train.ipynb train.html train.py
需要(导入的)文件,将其放在与train
相同的文件夹中:
dataset.py