2017-06-26 9 views
1

TFRecord入力パイプラインを使用してネットワークを訓練しました。つまり、プレースホルダはありませんでした。簡単な例は次のようになります。Tensorflowでは、メタグラフがTFRecord入力(プレースホルダーなし)でフィードしていた場合に復元されたメタグラフを使用する方法

input, truth = _get_next_batch() # TFRecord. `input` is not a tf.placeholder 
net = Model(input) 
net.set_loss(truth) 
optimizer = tf...(net.loss) 

は、私は三つのファイル、ckpt-20000.metackpt-20000.data-0000-of-0001ckpt-20000.indexを取得し、のは、言ってみましょう。しかし、メタグラフは、パイプラインの最初からプレースホルダを持っていない

new_saver = tf.train.import_meta_graph('ckpt-20000.meta') 
new_saver.restore(sess, 'ckpt-20000') 
logits = tf.get_collection("logits")[0] 

:私は後で1のような.metaファイルやアクセステンソルを使用してメタグラフをインポートすることができることを理解しました。入力のメタグラフとクエリの推論を使用する方法はありますか?

クエリアプリケーション(またはスクリプト)の情報として、プレースホルダを使用してモデルを定義し、モデルの重みを復元しました(下記参照)。はるかに単純なので、私は再定義せずにメタグラフを利用できるかどうか疑問に思っています。

input = tf.placeholder(...) 
net = Model(input) 
tf.restore(sess, 'ckpt-2000') 
lgt = sess.run(net.logits, feed_dict = {input:img}) 

答えて

4

あなたは入力のplaceholder_with_default()を使用してグラフを構築することができ、とてもTFRecord input pipelineなどfeed_dict{}の両方を使用することができます。

例:あなたが入力を供給していない場合は、推論中に次に

input, truth = _get_next_batch() 
_x = tf.placeholder_with_default(input, shape=[...], name='input') 
_y = tf.placeholder_with_default(truth, shape-[...], name='label') 

net = Model(_x) 
net.set_loss(_y) 
optimizer = tf...(net.loss) 

、上記の例では

loaded_graph = tf.Graph() 
with tf.Session(graph=loaded_graph) as sess: 
    new_saver = tf.train.import_meta_graph('ckpt-20000.meta') 
    new_saver.restore(sess, 'ckpt-20000') 

    # Get the tensors by their variable name 
    input = loaded_graph.get_tensor_by_name('input:0') 
    logits = loaded_graph.get_tensor_by_name(...) 

    # Now you can feed the inputs to your tensors 
    lgt = sess.run(logits, feed_dict = {input:img}) 

は、その後、入力がTFRecord input pipelineから読み込まれます。

+0

おかげで、あなたは私の一日行わ:

は、NMTのチュートリアルも共有変数で複数のグラフを作成に関する詳細な例を提供し

export_dir = ... ... builder = tf.saved_model_builder.SavedModelBuilder(export_dir) with tf.Session(graph=tf.Graph()) as sess: ... builder.add_meta_graph_and_variables(sess, [tag_constants.TRAINING], signature_def_map=foo_signatures, assets_collection=foo_assets) ... # Add a second MetaGraphDef for inference. with tf.Session(graph=tf.Graph()) as sess: ... builder.add_meta_graph([tag_constants.SERVING]) ... builder.save() 

Building a SavedModel

参照してください!私は 'placeholder_with_default'について知りませんでした! –

2

テスト時にプレースホルダなしで行う方法はありますか?遅いプレースホルダに頼ることなく、新しい入力パイプラインでグラフを再利用することができるはずです(つまり、テストデータセットが非常に大きくなる可能性があります)。その場合、placeholder_with_defaultは最適次善策です。

0

2つのメタグラフを保存することをお勧めします。 1つはトレーニング/検証/テスト用で、もう1つは推論用です。 Neural Machine Translation (seq2seq) Tutorial-Building Training, Eval, and Inference Graphs

train_graph = tf.Graph() 
eval_graph = tf.Graph() 
infer_graph = tf.Graph() 

with train_graph.as_default(): 
    train_iterator = ... 
    train_model = BuildTrainModel(train_iterator) 
    initializer = tf.global_variables_initializer() 

with eval_graph.as_default(): 
    eval_iterator = ... 
    eval_model = BuildEvalModel(eval_iterator) 

with infer_graph.as_default(): 
    infer_iterator, infer_inputs = ... 
    infer_model = BuildInferenceModel(infer_iterator) 

checkpoints_path = "/tmp/model/checkpoints" 

train_sess = tf.Session(graph=train_graph) 
eval_sess = tf.Session(graph=eval_graph) 
infer_sess = tf.Session(graph=infer_graph) 

train_sess.run(initializer) 
train_sess.run(train_iterator.initializer) 

for i in itertools.count(): 

    train_model.train(train_sess) 

    if i % EVAL_STEPS == 0: 
    checkpoint_path = train_model.saver.save(train_sess, checkpoints_path, global_step=i) 
    eval_model.saver.restore(eval_sess, checkpoint_path) 
    eval_sess.run(eval_iterator.initializer) 
    while data_to_eval: 
     eval_model.eval(eval_sess) 

    if i % INFER_STEPS == 0: 
    checkpoint_path = train_model.saver.save(train_sess, checkpoints_path, global_step=i) 
    infer_model.saver.restore(infer_sess, checkpoint_path) 
    infer_sess.run(infer_iterator.initializer, feed_dict={infer_inputs: infer_input_data}) 
    while data_to_infer: 
     infer_model.infer(infer_sess) 
+0

詳細をここに追加してください。それ以外の場合、リンクが変更された場合、回答は無効になります – Billa

+0

@Billa Sure。私はそれらを追加しました。 –

関連する問題