web-dev-qa-db-ja.com

Tensorflowの複数のセッションとグラフ(同じプロセス内)

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

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

以下は、復元コードです。

_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_コンテキストマネージャー内で作成されます。

給餌は次のように機能します。

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

問題:
損失の値は、トレーニングの最初の反復(2番目のモデル)でも、実行間で大幅に変化し続ける(そして、数回の反復でnanになる)ことを観察しています。最初のモデルの出力が毎回まったく同じであることを確認しました。最初のモデルの_sess.run_をコメントアウトして、ピクルされたファイルからの同一の入力で置き換えても、この動作は示されません。

これは_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
_

漠然としていることは承知していますが、詳細をお知らせいたします。どんな助けでもありがたいです!

16
Vikesh

この問題は、さまざまなセッションオブジェクトの同時実行が原因で発生していると考えられます。最初のモデルのセッションをバックグラウンドスレッドからメインスレッドに移動し、制御された実験を数回繰り返し(24時間以上実行して収束に達した)、NaNを観察しませんでした。一方、同時実行では、モデルが数分で発散します。

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

6
Vikesh