2017-09-01 11 views
5

1つのpythonアプリケーションでmodel.fit()と並列化されたいくつかの異なるモデルを訓練したいと思います。使用されているモデルは共通して必要なものを持っていませんが、異なる時間に1つのアプリケーションで起動されます。テンソルフロー/ケラスでのマルチスレッド

まず、別のスレッドで問題なく、メインスレッドから1つのmodel.fit()を起動します。

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() 

Exception in thread Thread-1: 
tensorflow.python.framework.errors_impl.InvalidArgumentError: Node 'hidden_1/BiasAdd': Unknown input node 'hidden_1/MatMul' 

彼らは両方のコードの同じ行でメソッドから始めるされています。私は今)は、第2のmodel.fitを(起動したい場合は、私は、次のエラーメッセージが表示されます目と呼ばれるクラス/メソッドは、次のようになります。

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 

は私が何とか新しいtf_sessionと各シングルスレッドのための新しいtf_graphを割り当てることがあると思います。しかし、私はそれについてはあまりよく分かりません。私はこれであまりにも長い間座っているので、私はすべての短いアイデアについて嬉しいです。

おかげ

答えて

0

あなたの問題を修正した場合、私は知りませんが、これは別の質問I recently answeredのように見えます。

  • を開始する前に、メインスレッドでグラフの作成を完了する必要があります。
  • ケラスの場合、フィットまたは予測関数が初めて呼び出されるときにグラフが初期化されます。あなたは、モデルの内部機能の一部を呼び出すことにより、グラフの作成を強制することができます

    model._make_predict_function() 
    model._make_test_function() 
    model._make_train_function() 
    

    問題が解決しない場合は、ウォームアップするためにモデルをダミーデータに呼び出すことでみてください。

  • グラフの作成が完了したら、メインのグラフでfinalize()と呼んで、別のスレッドと安全に共有できるようにします(読み込み専用にする)。

  • グラフを完成させることは、グラフが意図せずに変更されている場所を見つけるのにも役立ちます。

希望します。

関連する問題