2017-10-11 5 views
2

私はTensorFlowモデルを微調整のセッションで約1週間トレーニングしています。TensorFlow:NotFoundError:チェックポイントにキーが見つかりません

... 
conv_decode4/ort_weights/Momentum (DT_FLOAT) [7,7,64,64] 
loss/cross_entropy/avg (DT_FLOAT) [] 
loss/total_loss/avg (DT_FLOAT) [] 
up1/up_filter (DT_FLOAT) [2,2,64,64] 
... 

方法:私は、チェックポイントファイルは、今では2つの空の層を有していることがわかりinspect_checkpoint.py使用

tensorflow.python.framework.errors_impl.NotFoundError: Key conv_classifier/loss/total_loss/avg not found in checkpoint 
[[Node: save/RestoreV2_37 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_save/Const_0_0, save/RestoreV2_37/tensor_names, save/RestoreV2_37/shape_and_slices)]] 

:私はモデルを微調整しようとしたとき

今日、私はエラーを得ましたこの問題を解決しますか?

SOLUTION:

明確にするために編集以下mrryの提案に続いて:あなたのチェックポイントは壊れあるよう幸い

code_to_checkpoint_variable_map = {var.op.name: var for var in tf.global_variables()} 
for code_variable_name, checkpoint_variable_name in { 
    "inference/conv_classifier/weight_loss/avg" : "loss/weight_loss/avg", 
    "inference/conv_classifier/loss/total_loss/avg" : "loss/total_loss/avg", 
    "inference/conv_classifier/loss/cross_entropy/avg": "loss/cross_entropy/avg", 
}.items(): 
    code_to_checkpoint_variable_map[checkpoint_variable_name] = code_to_checkpoint_variable_map[code_variable_name] 
    del code_to_checkpoint_variable_map[code_variable_name] 

saver = tf.train.Saver(code_to_checkpoint_variable_map) 
saver.restore(sess, tf.train.latest_checkpoint('./logs')) 
+0

チェックポイントファイルのキー「loss/weight_loss/avg」はありますか?最初の例外メッセージは、それがそうでないことを示唆しています。 (私はあなたが作った他の変更は理解していませんが、完全なコードブロックは分かりやすいように見えます) – mrry

答えて

2

、それは見ていないのではなく、あなたのプログラム内の変数の一部名前が変更されました。 "loss/total_loss/avg"という名前のチェックポイント値を"conv_classifier/loss/total_loss/avg"という名前の変数に復元する必要があると仮定しています。これを解決するには、tf.train.Saverを作成するときにカスタムvar_listを渡します。

name_to_var_map = {var.op.name: var for var in tf.global_variables()} 

name_to_var_map["loss/total_loss/avg"] = name_to_var_map[ 
    "conv_classifier/loss/total_loss/avg"] 
del name_to_var_map["conv_classifier/loss/total_loss/avg"] 

# Depending on how the names have changed, you may also need to do: 
# name_to_var_map["loss/cross_entropy/avg"] = name_to_var_map[ 
#  "conv_classifier/loss/cross_entropy/avg"] 
# del name_to_var_map["conv_classifier/loss/cross_entropy/avg"] 

saver = tf.train.Saver(name_to_var_map) 

saver.restore()を使用してモデルを復元することができます。あるいは、この方法を使用してモデルとデフォルトを復元することで、tf.train.Saverを標準形式で保存することができます。

+0

私はちょっと混乱します: 'name_to_var_map [" loss/total_loss/avg "]'は私たちがそれに割り当てているので、存在してはいけません)。ちょうどサニティチェック: 'name_to_var_map [" conv_classifier/loss/total_loss/avg "]'は存在しますか? – mrry

+0

それは私が期待していたものです、はい! Python 2.7と3.4で辞書の理解を変えようとしましたが、うまくいきました。おそらく、 'name_to_var_map = dict(name_to_var_map)'を追加すると、それが変更可能になりますか? – mrry

+0

ああ、ごめんなさい。元の辞書の理解は、 'var.name.'をキーとして' var.op.name'を使用していたはずです。 ( 'Variable.name'プロパティの' ':0''は[歴史的な成果物]です(https://stackoverflow.com/a/36156697/3574081)。 – mrry

関連する問題