2017-01-12 17 views
1

グラフと変数の値を含むTensorflow(0.12.0)モデルを保存しておき、後で読み込んで実行します。私はこれについてのドキュメントや他の投稿を読んだことがありますが、作業の基礎を得ることはできません。私はthis page in the Tensorflow docsから技術を使用しています。省コードが動作するようですが、負荷コードは、これを生成:コード:Tensorflowモデルを保存して読み込みます

保存単純なモデル:

myVar = tf.Variable(7.1) 
tf.add_to_collection('modelVariables', myVar) # why? 
init_op = tf.global_variables_initializer() 
with tf.Session() as sess: 
    sess.run(init_op) 
    print sess.run(myVar) 
    saver0 = tf.train.Saver() 
    saver0.save(sess, './myModel.ckpt') 
    saver0.export_meta_graph('./myModel.meta') 

その後、負荷およびモデルを実行します。

with tf.Session() as sess: 
    saver1 = tf.train.import_meta_graph('./myModel.meta') 
    saver1.restore(sess, './myModel.meta') 
    print sess.run(myVar) 

を質問1エラー:

W tensorflow/core/util/tensor_slice_reader.cc:95] Could not open ./myModel.meta: Data loss: not an sstable (bad magic number): perhaps your file is in a different file format and you need to use a different restore operator? 

修正方法

質問2:私はTFのドキュメント内のパターンに従うように、この行を含め ...

tf.add_to_collection('modelVariables', myVar) 

...しかし、なぜその行が必要なのか? expert_meta_graphはデフォルトでグラフ全体をエクスポートしていませんか?そうでなければ、保存する前に、グラフのすべての変数をコレクションに追加する必要がありますか?または、復元後にアクセスされる変数をコレクションに追加するだけですか?

---------------------- 更新1月12日2017 ------------------ -----------

以下のKashyapの提案に基づいて部分的に成功しましたが、まだ謎が残っています。以下のコードは、tf.add_to_collectiontf.get_collectionを含む行を含める場合にのみですが、を使用します。これらの行がないと、 'load'モードで最後の行にエラーがスローされます。 NameError: name 'myVar' is not defined。私の理解では、デフォルトではSaver.saveがグラフのすべての変数を保存して復元するので、コレクションで使用される変数の名前を指定する必要があるのはなぜですか?これはTensorflowの変数名をPythonの名前にマッピングすることと関係がありますが、ここでのゲームのルールは何ですか?どの変数に対してこれを行う必要がありますか?

mode = 'load' # or 'save' 
if mode == 'save': 
    myVar = tf.Variable(7.1) 
    init_op = tf.global_variables_initializer() 
    saver0 = tf.train.Saver() 
    tf.add_to_collection('myVar', myVar) ### WHY NECESSARY? 
    with tf.Session() as sess: 
     sess.run(init_op) 
     print sess.run(myVar) 
     saver0.save(sess, './myModel') 
if mode == 'load': 
    with tf.Session() as sess: 
     saver1 = tf.train.import_meta_graph('./myModel.meta') 
     saver1.restore(sess, tf.train.latest_checkpoint('./')) 
     myVar = tf.get_collection('myVar')[0] ### WHY NECESSARY? 
     print sess.run(myVar) 
+0

[Tensorflow:以前に保存したモデル(python)を復元する方法](http://stackoverflow.com/questions/33759623/tensorflow-how-to-restore-a-previously-save-model-python ) – Kashyap

答えて

1

私は同じことを理解しようとしていて、Supervisorを使って正常に実行できました。それは自動的にすべての変数とあなたのグラフなどを読み込みます。ここには、文書 - https://www.tensorflow.org/programmers_guide/supervisorがあります。ご覧のとおり、これはSaverオブジェクトを使用するよりもはるかに簡単です

sv = tf.train.Supervisor(logdir="/checkpoint', save_model_secs=60) 
    with sv.managed_session() as sess: 
     if not sv.should_stop(): 
      #Do run/eval/train ops on sess as needed. Above works for both saving and loading 

と個々の変数を扱うなど限り、グラフは同じままとして、(私の理解では、私たちが望むときSaverが便利来ることである - 以下は、私のコードです別のグラフにあらかじめ訓練されたモデルを再利用するため)。

1

Question1

この質問はすでに徹底的hereに答えてきました。明示的にexport_meta_graphを呼び出す必要はありません。 save methodに電話してください。 (Saveメソッドが内部export_meta_graphメソッドを呼び出しますので、。)これも.metaファイルを生成します

saver0.save(sess, './myModel.ckpt')

たとえば

について myModel.ckptファイルとも myModel.ckpt.metaファイルを生成します。

は、その後、あなたは

with tf.Session() as sess: 
    saver1 = tf.train.import_meta_graph('./myModel.ckpt.meta') 
    saver1.restore(sess, './myModel') 
    print sess.run(myVar) 

Question2を使用してモデルを復元することができ

コレクションは学習率、正則化に使用してきた要因やその他の情報とこれらのようなカスタム情報を格納するために使用されている

グラフをエクスポートすると保存されます。 Tensorflow自体は、作成したモデルのすべての学習可能な変数を取得するために使用される「TRAINABLE_VARIABLES」のようなコレクションを定義します。グラフ内のすべてのコレクションをエクスポートするか、エクスポートするコレクションをexport_meta_graph関数で指定することができます。

はいtensorflowは、定義したすべての変数をエクスポートします。しかし、グラフにエクスポートする必要がある他の情報が必要な場合は、それらをコレクションに追加することができます。

+0

ありがとうKashyap。私はその方法を試みましたが、まだ成功しませんでした。私は上記の元の投稿に詳細を追加しました。 –

+0

私の投稿を更新しました...新しいコードは機能し、なぜコレクションに変数を追加するかは任意です – Kashyap

+0

Strange。あなたのコードを実行すると、最初にmode = save、次にmode = loadで、 'NameError:name 'myVar'が定義されていません。私はTensorflow 0.12.0とPython 2.7.11を使用しています。 –

関連する問題