私は、インデックス「スロット」のキューからエンキューまたはデキューしたいn_slots(定数)キューとTensorFlowグラフを持っています。スロットは動的インデックスで、int32テンソルの形状[]を持ちます。TensorFlowの動的インデックスに基づくキューの選択
私は、醜い/非効率的なwhileループやネストされたcondに頼らないと、これを行う方法は考えられません。 (print(sess.run(out)
)後で実行されたときにすぐ
n_slots = 4
queues = [None] * n_slots
for i in range(n_slots):
queues[i] = tf.FIFOQueue(5, [tf.float32], shapes=[[]])
queue = queues[2]
assert isinstance(queue, tf.FIFOQueue)
enqueue_op = queue.enqueue([5])
with tf.control_dependencies([enqueue_op]):
dq_ops = [None] * n_slots
for i in range(n_slots):
dq_ops[i] = queues[i].dequeue()
dq_ops = tf.convert_to_tensor(dq_ops)
slot = tf.convert_to_tensor(2)
out = dq_ops[slot]
たとえば
(n_slots例えば10000である場合、動作は依然としてO(1)であるべきである想像)、次のテンソルグラフであるものとしますdq_opsは索引操作の前に完全に評価する必要があるため、操作がハングします。そのため、索引を取る前にすべての副作用が実行されます。
これを(意図しない副作用なしに)正しくデキューし、効率的に(ループやネストされたコンディションを使用しないで)どうすればよいでしょうか?
おかげで、私はそこにどここれを行うには、より一般的な方法を仮定しました。怠惰な部分テンソルや評価しないもののように、スライスの依存関係が必要になるまでです。だから私はもっと慎重にQueueBaseのドキュメントを読むことについて考えなかった。しかし、これは間違いなく私の問題を解決します。 –
より一般的な方法は、いくつかの制御フロー操作(例えば 'tf.cond()'や 'tf.case()')を使用してデキュー操作をラップすることです。しかし、私は 'QueueBase.from_list()'が制御フローのサポートが存在する前に追加されたと思います。 – mrry