2017-04-11 10 views
2

tf.train.MonitoredTrainingSessionに変数の一部のみを復元し、残りの部分を初期化する方法を教えてください。 cifar10チュートリアルを皮切りtf.train.MonitoredTrainingSessionを使用して特定の変数のみを復元する方法

.. https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10_train.py

..私は復元し、初期化する変数のリストを作成し、私はMonitoredTrainingSessionに渡す足場使用してそれらを指定:

restoration_saver = Saver(var_list=restore_vars) 
    restoration_scaffold = Scaffold(init_op=variables_initializer(init_vars), 
            ready_op=constant([]), 
            saver=restoration_saver) 

が、これは次のエラーを与える:

RuntimeError: Init operations did not make model ready for local_init. Init op: group_deps, init fn: None, error: Variables not initialized: conv2a/T, conv2b/T, [...]

.. uninitiaエラーメッセージに列挙された変数は私の "init_vars"リストの変数です。

例外はSessionManager.prepare_session()によって発生します。そのメソッドのソースコードは、セッションがチェックポイントから復元された場合、init_opは実行されないことを示しているようです。つまり、変数のリストアや変数の初期化は可能ですが、両方を行うことはできません。

答えて

3

私が思ったように、既存のtf.training.SessionManagerに基づいた新しいRefinementSessionManagerクラスを実装することで、私が望んでいたものが得られました。モデルがチェックポイントからロードされたかどうかに関わらず、prepare_sessionメソッドを変更してinit_opを呼び出すことを除いて、2つのクラスはほぼ同じです。

これにより、チェックポイントから変数リストを読み込み、init_opの残りの変数を初期化することができます。これは他の誰かに役立ちます

def prepare_session(self, master, init_op=None, saver=None, 
        checkpoint_dir=None, wait_for_checkpoint=False, 
        max_wait_secs=7200, config=None, init_feed_dict=None, 
        init_fn=None): 

    sess, is_loaded_from_checkpoint = self._restore_checkpoint(
    master, 
    saver, 
    checkpoint_dir=checkpoint_dir, 
    wait_for_checkpoint=wait_for_checkpoint, 
    max_wait_secs=max_wait_secs, 
    config=config) 

    # [removed] if not is_loaded_from_checkpoint: 
    # we still want to run any supplied initialization on models that 
    # were loaded from checkpoint. 

    if not is_loaded_from_checkpoint and init_op is None and not init_fn and self._local_init_op is None: 
     raise RuntimeError("Model is not initialized and no init_op or " 
        "init_fn or local_init_op was given") 
    if init_op is not None: 
     sess.run(init_op, feed_dict=init_feed_dict) 
    if init_fn: 
     init_fn(sess) 

    # [...] 

希望:

マイprepare_session方法はこれです。

0

これは、local_init_op引数で解決できます。この引数は、チェックポイントからロードした後に実行されます。

1

@avital作品からヒントは、より完全なものにする:local_init_opready_for_local_init_opMonitoredTrainingSessionに足場オブジェクトを渡します。ように:

model_ready_for_local_init_op = tf.report_uninitialized_variables(
      var_list=var_list) 
model_init_tmp_vars = tf.variables_initializer(var_list) 
scaffold = tf.train.Scaffold(saver=model_saver, 
       local_init_op = model_init_tmp_vars, 
       ready_for_local_init_op = model_ready_for_local_init_op) 
with tf.train.MonitoredTrainingSession(..., 
       scaffold=scaffold, 
       ...) as mon_sess: 
    ... 
+0

私はそれを取得しません。それらをlocal_init_opとして指定すると、モデル変数を2回初期化することができます。モデルに保存されていない他の変数であってはなりませんか? – Magnus

+0

まず、変数を2回初期化するのは大きな問題ではないと思います。次に、あなたは 'var_list'にどの変数があるのか​​を選択します。この質問は、あなたの変数のいくつかを復元し、あなたのモデルに存在する可能性のあるものよりも初期化することについてです。あなたの質問は正しくないかもしれませんか? – Bastiaan

+0

変数を復元して初期化するとどうなりますか?復元された状態は、その後上書きされませんか? 'var_list'には私が保存している変数だけが含まれているので?私が理解しているところは、 'model_ready_for_local_init_op'は' var_list'のすべての変数が初期化されたとき(モデルから復元されたとき)、つまり私に知らせることです。空のリストを返して、次に保存されていない他の変数(つまり 'model_init_tmp_vars')を初期化できますか? – Magnus

関連する問題