web-dev-qa-db-ja.com

tf.estimatorのトレーニング中のログ精度メトリック

事前に用意された推定器をトレーニングするときの損失とともに精度メトリックスを印刷する最も簡単な方法は何ですか?

ほとんどのチュートリアルとドキュメントは、カスタム推定器を作成するときの問題に対処しているようです-利用可能なものの1つを使用するつもりである場合、これはやりすぎのようです。

tf.contrib.learnには、いくつか(現在は非推奨)のMonitorフックがありました。現在、TFはフックAPIの使用を提案していますが、実際には、ラベルと予測を利用して精度の数値を生成できるものは何も付いていないようです。

10
viksit

tf.contrib.estimator.add_metrics(estimator, metric_fn)doc )を試しましたか?これは、初期化された推定器(事前に定義できます)を受け取り、metric_fnによって定義されたメトリックを追加します。

使用例:

def custom_metric(labels, predictions):
    # This function will be called by the Estimator, passing its predictions.
    # Let's suppose you want to add the "mean" metric...

    # Accessing the class predictions (careful, the key name may change from one canned Estimator to another)
    predicted_classes = predictions["class_ids"]  

    # Defining the metric (value and update tensors):
    custom_metric = tf.metrics.mean(labels, predicted_classes, name="custom_metric")

    # Returning as a dict:
    return {"custom_metric": custom_metric}

# Initializing your canned Estimator:
classifier = tf.estimator.DNNClassifier(feature_columns=columns_feat, hidden_units=[10, 10], n_classes=NUM_CLASSES)

# Adding your custom metrics:
classifier = tf.contrib.estimator.add_metrics(classifier, custom_metric)

# Training/Evaluating:
tf.logging.set_verbosity(tf.logging.INFO) # Just to have some logs to display for demonstration

train_spec = tf.estimator.TrainSpec(input_fn=lambda:your_train_dataset_function(),
                                    max_steps=TRAIN_STEPS)
eval_spec=tf.estimator.EvalSpec(input_fn=lambda:your_test_dataset_function(),
                                steps=EVAL_STEPS,
                                start_delay_secs=EVAL_DELAY,
                                throttle_secs=EVAL_INTERVAL)
tf.estimator.train_and_evaluate(classifier, train_spec, eval_spec)

ログ:

...
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Evaluation [20/200]
INFO:tensorflow:Evaluation [40/200]
...
INFO:tensorflow:Evaluation [200/200]
INFO:tensorflow:Finished evaluation at 2018-04-19-09:23:03
INFO:tensorflow:Saving dict for global step 1: accuracy = 0.5668, average_loss = 0.951766, custom_metric = 1.2442, global_step = 1, loss = 95.1766
...

ご覧のとおり、custom_metricはデフォルトのメトリックと損失とともに返されます。

8
benjaminplanche

@Aldreamの回答に加えて、 TensorBoard を使用してcustom_metricのグラフィックを表示することもできます。これを行うには、次のようにTensorFlowの要約に追加します。

tf.summary.scalar('custom_metric', custom_metric)

tf.estimator.Estimatorを使用する場合のクールな点は、サマリーがFileWriterに自動的に追加されるため(デフォルトでは100ステップごとにマージして保存するため)、サマリーを追加する必要がないことです。

TensorBoardを表示するには、新しいターミナルを開いて次のように入力する必要があります。

tensorboard --logdir={$MODEL_DIR}

その後、localhost:6006でブラウザのグラフィックを確認できます。

3
tsveti_iko