コードベースを 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
などを使用するフックを登録する必要がありますか?
編集:(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()
はモデルグラフと同じコンテキストで呼び出す必要があるため、これは機能しません。
私にとってこれはうまくいきましたwithoutフックまたは_merge_all
_呼び出しを追加しました。 _model_fn
_にtf.summary.image(...)
を追加しました。モデルをトレーニングすると、テンソルボードに魔法のように表示されます。ただし、正確なメカニズムは不明です。 TensorFlow 1.4を使用しています。
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、グラフィックを見ることができます
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
_