2017-06-07 6 views
1

私は訓練を受けたモデルを持っています。私は中間maxpool層の出力をモデルから抽出したいと思います。 私はfeed_dict辞書でこの実行のためのプレースホルダとその内容が含まれ、ここでは以下のTensorFlowで事前にトレーニングされたモデルでmaxpoolレイヤの出力を取得するにはどうすればよいですか?

saver = tf.train.import_meta_graph(BASE_DIR + LOG_DIR + '/model.ckpt.meta') 
saver.restore(sess,tf.train.latest_checkpoint(BASE_DIR + LOG_DIR)) 
sess.run("maxpool/maxpool",feed_dict=feed_dict) 

を試してみました。

私はこれの原因となることができるか、次のエラー

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder_1_1' with dtype float and shape... 

得続けますか?私はすべてのプレースホルダを生成し、フィード辞書に入力しました。

答えて

1

私は同様の問題に遭遇し、それはイライラしていました。私の周りには、後で呼びたいすべての変数と操作について、nameフィールドを記入していました。 tf.add_to_collection('name_for_maxpool_op', maxpool_op_handle)のコレクションにmaxpool/maxpoolを追加する必要がある場合もあります。そして、あなたが復元さテンソルを使ってfeed_dictを建設する

# Restore from metagraph. 
saver = tf.train.import_meta_graph(...) 
sess = tf.Session() 
saver = restore(sess, ...) 
graph = sess.graph 

# Restore your ops and tensors. 
maxpool_op = tf.get_collection('name_for_maxpool_op')[0] # returns a list, you want the first element 
a_tensor = graph.get_tensor_by_name('tensor_name:0') # need the :0 added to your name 

:あなたは、その後にOPSと名付けテンソルを復元することができます。 More information can be found here。あなたがあなたのコメントで述べたようにまた、あなたはsess.runにOP自体を渡す必要があり、それが名前だありません。

sess.run(maxpool_op, feed_dict=feed_dict) 

あなたはに(あなたがそれらに名前を付けていなかった場合でも復元メタグラフからあなたのテンソルとOPSにアクセスすることができます例えば、新しいテンソル名を使ってモデルを再学習することは避けてください)、それは少し痛みを伴うことがあります。テンソルに与えられた名前は自動的に最も透明であるとは限りません。あなたがうまくいけば、あなたが探している名前を検索し、上記のようにgraph.get_tensor_by_nameを使用してそのテンソルを復元することができ

print([v.name for v in tf.all_variables()]) 

:あなたは、あなたと、グラフ内のすべての変数の名前をリストすることができます。

+1

私はモデルの再トレーニングを避けたいと思っていました。だから、私はいくつかのことを間違えました。最初のこと(ここには現れません)は、グラフからそれらを抽出するのではなく、入力用のプレースホルダーを再作成したことです。したがって、次のようになります: 'input_name = = graph.get_tensor_by_name("プレースホルダ:0 ")'。私が間違っていた2つ目は、op自体の代わりにopの名前を入力することなので、この 'maxpool_op = graph.get_operation_by_name(" maxpool/maxpool ")'と 'sess.run(maxpool_op.outputs [ 0]、feed_dict = feed_dict' あなたの答えは正しい方向に私を指していましたので、10x –

+0

元気です私の答えはこれを反映するためのビットです。私はすべてのテンソルがそこにあることを知っています、それは彼らのデフォルトの名前で見つけるのは難しいかもしれません。 – Engineero