tf.metricsとtf.contrib.slim.metricsを正しく理解しているかどうかわかりません。tf.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()), ...)
するのは、私は精度を計算したいとしましょう:
は、ここでプログラムの一般的な流れです。私は2つの選択肢があります: 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から得られる精度は、すでにすべてのバッチで計算されているためia the 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回呼び出されますか?
ありがとうございました!
複数のエポックで動作させるとどうなりますか?変数をリセットする必要はありますか? tf.slimはそれを世話していますか? acc = tf.equals(ラベル*重み、予測)/tf.reduce_sum(重み) – user667804
複数のエポックを実行すると、ちょうど現在のエポック。私はスリムがあなたのためにそれを世話するとは思わない。これらのメトリックは、トレーニング中ではなく評価中に使用されることを意図しています。 –
私はslim.evaluation.evaluate_loop関数を使用しています。この関数は、利用可能になるとすぐに新しいチェックポイントを読み込みます。私はそれもカウンターをリセットすると思いますか? – user667804