web-dev-qa-db-ja.com

tf.estimator.Estimatorでテンソルボードを使用するにはどうすればよいですか

コードベースを tf.estimator.Estimator に移動することを検討していますが、テンソルボードサマリーと組み合わせて使用​​する方法の例を見つけることができません。

MWE:

import numpy as np
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)

# Declare list of features, we only have one real-valued feature
def model(features, labels, mode):
    # Build a linear model and predict values
    W = tf.get_variable("W", [1], dtype=tf.float64)
    b = tf.get_variable("b", [1], dtype=tf.float64)
    y = W*features['x'] + b
    loss = tf.reduce_sum(tf.square(y - labels))

    # Summaries to display for TRAINING and TESTING
    tf.summary.scalar("loss", loss)    
    tf.summary.image("X", tf.reshape(tf.random_normal([10, 10]), [-1, 10, 10, 1])) # dummy, my inputs are images

    # Training sub-graph
    global_step = tf.train.get_global_step()
    optimizer = tf.train.GradientDescentOptimizer(0.01)
    train = tf.group(optimizer.minimize(loss), tf.assign_add(global_step, 1))

    return tf.estimator.EstimatorSpec(mode=mode, predictions=y,loss= loss,train_op=train)

estimator = tf.estimator.Estimator(model_fn=model, model_dir='/tmp/tf')
# define our data set
x=np.array([1., 2., 3., 4.])
y=np.array([0., -1., -2., -3.])
input_fn = tf.contrib.learn.io.numpy_input_fn({"x": x}, y, 4, num_epochs=1000)

for Epoch in range(10):
    # train
    estimator.train(input_fn=input_fn, steps=100)
    # evaluate our model
    estimator.evaluate(input_fn=input_fn, steps=10)

テンソルボードで2つの要約を表示するにはどうすればよいですか? tf.summary.FileWriterなどを使用するフックを登録する必要がありますか?

11
Manuel Schmidt

編集:(v1.1.0で、そしておそらくそれ以降のバージョンでも)テストすると、_tf.estimator.Estimator_が自動的に要約を書くことは明らかです。 OPのコードとテンソルボードを使用してこれを確認しました。

(r1.4を少し突くと、この自動要約書き込みは _tf.train.MonitoredTrainingSession_ が原因で発生すると結論付けられます。)

最終的に、自動要約はフックを使用して実行されるため、Estimatorのデフォルトの要約をカスタマイズする場合は、フックを使用して行うことができます。以下は、元の回答の(編集済みの)詳細です。


以前は monitors と呼ばれていたフックを使用する必要があります。 (リンクは概念/クイックスタートガイドです;簡単に言えば、トレーニングへのフック/モニタリングの概念がEstimator APIに組み込まれているということです。実際のソースコードの非推奨アノテーションを除いて文書化されています...)

使用法に基づいて、r1.2の SummarySaverHook が請求に適合するように見えます。

_summary_hook = tf.train.SummarySaverHook(
    SAVE_EVERY_N_STEPS,
    output_dir='/tmp/tf',
    summary_op=tf.summary.merge_all())
_

明示的にSummaryWriterを提供するか、NステップではなくN秒ごとに書き込むことにより、フックの初期化パラメーターをカスタマイズできます。

これをEstimatorSpecに渡すと、カスタマイズされたサマリー動作が得られます:

_return tf.estimator.EstimatorSpec(mode=mode, predictions=y,loss=loss,
                                  train_op=train,
                                  training_hooks=[summary_hook])
_

編集注:この回答の以前のバージョンでは、_summary_hook_をestimator.train(input_fn=input_fn, steps=5, hooks=[summary_hook])に渡すことを提案していました。 tf.summary.merge_all()はモデルグラフと同じコンテキストで呼び出す必要があるため、これは機能しません。

14
jagthebeetle

私にとってこれはうまくいきましたwithoutフックまたは_merge_all_呼び出しを追加しました。 _model_fn_にtf.summary.image(...)を追加しました。モデルをトレーニングすると、テンソルボードに魔法のように表示されます。ただし、正確なメカニズムは不明です。 TensorFlow 1.4を使用しています。

8
simlmx

estimator = tf.estimator.Estimator(model_fn=model, model_dir='/tmp/tf')

コードmodel_dir='/tmp/tf'は、推定器がすべてのログを/tmp/tf、次にtensorboard --log.dir=/tmp/tf、URLでブラウザを開きます。 http:// localhost "6006、グラフィックを見ることができます

2
gong situ

Summary_opとしてtf.summary.merger_all()SummarySaverHookを作成できますmodel_fn自体で。このフックをmodel_fnのEstimatorSpecコンストラクターの_training_hooks_ paramに渡します。

@jagthebeetleが言ったことはここで正確に当てはまるとは思いません。 _estimator.train_メソッドに転送するフックは、model_fnで定義したサマリーに対して実行できません。これらは、スコープによって制限されているため、_merge_all_ opに追加されないためです_model_fn_

1
Ankit Mundada