2017-03-17 6 views
1

私はtensoprflowキューシステムをテストしています。キューを使用して入力を処理する簡単なテンソルフロープログラムがあります。サンプルプログラムのコードは、問題は、それがいつまでもそこに停止し、最初p = sess.run(model2layers(example_batch))で凍結していることであるTessorflowはキューを使用してsess.run呼び出しをフリーズします

import tensorflow as tf 
import numpy as np 

def model(example_batch): 
    dense1 = tf.layers.dense(inputs=example_batch, units=64, activation=tf.nn.relu) 
    dense2 = tf.layers.dense(inputs=dense1, units=2) 
    return dense2 

x_input_data = tf.random_normal([1024, 16], mean=0, stddev=1) 
q = tf.FIFOQueue(capacity=1, dtypes=tf.float32, shapes=[1024, 16]) 

enqueue_op = q.enqueue(x_input_data) 
numberOfThreads = 1 

qr = tf.train.QueueRunner(q, [enqueue_op] * numberOfThreads) 
tf.train.add_queue_runner(qr) 
input = q.dequeue() 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

# Start input enqueue threads. 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(sess=sess, coord=coord) 
example_batch = tf.train.batch([input], batch_size=1, num_threads=numberOfThreads, capacity=1, enqueue_many=False) 

for step in range(100): 
    print ("step") 
    #sess.run(input) 
    p = sess.run(model(example_batch)) 

coord.request_stop() 
coord.join(threads) 
sess.close() 

です。

サンプルプログラムで何が問題になっていますか?

答えて

2

問題は、これらの行の順序である:

threads = tf.train.start_queue_runners(sess=sess, coord=coord) 
example_batch = tf.train.batch([input], batch_size=1, num_threads=numberOfThreads, capacity=1, enqueue_many=False) 

最初の行は、キューを充填するためのバックグラウンドスレッドを開始するtf.train.start_queue_runners()を呼び出します。 2行目は、新しいキューを追加するtf.train.batch()を呼び出します。追加するバックグラウンドスレッドは、そのキューを満たすために開始する必要がありますが、そのスレッドは開始されていないため、プログラムはハングします。

解決策は非常に簡単です。がtf.train.batch()の後に呼び出されるように、2つの行を逆にします。私は次のエラー `FailedPreconditionError(トレースバックについては上記を参照)を取得する順序を反転した場合

example_batch = tf.train.batch([input], batch_size=1, num_threads=numberOfThreads, capacity=1, enqueue_many=False) 
threads = tf.train.start_queue_runners(sess=sess, coord=coord) 
+0

:高密度の初期化されていない値を使用しようとすると、/ kernel' – RdlP

関連する問題