在每个时期后重置指标的局部变量
Reset local variables of metrics after each epoch
我使用内置方法tf.metrics.precision to evaluate my model. I was looking through its definition,但局部变量从未被重置。
难道不应该在每个纪元之后重置它们以从最后一个纪元中删除计数吗?这是自动完成的,我只是在源代码中忽略了它,还是我应该这样做?如果是后者,我该如何重置局部变量?我没有在文档中阅读任何相关内容。
用于跟踪指标的变量是使用 metric_variable
function and thus added to the collection with key tf.GraphKeys.METRIC_VARIABLES
创建的。定义所有指标后,您可以像这样进行重置操作:
reset_metrics_op = tf.variables_initializer(tf.get_collection(tf.GraphKeys.METRIC_VARIABLES))
并且运行它在每个纪元结束后。
是的。在批量处理数据时,必须注意如何重置变量。在计算整体指标(即精度、准确度或 auc)和批量指标时安排操作是不同的。在计算每批新数据的准确度值之前,需要将 运行 变量重置为零。
使用 tf.metrics.precision
时,会创建两个 运行 变量并将其放入计算图中:true_positives
和 false_positives
。因此,您可以使用 tf.get_collection()
的 scope
参数选择要重置的变量。
import tensorflow as tf
import numpy as np
import numpy as np
import tensorflow as tf
labels = np.array([[1,1,1,0],
[1,1,1,0],
[1,1,1,0],
[1,1,1,0]], dtype=np.uint8)
predictions = np.array([[1,0,0,0],
[1,1,0,0],
[1,1,1,0],
[0,1,1,1]], dtype=np.uint8)
precision, update_op = tf.metrics.precision(labels, predictions, name = 'precision')
print(precision)
#Tensor("precision/value:0", shape=(), dtype=float32)
print(update_op)
#Tensor("precision/update_op:0", shape=(), dtype=float32)
tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES)
#[<tf.Variable 'precision/true_positives/count:0' shape=() dtype=float32_ref>,
# <tf.Variable 'precision/false_positives/count:0' shape=() dtype=float32_ref>,
running_vars_precision = tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES, scope='precision')
running_vars_auc_initializer = tf.variables_initializer(var_list=running_vars_precision )
with tf.Session() as sess:
sess.run(running_vars_auc_initializer)
print("tf precision/update_op: {}".format(sess.run([precision, update_op])))
#tf precision/update_op: [0.8888889, 0.8888889]
print("tf precision: {}".format(sess.run(precision)))
#tf precision: 0.8888888955116272
我使用内置方法tf.metrics.precision to evaluate my model. I was looking through its definition,但局部变量从未被重置。
难道不应该在每个纪元之后重置它们以从最后一个纪元中删除计数吗?这是自动完成的,我只是在源代码中忽略了它,还是我应该这样做?如果是后者,我该如何重置局部变量?我没有在文档中阅读任何相关内容。
用于跟踪指标的变量是使用 metric_variable
function and thus added to the collection with key tf.GraphKeys.METRIC_VARIABLES
创建的。定义所有指标后,您可以像这样进行重置操作:
reset_metrics_op = tf.variables_initializer(tf.get_collection(tf.GraphKeys.METRIC_VARIABLES))
并且运行它在每个纪元结束后。
是的。在批量处理数据时,必须注意如何重置变量。在计算整体指标(即精度、准确度或 auc)和批量指标时安排操作是不同的。在计算每批新数据的准确度值之前,需要将 运行 变量重置为零。
使用 tf.metrics.precision
时,会创建两个 运行 变量并将其放入计算图中:true_positives
和 false_positives
。因此,您可以使用 tf.get_collection()
的 scope
参数选择要重置的变量。
import tensorflow as tf
import numpy as np
import numpy as np
import tensorflow as tf
labels = np.array([[1,1,1,0],
[1,1,1,0],
[1,1,1,0],
[1,1,1,0]], dtype=np.uint8)
predictions = np.array([[1,0,0,0],
[1,1,0,0],
[1,1,1,0],
[0,1,1,1]], dtype=np.uint8)
precision, update_op = tf.metrics.precision(labels, predictions, name = 'precision')
print(precision)
#Tensor("precision/value:0", shape=(), dtype=float32)
print(update_op)
#Tensor("precision/update_op:0", shape=(), dtype=float32)
tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES)
#[<tf.Variable 'precision/true_positives/count:0' shape=() dtype=float32_ref>,
# <tf.Variable 'precision/false_positives/count:0' shape=() dtype=float32_ref>,
running_vars_precision = tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES, scope='precision')
running_vars_auc_initializer = tf.variables_initializer(var_list=running_vars_precision )
with tf.Session() as sess:
sess.run(running_vars_auc_initializer)
print("tf precision/update_op: {}".format(sess.run([precision, update_op])))
#tf precision/update_op: [0.8888889, 0.8888889]
print("tf precision: {}".format(sess.run(precision)))
#tf precision: 0.8888888955116272