2016-05-04 3 views
4

Tensorflowで訓練されたモデルを復元する方法についてスタックやgithubなどに無数の質問があることは知っています。私はそれらの大部分を読んでいます(123)。保存する変数がないためテンソルフローのグラフを復元できない

私は3とほぼ同じ問題を抱えていますが、できる限り私のトレーニングとテストがシェルから呼び出された別々のスクリプトになる必要があり、テストスクリプトでグラフを定義するために使用したのと全く同じ行です。テンソルフローと他の答えは手動でグラフを再実行することに基づいて使用できません。

また、変数をすべてsess.runしたくないので、グラフがかなり大きいので説明したように手動で手動でマップします(引数input_mapでimport_graph_defを使用)。

私はグラフを実行し、特定のスクリプトでそれを訓練します。例えば

#Script 1 
import tensorflow as tf 
import cPickle as pickle 

x=tf.Variable(42) 
saver=tf.train.Saver() 
sess=tf.Session() 
#Saving the graph 
graph_def=sess.graph_def 
with open('graph.pkl','wb') as output: 
    pickle.dump(graph_def,output,HIGHEST_PROTOCOL) 


#Training the model 
sess.run(tf.initialize_all_variables()) 
#Saving the variables 
saver.save(sess,"pretrained_model.ckpt") 

(ただし、訓練部分なし)私は今、グラフと変数の両方が保存されているようなので、私は私のグラフに余分なトレーニング・ノードを持っている場合でも、別のスクリプトからの私のテストモデルを実行することができるはずです。

#Script 2 
import tensorflow as tf 
import cPickle as pickle 

sess=tf.Session() 
with open("graph.pkl','rb') as input: 
    graph_def=pickle.load(input) 



tf.import_graph_def(graph_def,name='persisted') 

はその後、明らかに私は、セーバーを使用して変数を復元したいが、でもセーバーを作成するために保存することが分かっ変数がないように私は3と同じ問題が発生しました。 だから私は書くことができません。

saver=tf.train.Saver() 
saver.restore(sess,"pretrained_model.ckpt") 

は、私はそれがすべてのノードで初期化されていない変数を回復するグラフをインポートすることで考えこれらの制限を回避するためにそこの方法ですが、私が本当に好きそれをもう一度再実行する必要はないようです答えのほとんどは与えられた?

答えて

3

に保存されていないCollectionに変数のリストが保存されます。 Saverはデフォルトでops.GraphKeys.VARIABLESコレクション(tf.all_variables()からアクセス可能)のリストを使用し、Python APIを使用してモデルを構築するのではなくGraphDefから復元した場合、そのコレクションは空です。 tf.train.Saver(var_list=['MyVariable1:0', 'MyVariable2:0',...])に変数のリストを手動で指定できます。

また代わりのGraphDefあなたがコレクションを保存しMetaGraphDefを使用することができ、あなたは、単にtf.train.Saverオブジェクトに名前を渡すことはできません私の知識と私のテストにMetaGraphDef HowTo

+0

おかげで「保存する変数は、変数ではありません」 !!!残念ながら、モデルの復元に関するもう1つの質問があります。しかし、私はそれが他人にも役立つと思います! – jean

+0

@ Yaroslav、私は 'MetaGraphDef'を使っていますが、私は同じ問題を抱えています。私の質問をここで見てください:https://stackoverflow.com/questions/47762114/converting-a-pb-file-to-meta-in-tf-1-3 – Amir

-1

を、最近そこに追加されます。それは、辞書のいずれかの辞書でなければなりません。

私もgraph_defからモデルを読み込んでセーバーを使用して変数をロードしたいと思います - しかし、それはエラーメッセージのみになり試みる:私が探していたまさに

関連する問題