所以直到最近,我才给我的模型提供一个FIFOQueue,它使用py_func
变量排队。这种奇怪选择的原因是我动态生成训练数据,除了调用python函数生成这些数据之外别无选择。
这一切都很顺利,但我发现自己受到数据生成速度的限制。我已经优化了数据生成算法,所以我现在想要启动几个排队线程。
问题是:我获得了非常奇怪和随机的错误。有时候它可能是一个SegmentationFault,有时它可以工作,直到没有任何东西被排队(我怀疑死锁)......
以下是我的工作内容:
def generate_example():
...
example = tf.py_func(generate_example, inp=[], Tout=...)
enqueue_op = queue.enqueue(example)
qr = tf.train.QueueRunner(queue, [enqueue_op] * 4)
tf.train.add_queue_runner(qr)
请注意,我尝试过对此代码的疯狂变体(定义了几个不同的example
变量,导致不同的enqueue_ops
...,定义了不同的generate_example
函数... )。
根据我的理解,由于Python不能很好地处理多线程,所以这不太可行。但是,也许你们知道了解决方法吗?
谢谢!