2017-01-23 8 views
2

プログラムにフォールトトレランスを導入するために、チェックポイントで変数を保存しようとしています。私はMonitoredTrainingSession関数を使用してこれを達成しようとしています。以下は私の設定です: -Tensorflow:グラフがファイナライズされ、変更できない

import tensorflow as tf 

global_step = tf.Variable(10, trainable=False, name='global_step') 
x = tf.constant(2) 

with tf.device("/job:local/task:0"): 
    y1 = tf.Variable(x + 300) 

with tf.device("/job:local/task:1"): 
    y2 = tf.Variable(x**2) 

with tf.device("/job:local/task:2"): 
    y3 = tf.Variable(5*x) 

with tf.device("/job:local/task:3"): 
    y0 = tf.Variable(x - 66) 
    y = y0 + y1 + y2 + y3 

model = tf.global_variables_initializer() 
saver = tf.train.Saver(sharded=True) 

chief = tf.train.ChiefSessionCreator(scaffold=None, master='grpc://localhost:2222', config=None, checkpoint_dir='/home/tensorflow/codes/checkpoints') 
summary_hook = tf.train.SummarySaverHook(save_steps=None, save_secs=10, output_dir='/home/tensorflow/codes/savepoints', summary_writer=None, scaffold=None, summary_op=tf.summary.tensor_summary(name="y", tensor=y)) 
saver_hook = tf.train.CheckpointSaverHook(checkpoint_dir='/home/tensorflow/codes/checkpoints', save_secs=None, save_steps=True, saver=saver, checkpoint_basename='model.ckpt', scaffold=None) 

# with tf.train.MonitoredSession(session_creator=ChiefSessionCreator,hooks=[saver_hook, summary_hook]) as sess: 

with tf.train.MonitoredTrainingSession(master='grpc://localhost:2222', is_chief=True, checkpoint_dir='/home/tensorflow/codes/checkpoints', 
    scaffold=None, hooks=[saver_hook,summary_hook], chief_only_hooks=None, save_checkpoint_secs=None, save_summaries_steps=True, config=None) as sess: 

    while not sess.should_stop(): 
     sess.run(tf.global_variables_initializer()) 

    while not sess.should_stop(): 
     result = sess.run(y) 
     print(result) 

私は解決することができません、次のRuntimeErrorがを得る: -

Traceback (most recent call last): 
    File "add_1.py", line 39, in <module> 
    sess.run(tf.global_variables_initializer()) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variables.py", line 1187, in global_variables_initializer 
    return variables_initializer(global_variables()) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/variables.py", line 1169, in variables_initializer 
    return control_flow_ops.group(*[v.initializer for v in var_list], name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2773, in group 
    deps.append(_GroupControlDeps(dev, ops_on_device[dev])) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/control_flow_ops.py", line 2721, in _GroupControlDeps 
    return no_op(name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_control_flow_ops.py", line 186, in no_op 
    result = _op_def_lib.apply_op("NoOp", name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op 
    op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2199, in create_op 
    self._check_not_finalized() 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1925, in _check_not_finalized 
    raise RuntimeError("Graph is finalized and cannot be modified.") 
RuntimeError: Graph is finalized and cannot be modified. 
+0

http://stackoverflow.com/a/4332534 8/6521116 –

答えて

7

あなたのエラーの根本的な原因は、(MonitoredTrainingSessionが確定したことのようですフリーズ)グラフとtf.global_variable_initializer()はそれ以上変更できません。

は、注意が必要な複数のものがあることを言った:

1)を繰り返し、ここですべての変数を初期化するために、なぜあなたがしようか?

while not sess.should_stop(): 
    sess.run(tf.global_variables_initializer()) 

2)コードの一部が既にMonitoredTrainingSessionに含まれているようです。 ChiefSessionCreator。 Code(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/monitored_session.py#L243)をもう一度見て、そのサンプル使用法を検索して、MonitoredTrainingSessionはどのように使用されるのですか?

+0

申し訳ありませんが、私はテンソルフローが非常に新しいので、私のコードは非常に原油かもしれません。 1)初期化部分の上のwhileループをコメントして、一度だけ実行します。 2)モニターされたトレーニングで構成を指定した後でも、主催者が必要かどうかはわかりませんでした。 実際には、実行時にループ内で出力252を出しました。しかし、私が停止して再度実行したとき、次のように表示されます。 - [http://pastebin.com/Cgk4Z9Pc](http://pastebin.com/Cgk4Z9Pc) – itsamineral

+2

2度目の実行時に、 global_stepが存在しない以前の実行からのチェックポイント。このスレッド(http://stackoverflow.com/questions/36113090/tensorflow-get-the-global-step-when-restoring-checkpoints)をチェックして、global_stepの保存と復元の方法を確認してください。そしてここで(https://github.com/tensorflow/tensorflow/blob/b00fc538638f87ac45be9105057b9865f0f9418b/tensorflow/python/training/monitored_session_test.py#L206)初期化する方法。 – guinny

1

ループ上でグラフを初期化する場合は、関数を使用してループの上に新しいグラフを作成できます。

import tensorflow as tf 

tf.reset_default_graph() 
tf.Graph().as_default() 
0

あなたの目的はあなたがチェックポイントを取得するためにMonitoredTrainingSessionを使用することですので、使い方はあなたの例よりもはるかに簡単です:

import tensorflow as tf 

global_step = tf.contrib.framework.get_or_create_global_step() 
x = tf.constant(2) 
y1 = x + 300 
y2 = x**2 
y3 = x * 5 
y0 = x - 66 
y = y0 + y1 + y2 + y3 
step = tf.assign_add(global_step, 1) 

with tf.train.MonitoredTrainingSession(checkpoint_dir='/tmp/checkpoints') as sess: 
    while not sess.should_stop(): 
     result, i = sess.run([y, step]) 
     print(result, i) 
  • チェックポイントを復元する/保存するためのフックがあなたのためMonitoredTrainingSessionによって作成されます。
  • save_checkpoint_secsを渡す場合は、チェックポイントの頻度を10分のデフォルト値から変更できます。私は高い頻度がそれほど価値がないことを知っています:節約チェックポイントは無料ではないので、非常に頻繁なチェックポイントは訓練を遅くすることになります。
  • ChiefSessionCreatorとgRPC configは分散実行にのみ必要です(概念の説明についてはhereを参照してください)。特定のデバイスにopsを割り当てる場合と同様に、使用する前に実際に行う必要があることを確認してください。あなたは注意しないよ
  • あなたはtf.Variable()とテンソルでの操作の結果をラップする必要はありません - 。あなたはtensorboardとの訓練を監視するためのsave_summaries_stepsを渡すことができ
  • 彼らはすでに変数ですが、デフォルトで起こるだろうと。とにかく100ステップごとに。
関連する問題