2017-10-07 10 views
1

私は、インデックス「スロット」のキューからエンキューまたはデキューしたい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は索引操作の前に完全に評価する必要があるため、操作がハングします。そのため、索引を取る前にすべての副作用が実行されます。

これを(意図しない副作用なしに)正しくデキューし、効率的に(ループやネストされたコンディションを使用しないで)どうすればよいでしょうか?

答えて

1

tf.QueueBase.from_list()メソッドがこのケースを処理します。 queuesリストにインデックスslotでキューからデキューするには:

element = tf.QueueBase.from_list(slot, queues) 
+0

おかげで、私はそこにどここれを行うには、より一般的な方法を仮定しました。怠惰な部分テンソルや評価しないもののように、スライスの依存関係が必要になるまでです。だから私はもっと慎重にQueueBaseのドキュメントを読むことについて考えなかった。しかし、これは間違いなく私の問題を解決します。 –

+0

より一般的な方法は、いくつかの制御フロー操作(例えば 'tf.cond()'や 'tf.case()')を使用してデキュー操作をラップすることです。しかし、私は 'QueueBase.from_list()'が制御フローのサポートが存在する前に追加されたと思います。 – mrry

関連する問題