张量流/ keras中的多线程

Asd*_*f11 9 python multithreading keras tensorflow

我想在一个python应用程序中使用model.fit()并行训练一些不同的模型.使用的模型没有必要的共同点,它们在不同的时间在一个应用程序中启动.

首先,我在一个单独的线程中启动一个model.fit(),然后是主线程.如果我现在想要启动第二个model.fit(),我收到以下错误消息:

Exception in thread Thread-1:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Node 'hidden_1/BiasAdd': Unknown input node 'hidden_1/MatMul'
Run Code Online (Sandbox Code Playgroud)

它们都是通过相同的代码行从一个方法开始的:

start_learn(self:)
   tf_session = K.get_session()  # this creates a new session since one doesn't exist already.
   tf_graph = tf.get_default_graph()

   keras_learn_thread.Learn(learning_data, model, self.env_cont, tf_session, tf_graph)
   learning_results.start()
Run Code Online (Sandbox Code Playgroud)

所谓的类/方法如下所示:

def run(self):
    tf_session = self.tf_session  # take that from __init__()
    tf_graph = self.tf_graph  # take that from __init__()

    with tf_session.as_default():
        with tf_graph.as_default():
            self.learn(self.learning_data, self.model, self.env_cont)
            # now my learn method where model.fit() is located is being started
Run Code Online (Sandbox Code Playgroud)

我想我不得不为每个单独的线程分配一个新的tf_session和一个新的tf_graph.但我对此并不十分肯定.我会为每一个简短的想法感到高兴,因为我现在坐在这里太久了.

谢谢

Jul*_*yes 1

我不知道您是否解决了问题,但这看起来像是我最近回答的另一个问题。

  • 在启动其他线程之前,您需要在主线程中完成图形创建。
  • 对于 keras,图会在第一次调用拟合或预测函数时初始化。您可以通过调用模型的一些内部函数来强制创建图形:

    model._make_predict_function()
    model._make_test_function()
    model._make_train_function()
    
    Run Code Online (Sandbox Code Playgroud)

    如果这不起作用,请尝试通过调用虚拟数据来预热模型。

  • 完成图形创建后,调用finalize()主图形,以便可以安全地与不同线程共享它(这将使其只读)。

  • 完成图表还可以帮助您找到图表被无意修改的其他位置。

希望对您有帮助。