Python 获取数据时tensorflow的搜索和线程错误
我使用tensorflow对模型进行微调,它使用线程将输入队列排队。代码在1000次迭代中运行良好,但在几次迭代后仍会出现以下错误。但是,代码通常会在多次迭代后退出,并出现一些错误,我必须手动重新启动它。你能帮我理解这个错误吗Python 获取数据时tensorflow的搜索和线程错误,python,multithreading,queue,tensorflow,Python,Multithreading,Queue,Tensorflow,我使用tensorflow对模型进行微调,它使用线程将输入队列排队。代码在1000次迭代中运行良好,但在几次迭代后仍会出现以下错误。但是,代码通常会在多次迭代后退出,并出现一些错误,我必须手动重新启动它。你能帮我理解这个错误吗 Exception in thread Thread-29: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inn
Exception in thread Thread-29:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 763, in run
self.__target(*self.__args, **self.__kwargs)
File "data_feeder.py", line 212, in enqueue_op_online_val
model_vars['labels_val']: labels_minibatch})
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 717, in run
run_metadata_ptr)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 915, in _run
feed_dict_string, options, run_metadata)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 965, in _do_run
target_list, options, run_metadata)
File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/client/session.py", line 985, in _do_call
raise type(e)(node_def, op, message)
NotFoundError: PruneForTargets: Some target nodes not found: fifo_queue_enqueue/fifo_queue_enqueue_4/fifo_queue_enqueue_10/fifo_queue_enqueue_10/fifo_queue_enqueue_8/fifo_queue_enqueue_2/fifo_queue_enqueue_4/fifo_queue_enqueue/fifo_queue_enqueue_3/fifo_queue_enqueue_3/fifo_queue_enqueue/fifo_queue_enqueue_1/fifo_queue_enqueue_5/fifo_queue_enqueue/fifo_queue_enqueue_2/fifo_queue_enqueue/fifo_queue_enqueue_4/fifo_queue_enqueue_6/fifo_queue_enqueue_20/fifo_queue_enqueue_29/fifo_queue_enqueue/fifo_queue_enqueue_7/fifo_queue_enqueue_8/fifo_queue_enqueue_9/fifo_queue_enqueue_7/fifo_queue_enqueue/fifo_queue_enqueue_9/fifo_queue_enqueue_8/fifo_queue_enqueue_11/fifo_queue_enqueue_5/fifo_queue_enqueue_7/fifo_queue_enqueue_8/fifo_queue_enqueue_12/fifo_queue_enqueue_3/fifo_queue_enqueue_2/fifo_queue_enqueue_5/fifo_queue_enqueue_4/fifo_queue_enqueue_7/fifo_queue_enqueue_3/fifo_queue_enqueue/fifo_queue_enqueue_9/fifo_queue_enqueue_1/fifo_queue_enqueue_25/fifo_queue_enqueue_23/fifo_queue_enqueue_30/fifo_queue_enqueue_5/fifo_queue_enqueue_3/fifo_queue_enqueue_7/fifo_queue_enqueue_3/fifo_queue_enqueue/fifo_queue_enqueue_2/fifo_queue_enqueue_8/fifo_queue_enqueue_11/fifo_queue_enqueue_11/fifo_queue_enqueue/fifo_queue_enqueue_4
这是排队的时间
def enqueue_op(self, sess, model_vars, coord):
queue = model_vars['queue_train']
random.shuffle(self.keys)
img_minibatch = np.zeros((self.batch_size, 224, 224, 3))
#t = time.time()
for indx in xrange(self.num_batches):
labels_minibatch = []
# Load all files in this batch
for i,k in\
enumerate(self.keys[indx*self.batch_size:(indx+1)*self.batch_size]):
img = misc.imread(self.img_path + self.data[k]['filename'])
img_minibatch[i, :, :, :] = img_proc(img)
labels_minibatch.append(self.data[k]['labels'])
labels_minibatch =\
self.mlb.fit_transform(labels_minibatch).astype(float)
sess.run([queue.enqueue([model_vars['input'],
model_vars['labels']])],\
feed_dict={model_vars['input']: img_minibatch,
model_vars['labels']: labels_minibatch})
if coord.should_stop():
break
下面是线程创建代码段
thr_train = []
for i in xrange(12):
thr_train.append(threading.Thread(target=primary_mb_feeder.enqueue_op,
args=(sess, model_vars, coord)))
thr_train[-1].setDaemon(True)
thr_train[-1].start()
问题似乎是由
enqueue_op()
方法引起的,该方法(i)在多个线程中运行,以及(ii)通过调用为每个小批创建一个新的tf.Operation
。TensorFlow不支持多个线程同时向图中添加节点,这样做通常效率很低(因为当图不改变时,TensorFlow的工作效率最高)
为了解决这个问题,我建议您重构代码,以便只调用
queue.enqueue()
一次,在所有输入线程之间共享返回的操作,并在每个提供新数据的sess.run()
调用中使用它。您可以共享用于创建enqueue op的代码吗?缺少的节点名称非常奇怪,我想知道问题是否是由多个线程同时创建排队操作引起的,而最好创建一个跨线程重用的操作。(这可能仍然是一个bug,但是…)我已经粘贴了我正在使用的排队操作的代码和创建线程以运行此操作的代码段。什么类型是primary_mb_feeder
?enqueue_op
是它的一种方法吗?它是如何实现的?很抱歉在代码中过于抽象。Primary_mb_feeder是一个简单的类,用于初始化图像和标签的路径目录。enqueue_op只是这个调用的一个方法,用于为队列提供信息。