Tensorflow — Получить количество выборок в очереди?

#python #tensorflow

#python #tensorflow

Вопрос:

Для мониторинга производительности я хотел бы следить за примером, находящимся в очереди в данный момент. Я балансирую количество потоков, которые я использую для заполнения очереди, и оптимальный максимальный размер очереди. Как мне получить эту информацию? Я использую tf.train.batch() , но я предполагаю, что информация может быть где-то внизу в FIFOQueue ? Я ожидал, что это будет локальная переменная, но я ее не нашел.

Ответ №1:

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))
  

Поскольку queue он локальный, вы не можете получить доступ к его size() методу. Однако, поскольку size() была вызвана для построения сводки, соответствующая size операция находится на графике, и вы можете вызвать ее по имени. Вы можете найти имя узла, выполнив что-то вроде этого

 x = tf.constant(1)
q = tf.train.batch([x], 2)
tf.get_default_graph().as_graph_def()
  

Вы увидите

 node {
  name: "batch/fifo_queue_Size"
  op: "QueueSize"
  input: "batch/fifo_queue"
  attr {
    key: "_class"
    value {
      list {
  

Из этого вы можете сказать, что это batch/fifo_queue_Size название операции и, следовательно, batch/fifo_queue_Size:0 это имя первого вывода, так что вы можете получить размер, выполнив что-то вроде этого:

 sess.run("batch/fifo_queue_Size:0")
  

Если у вас несколько batch операций, имена будут автоматически дедуплицированы в batch_1/fifo_queue_Size , batch_2/fifo_queue_Size и т. Д

В качестве альтернативы вы можете вызвать свой узел с помощью tf.batch(...name="mybatch") , и тогда имя тензора будет mybatch/fifo_queue_Size:0

Комментарии:

1. Отличная статья. Также полностью пропустил скалярную сводку внутри пакета — это потому, что я не делаю merge_all_summaries , а получаю их из своих собственных областей. Спасибо за ваше время, Ярослав.