Tensorflow - 获取队列中的样本数量?

Tim*_*man 2 python tensorflow

对于性能监控,我想关注当前排队的示例.我正在平衡我用于填充队列的线程数量以及队列的最佳最大大小.我如何获得这些信息?我正在使用tf.train.batch(),但我想这些信息可能会在某个地方出现FIFOQueue?我原以为这是一个局部变量,但我还没有找到它.

Yar*_*tov 5

tldr:如果你的队列是由tf.batch你创建的,你可以得到大小sess.run("batch/fifo_queue_Size:0")

FIFOQueue对象提供了size()其产生一个运算,让上队列中的元素的数目的方法.但是,如果您正在使用tf.batch,则会在方法内部创建FIFOQueue,并且此对象不会在外部公开.

特别是你在input.py中看到了这一点

queue = _which_queue(dynamic_pad)(
    capacity=capacity, dtypes=types, shapes=shapes, shared_name=shared_name)
print("Enqueueing: ", enqueue_many, tensor_list, shapes)
_enqueue(queue, tensor_list, num_threads, enqueue_many)
summary.scalar("queue/%s/fraction_of_%d_full" % (queue.name, capacity),
               math_ops.cast(queue.size(), dtypes.float32) *
               (1. / capacity))
Run Code Online (Sandbox Code Playgroud)

既然queue是本地的,你就无法掌握它的size()方法.但是,由于size()已经调用以构造摘要,因此适当的sizeop在图中,您可以按名称调用它.你可以通过这样的方式找到节点的名称

x = tf.constant(1)
q = tf.train.batch([x], 2)
tf.get_default_graph().as_graph_def()
Run Code Online (Sandbox Code Playgroud)

你会看见

node {
  name: "batch/fifo_queue_Size"
  op: "QueueSize"
  input: "batch/fifo_queue"
  attr {
    key: "_class"
    value {
      list {
Run Code Online (Sandbox Code Playgroud)

从这里您可以看出这batch/fifo_queue_Size是op的名称,因此batch/fifo_queue_Size:0是第一个输出的名称,因此您可以通过执行以下操作来获取大小:

sess.run("batch/fifo_queue_Size:0")
Run Code Online (Sandbox Code Playgroud)

如果你有多个batchOPS,名称会自动去重成batch_1/fifo_queue_Size,batch_2/fifo_queue_Size

或者,你可以调用你的节点,tf.batch(...name="mybatch")然后张量的名称将是mybatch/fifo_queue_Size:0