tf.metrics と tf.contrib.slim.metrics を正しく理解しているかどうかわかりません。
プログラムの大まかな流れは次のとおりです。
# Setup of the neural network...
# Adding some metrics
dict_metrics[name] = compute_metric_and_update_op()
# Getting a list of all metrics and updates
names_to_values, names_to_updates = slim.metrics.aggregate_metric_map(dict_metrics)
# Calling tf.slim evaluate
slim.evaluation.evaluation_loop(eval_op=list(names_to_updates.values()), ...)
精度を計算したいとしましょう。a) すべてのバッチのすべての画像のすべてのピクセルの精度を計算する b) 1 つの画像のすべてのピクセルの精度を計算し、すべてのバッチのすべての画像のすべての精度の平均をとります。
バージョンa)の場合、これは私が書くものです:
name = "slim/accuracy_metric"
dict_metrics[name] = slim.metrics.streaming_accuracy(
labels, predictions, weights=weights, name=name)
これは次と同等でなければなりません:
name = "accuracy_metric"
accuracy, update_op = tf.metrics.accuracy(
labels, predictions, weights=weights, name=name)
dict_metrics[name] = (accuracy, update_op)
さらに、この行を追加することは無意味または間違っているはずです
dict_metrics["stream/" + name] = slim.metrics.streaming_mean(accuracy)
tf.metrics.accuracy から取得した精度は、update_op を介してすべてのバッチで既に計算されているためです。正しい?
オプション b) を使用すると、次のような効果が得られます。
accuracy = my_own_compute_accuracy(labels, predictions)
dict_metrics["stream/accuracy_own"] = \
slim.metrics.streaming_mean(accuracy)
my_own_compute_accuracy() は、ラベルと予測テンソルのシンボリック精度を計算しますが、更新操作は返しません。実際、このバージョンでは、単一の画像または単一のバッチに対して精度が計算されますか? 基本的に、バッチ サイズを完全なデータセットのサイズに設定すると、このメトリクスは slim.metrics.streaming_accuracy の出力と一致しますか?
最後に、同じ更新操作を 2 回追加すると、2 回呼び出されますか?
ありがとうございました!