docs: def count_elements_in_dataset(ds, batch_size=1*1024, parallel_batch=8):
      """Count and return all the elements in the given dataset.
  
      Debugging function.  The elements in a dataset cannot be counted
      without enumerating all of them.  By counting in batch and in
      parallel, this method allows rapid traversal of the dataset.
  
      Args:
        ds:  The dataset whose elements should be counted.
        batch_size:  the number of elements to count a a time.
        parallel_batch:  how many batches to count in parallel.
  
      Returns:
        The number of elements in the dataset.
      """
      with tf.Session() as sess:
          dsc = ds.apply(tf.contrib.data.enumerate_dataset())
          dsc = dsc.apply(
              tf.contrib.data.map_and_batch(lambda c, v: c, batch_size,
                                            num_parallel_batches=parallel_batch))
          iterator = dsc.make_initializable_iterator()
          sess.run(iterator.initializer)
          get_next = iterator.get_next()
          counted = 0
          try:
              while True:
                  # The numbers in the tensors are 0-based indicies,
                  # so add 1 to get the number counted.
                  counted = sess.run(tf.reduce_max(get_next)) + 1
                  utils.dbg('Counted so far: %d' % counted)
          except tf.errors.OutOfRangeError:
              pass
          utils.dbg('Counted total: %d' % counted)
          return counted