2016-08-07 13 views
5

入力ベクトルが別のモデルの出力であるモデルをトレーニングしています。これは、チェックポイントファイルから最初のモデルを復元し、同じプロセスで2番目のモデルをゼロから(tf.initialize_variables()を使用して)初期化します。Tensorflowの複数のセッションとグラフ(同じプロセスで)

かなりの量のコードと抽象がありますので、ここで関連するセクションを貼り付けています。

self.variables = [var for var in all_vars if var.name.startswith(self.name)] 
saver = tf.train.Saver(self.variables, max_to_keep=3) 
self.save_path = tf.train.latest_checkpoint(os.path.dirname(self.checkpoint_path)) 

if should_restore: 
    self.saver.restore(self.sess, save_path) 
else: 
    self.sess.run(tf.initialize_variables(self.variables)) 

は、各モデルは、独自のグラフとセッション内でスコープされ、このような:

self.graph = tf.Graph() 
self.sess = tf.Session(graph=self.graph) 

with self.sess.graph.as_default(): 
    # Create variables and ops. 

各モデル内のすべての変数はvariable_scope内で作成されている以下の

復元するコードですコンテキストマネージャ。次のように

送り作品:

  • バックグラウンドスレッドはinput = scipy.misc.imread(X)sess.run(inference_op)を呼び出し、ブロッキングスレッドセーフなキューに結果を置きます。
  • メイントレーニングループはキューから読み取り、2番目のモデルのsess.run(train_op)を呼び出します。

問題:
私は損失の値が、でもトレーニング(第2のモデル)の非常に最初の繰り返しで実行間で劇的に変化し続ける(そして数回の反復ではナンなる)ことを観察しています。私は最初のモデルの出力がまったく同じであることを確認しました。最初のモデルのsess.runをコメントアウトし、それをpickledファイルからの同じ入力と置き換えても、この動作は表示されません。

これはtrain_op次のとおりです。

loss_op = tf.nn.sparse_softmax_cross_entropy(network.feedforward()) 
    # Apply gradients. 
    with tf.control_dependencies([loss_op]): 
     opt = tf.train.GradientDescentOptimizer(lr) 
     grads = opt.compute_gradients(loss_op) 
     apply_gradient_op = opt.apply_gradients(grads) 

    return apply_gradient_op 

私は、これはあいまいですけど、私はより多くの詳細を提供するために満足しています。どんな助けもありがとう!

答えて

1

異なるセッションオブジェクトが同時に実行されるため、この問題は最も確実に起こります。最初のモデルのセッションをバックグラウンドスレッドからメインスレッドに移動し、制御された実験を数回繰り返しました(24時間以上実行してコンバージェンスに達しました)。NaNは決して観察されませんでした。一方、同時実行では数分でモデルが分岐します。

すべてのモデルで共通のセッションオブジェクトを使用するようにコードを再構成しました。

+0

私は全く同じ問題に直面しています。あなたの解決策を詳しく教えてもらえますか? –

+1

'sess.run'を同時に実行しないでください。 Tensorflowは、(すべての公開された)GPUメモリの完全な制御を前提としています。 2つの異なるプロセスまたはスレッドで同時に 'sess.run'を実行すると、問題が発生します。 – Vikesh

関連する問題