title: Meaning of values returned by tensorflow accuracy metric
body: <p>I'm a bit confused about the values returned by the functions of the module tf.metrics (for example <a href="https://www.tensorflow.org/api_docs/python/tf/metrics/accuracy" rel="nofollow noreferrer">tf.metrics.accuracy</a>).</p>
  
  <p>A simple piece of code in which I calculate accuracy using tf.metrics.accuracy and using tp, tn, fp and fn.</p>
  
  <pre><code>import tensorflow as tf
  
  # true and predicted tensors
  y_p = tf.placeholder(dtype=tf.int64)
  y_t = tf.placeholder(dtype=tf.int64)
  
  # Count true positives, true negatives, false positives and false negatives.
  tp = tf.count_nonzero(y_p * y_t)
  tn = tf.count_nonzero((y_p - 1) * (y_t - 1))
  fp = tf.count_nonzero(y_p * (y_t - 1))
  fn = tf.count_nonzero((y_p - 1) * y_t)
  
  acc = tf.metrics.accuracy(y_p, y_t)
  
  # Calculate accuracy, precision, recall and F1 score.
  accuracy = (tp + tn) / (tp + fp + fn + tn)
  
  with tf.Session() as sess:
      sess.run(tf.global_variables_initializer())
      sess.run(tf.local_variables_initializer())
  
      for i in range(4):
          if i == 0:
              yop = [0,0,0,0,0,0,0,0,0,0]
          elif i == 1:
              yop = [0,0,0,0,0,0,0,0,1,1]
          elif i == 2:
              yop = [1,1,1,0,0,0,0,0,0,1]
          else:
              yop = [0,1,1,1,1,1,1,0,0,0]
          tf_a = sess.run(acc, feed_dict={y_p: [0,0,0,0,0,0,0,0,0,0], y_t: yop})
          my_a = sess.run(accuracy, feed_dict={y_p: [0,0,0,0,0,0,0,0,0,0], y_t: yop})
          print("TF accuracy: {0}".format(tf_a))
          print("My accuracy: {0}".format(my_a))
  </code></pre>
  
  <p>which outputs</p>
  
  <pre><code>TF accuracy: (0.0, 1.0)
  My accuracy: 1.0
  TF accuracy: (1.0, 0.9)
  My accuracy: 0.8
  TF accuracy: (0.9, 0.8)
  My accuracy: 0.6
  TF accuracy: (0.8, 0.7)
  My accuracy: 0.4
  </code></pre>
  
  <p>I understand that the second returned value of tf.metrics.accuracy (the update_op) is the averaged accuracy over the number of times the function was called. However, I can't make sense of the first value, which should represent the accuracy. Why does it differ from the value of the accuracy I calculate myself? Isn't there a way to obtain the non-cumulative value for the accuracy?</p>
  
  <p>Thanks in advance.</p>