#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
, а получаю их из своих собственных областей. Спасибо за ваше время, Ярослав.