入力ベクトルが別のモデルの出力であるモデルをトレーニングしています。これは、チェックポイントファイルから最初のモデルを復元し、同じプロセスで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
私は、これはあいまいですけど、私はより多くの詳細を提供するために満足しています。どんな助けもありがとう!
私は全く同じ問題に直面しています。あなたの解決策を詳しく教えてもらえますか? –
'sess.run'を同時に実行しないでください。 Tensorflowは、(すべての公開された)GPUメモリの完全な制御を前提としています。 2つの異なるプロセスまたはスレッドで同時に 'sess.run'を実行すると、問題が発生します。 – Vikesh