2016-10-28 7 views
0

Saver documentationでは、セーバーオブジェクトはリストまたはディクショナリを入力として使用でき、ディクショナリの場合は、変数を保存または復元するために使用される名前でなければなりません。私は、次のようなコードがあります。テンソルフローセーバーに辞書を渡す

create_network() 
vars_to_load_list = ... 
vars_to_load_dict = {v.name:v for v in vars_to_load_list} 
loader = tf.train.Saver(var_list=vars_to_load_list, max_to_keep=FLAGS.max_epoch) 
path = ... 
latest_ckpt = tf.train.latest_checkpoint(path, latest_filename=None) 
sess = tf.Session() 
ckpt = tf.train.get_checkpoint_state(path) 
if ckpt and ckpt.model_checkpoint_path: 
    loader.restore(sess, save_path=latest_ckpt) 

上記のコードは動作しますが、しかし、私の代わりにvaribleリストの変数辞書に渡した場合、すなわちにloaderのdefenitionを変更:

loader = tf.train.Saver(var_list=vars_to_load_dict, max_to_keep=FLAGS.max_epoch) 

その後、NotFoundErrorが表示され、ローダーはチェックポイントファイルにTensorの名前が見つからないと不満を表明します。しかし、私は両方のバージョンのコードが同じように動作することを期待しています。何か不足していますか?

答えて

1

問題を見つけました。どうやら、変数のname属性は変数の値に対応し、テンソル変数には対応していません(これらの概念についての私の理解が正しい場合)。つまり、"my_var:0"を返し、ローダーには"my_var"が必要です。上記の例で辞書の定義を変更すると、問題は解決します。

vars_to_load_dict = {v.name[:-2]:v for v in vars_to_load_list} 
関連する問題