2017-03-17 107 views
1

我正在测试tensoprflow队列系统,我有一个简单的使用队列处理输入的tensorflow程序。示例程序的代码是Tensorflow在使用队列的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() 

的问题是,它冻结在第一p = sess.run(model2layers(example_batch)),它停在那里无限期。

示例程序有什么问题?

回答

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()开始后台线程用于填充队列。第二行调用tf.train.batch(),它添加一个新的队列,这需要启动额外的后台线程来填充该队列,但该线程未启动,因此程序挂起。

解决方案很简单:将两条线颠倒过来,这样在tf.train.batch()之后调用tf.train.start_queue_runners()

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

如果我倒我收到以下错误'FailedPreconditionError(见上回溯)的顺序:尝试使用未初始化值密/ kernel' – RdlP