import tensorflow as tf
import numpy as np
N_TRUE_P = 0
N_PRED_P = 0
def reset_running_variables():
""" Resets the previous values of running variables to zero """
global N_TRUE_P, N_PRED_P
N_TRUE_P = 0
N_PRED_P = 0
def update_running_variables(labs, preds):
global N_TRUE_P, N_PRED_P
N_TRUE_P += ((labs * preds) > 0).sum()
N_PRED_P += (preds > 0).sum()
def calculate_precision():
global N_TRUE_P, N_PRED_P
return float (N_TRUE_P) / N_PRED_P
if __name__ == '__main__':
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)
n_batches = len(labels)
# #numpy
# reset_running_variables()
#
# for i in range(n_batches):
# update_running_variables(labs=labels[i], preds=predictions[i])
#
# precision = calculate_precision()
# print("[NP] SCORE: %1.4f" % precision)
#tensorflow
graph = tf.Graph()
with graph.as_default():
# Placeholders to take in batches onf data
tf_label = tf.placeholder(dtype=tf.int32, shape=[None])
tf_prediction = tf.placeholder(dtype=tf.int32, shape=[None])
# Define the metric and update operations
tf_metric, tf_metric_update = tf.metrics.precision(tf_label,
tf_prediction,
name="my_metric")
# Isolate the variables stored behind the scenes by the metric operation
running_vars = tf.get_collection(tf.GraphKeys.LOCAL_VARIABLES, scope="my_metric")
# Define initializer to initialize/reset running variables
running_vars_initializer = tf.variables_initializer(var_list=running_vars)
with tf.Session(graph=graph) as session:
session.run(tf.global_variables_initializer())
# initialize/reset the running variables
session.run(running_vars_initializer)
for i in range(n_batches):
# Update the running variables on new batch of samples
feed_dict = {tf_label: labels[i], tf_prediction: predictions[i]}
session.run(tf_metric_update, feed_dict=feed_dict)
# Calculate the score
score = session.run(tf_metric)
print("[TF] SCORE: %1.4f" % score)
参考:https://zhuanlan.zhihu.com/p/43359894