2017-08-15 96 views
0

我不確定是否正確理解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的輸出相匹配?

最後,如果我添加兩次相同的更新操作,它會被調用兩次嗎?

謝謝!

回答

0

是的,細流精確計算整個數據集中每批處理精度的平均值(如果只有一個時期)。

爲了您的準確性功能,它取決於你如何實現它。

+0

如果我讓它運行多個時代會發生什麼?我需要重置變量嗎? tf.slim是否爲我照顧? 精度實現爲一個簡單的: acc = tf.equals(標號*權重,預測)/tf.reduce_sum(權重) – user667804

+0

如果您運行多個曆元,您將獲得所有曆元的平均值,而不是平均值只是當前的時代。我不認爲苗條爲你照顧;這些指標旨在用於評估而不是培訓。 –

+0

我正在使用slim.evaluation.evaluate_loop函數,該函數一旦可用就加載新的檢查點。我想它也會重設櫃臺呢? – user667804