2016-08-09 2 views
2

Мне интересно, в каком порядке подавать данные очереди TensorFlow (в частности, когда у вас есть список тензоров, из которых они питаются).Порядок подачи очереди TensorFlow

Например, в очереди, как это:

fifo_q = tf.FIFOQueue(
       capacity=10, 
       dtypes=[tf.string, tf.string] 
       shapes=[[], []]) 

Если я епдиеие эти списки:

sess = tf.Session() 

l = [str(i+1) for i in range(10)] 
x = tf.constant(l) 
y = tf.constant(l) 

eq = fifo_q.enqueue_many([x, y]) 
dq1, dq2 = fifo_q.dequeue() 
sess.run(eq) 

Я ожидал бы dq1, dq2 быть '1', '1' на первый запуск, затем «2», «2» и т. д. Но это не то, что происходит. Вместо этого, когда я запускаю следующий код, я получаю «1», «2», а затем «3», «4» и так далее, пока dq2 не достигнет 10, а затем очередь закроется.

for x in range(6): 
    print('dq1:', sess.run(dq1)) 
    print('dq2:', sess.run(dq2)) 

Почему это происходит вместо того, что я ожидаю? Я использую это, чтобы сопоставить примеры обучения с ярлыками, но некоторые примеры обучения и ярлыки пропущены/отключены. Является лучшим решением только для чередования имен файлов в одной очереди? В любом случае, я хотел бы понять это поведение.

Любая помощь приветствуется.

ответ

2

Очереди TensorFlow позволяют выставлять и выгружать списки (точнее фиксированные длины) тензоров атомарно, за одну операцию. Тензоры dq1 и dq2 являются выходами той же операции декомпрессии, которая в этом случае удалит кортеж из двух тензоров из очереди. Каждый вызов sess.run(dq1) или sess.run(dq2) соответствует отдельному вызову операции dequeue, , но при вызове sess.run(dq1) TensorFlow отбрасывает другой элемент кортежа, потому что вы не запросили его явно при вызове sess.run().

Решение состоит в том, чтобы гарантировать, что оба выходов dequeue() операций потребляются в вызове же к sess.run(). Например, следующее изменение вашей программы должно привести к результату, который вы изначально ожидали:

for x in range(6): 
    dq1_val, dq2_val = sess.run([dq1, dq2]) 
    print('dq1:', dq1_val) 
    print('dq2:', dq2_val) 
+0

Спасибо за четкое объяснение! – mgray

Смежные вопросы