2017-04-05 11 views
4

私はそれを呼び出すと自動的にa(データ、ラベル)のペアを生成するpython関数を持っています。 TensorFlow FIFOQueueにこの関数をどのように付加するかわからないので、キューは自分の関数から生成されたデータで埋められます。私がこれまで持っているコードは次のとおりです。Python関数からTensorFlowキューにデータをエンキューする方法

myq = tf.FIFOQueue(5000, [tf.float32, tf.float32], [[4],[1]]) 
enqueue_op = myq.enqueue(read_data()) # read_data() returns two numpy arrays of shape [4] and [1] 
qr = tf.train.QueueRunner(myq, [enqueue_op]*2) 
... 
threads = qr.create_threads(sess=sess,coord=coord, start=True) 

しかし、これは唯一の()を1回の関数READ_DATAを呼び出し、キューに同じ値をプッシュし続けます。エンキューメソッドに関数を正しく接続するにはどうすればよいのですか?(できればバックグラウンドで複数のスレッドを使用する)関数のデータをキューに入れることができます。ご協力いただきありがとうございます。

答えて

2

私はread_dataがあなた自身のコードであり、TF操作ではないことを理解しています。 enqueue_opのプレースホルダが必要な場合は、feed_dictを使用してデータをフィードします。

# Graph setup 
x_enqueue = tf.placeholder(tf.float32, shape=(4)) 
y_enqueue = tf.placeholder(tf.float32, shape=(1)) 
enqueue_op = myq.enqueue([x_enqueue, y_enqueue]) 

... 

# Enqueue loop: 
x_read, y_read = read_data() 
sess.run(enqueue_op, feed_dict={x_enqueue: x_read, y_enqueue: y_read}) 
+2

ああ。したがって、このセットアップはtf.train.QueueRunnerと実際には互換性がなく、エンキューオペレーションをスレッド化してループするための独自のコードを記述する必要がありますか? (そしてはい、read_data()にはTF操作が含まれていません) – TriSSSe

+2

良い質問!私は最初の列を設定するときに同じ質問をしました。私はQueueRunnerをまだ使用していませんが、私の理解は、テンソルフローファイルやTFリーダーからのデータ読み込みのみをサポートしているということを推測するグラフからデータをエンキューした場合にのみ機能するということですサポートすることができます。独自の関数でデータを生成する場合は、グラフに渡す必要があります。これはプレースホルダーを意味します。 –

+2

'tf.train.Coordinator()'を使用して、 'QueueRunner()'ではなく、シャットダウンとループ操作を調整することができます。待ち行列を閉じるには 'cancel_pending_enqueue_operations = True'を使用してください。 –

関連する問題