2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TensorFlow-Slimを逆にたどっていきながら理解する【評価編】

Last updated at Posted at 2018-08-16

学習が終わったら、その結果で評価を行う必要があります。
Slimでは評価を行う関数が用意されているので、そこからたどっていきます。

前提情報

TensorFlow-Slimは「tensorflow/contrib/slim」にあります。
そこで、すでに

import tensorflow as tf
import tensorflow.contrib.slim as slim

が行われているものとします。

評価

評価を行う関数は「slim.evaluation.evaluation_loop()」です。
※「slim.evaluation.evaluate_once()」というのもありますが、こちらは今回は省略

session.run()とか呼ばずに、この関数を呼ぶとすぐに学習を始めます。
学習データの読み込みも、この関数が呼ばれたときに実行されます。
(この関数内でsession.run()が呼ばれているようなイメージです)

こんな書き方をします。

slim.evaluation.evaluation_loop(
    '',
    checkpoint_dir,
    log_dir,
    num_evals=num_batches,
    eval_op=list(names_to_updates.values()),
    summary_op=tf.summary.merge(summary_ops),
    eval_interval_secs=eval_interval_secs)

引数の意味を調べてみます。

変数名 意味 初期値
master TensorFlowマスターのBNSアドレス
checkpoint_dir チェックポイントが格納されているディレクトリ
logdir TensorFlowサマリーが書き込まれるディレクトリ
num_evals 「eval_op」を実行する回数 None
initial_op 評価の開始時に実行される処理 None
initial_op_feed_dict 「initial_op」を実行する際に使用するフィード辞書 None
init_fn 「init_op」の後に実行されるオプションの呼び出し可能関数
引数として1つだけ、初期化されたセッションが必要です
None
eval_op 「num_evals」回実行される処理 None
eval_op_feed_dict 「eval_op」を実行する際に使用するフィード辞書 None
final_op 全ての「eval_op」の実行の後に実行する処理
「final_op」の値が返されます
None
final_op_feed_dict 「final_op」を実行する際に使用するフィード辞書 None
summary_op TensorFlow-Slimメトリック操作を実行した後に評価するサマリー処理
デフォルトでは、tf.summary.merge_all()が設定されています
_USE_DEFAULT
summary_op_feed_dict 「summary_op」を実行する際に使うオプションのフィード辞書 None
variables_to_restore 評価中にリストアするTensorFlow変数のリスト
引数が 「None」のままであれば、slim.variables.GetVariablesToRestore()が使用されます
None
eval_interval_secs 評価間の最小秒数 60
max_number_of_evaluations 評価の反復の最大回数
値が「None」の場合、評価は無期限に続きます
None
session_config 「Session」を設定するために使われる「 tf.ConfigProto」のインスタンス
「None」の場合、デフォルトが使用されます
None
timeout チェックポイント間で待機する最大時間<br/「None」の場合、プロセスは無期限に待機します None
timeout_fn タイムアウト後に呼び出すオプションの関数
この関数がTrueを返すと、新しいチェックポイントが生成されず、イテレータが終了することを意味します
関数は引数なしで呼び出されます
None
hooks 繰り返し評価中に渡す追加の 「SessionRunHook」オブジェクトのリスト None

このうち、「master」「checkpoint_dir」「logdir」は必須になります。
※「master」は「''」がよい
なお、「eval_op」がないと意味がありませんので、これは設定します。さらに「summary_op」もあった方がよいので、これらをまとめて説明します。

evel_op

評価を行う処理になります。
例えば平均二乗誤差で評価を行う場合は、以下の関数を使用します。

mae_value_op, mae_update_op = slim.metrics.streaming_mean_absolute_error(predictions, labels)

この時の「mae_update_op」を渡します。

通常、評価は1つの指標だけでなく、いくつかの指標を見ます。
そこで、以下のようにまとめます。

value_ops, update_ops = slim.metrics.aggregate_metrics(
    slim.metrics.streaming_mean_absolute_error(predictions, labels),
    slim.metrics.streaming_mean_squared_error(predictions, labels))

ラベルを付ける場合は、以下のようになります。

names_to_values, names_to_updates = slim.metrics.aggregate_metric_map({
    "eval/mean_absolute_error": slim.metrics.streaming_mean_absolute_error(predictions, labels),
    "eval/mean_squared_error": slim.metrics.streaming_mean_squared_error(predictions, labels),
})

※この場合は「names_to_updates.value()」を設定する

評価の処理は、「accuracy」や「precision」も求めることが出来ます。

names_to_values, names_to_updates = slim.metrics.aggregate_metric_map({
    'accuracy': slim.metrics.accuracy(predictions, labels),
    'precision': slim.metrics.precision(predictions, labels),
    'recall': slim.metrics.recall(mean_relative_errors, 0.3),
})

「predictions」と「labels」

比較評価を行いますので、同じ型である必要があります。
また、評価の種類によっては、型の指定があります。

【例】「accuracy」の場合は、bool/integer/stringのみとなります
【例】「precision」「recall」の場合は、強制的にboolにキャストされます

summary_op

評価処理を行った結果を出力する処理になります。
前述の「value_ops」や「names_to_values」を利用します。
※ここでは「names_to_values」の方を使用します

summary_ops = []
for metric_name, metric_value in names_to_values.items():
  op = tf.summary.scalar(metric_name, metric_value)
  op = tf.Print(op, [metric_value], metric_name)
  summary_ops.append(op)

評価処理の結果を順番に出力します。
まずprotocol buffer形式で、サマリーにラベル名と値を出力します。
次に、同様にラベル名と値を標準出力に表示します。

おまけ

TensorFlow-SlimのGitHubに、詳しい情報が載っていますが、残念ながらPython2ベースのため、ところどころPython3に変換してあげる必要があります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?