我不確定是否正確理解tf.metrics和tf.contrib.slim.metrics。瞭解tf.metrics和slims streaming metric
下面是該程序的一般流程:
# 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)計算一張圖像中所有像素的精度,並取所有批次中所有圖像的所有精度的平均值。
對於版本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獲得的準確度已經在所有批次v ia 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的輸出相匹配?
最後,如果我添加兩次相同的更新操作,它會被調用兩次嗎?
謝謝!
如果我讓它運行多個時代會發生什麼?我需要重置變量嗎? tf.slim是否爲我照顧? 精度實現爲一個簡單的: acc = tf.equals(標號*權重,預測)/tf.reduce_sum(權重) – user667804
如果您運行多個曆元,您將獲得所有曆元的平均值,而不是平均值只是當前的時代。我不認爲苗條爲你照顧;這些指標旨在用於評估而不是培訓。 –
我正在使用slim.evaluation.evaluate_loop函數,該函數一旦可用就加載新的檢查點。我想它也會重設櫃臺呢? – user667804