2016-07-20 59 views
5

我正在處理非常嘈雜的數據,偶爾會出現異常值,所以我主要依靠相關性來衡量NN中的準確性。可以使用Rank Correlation作爲TensorFlow中的成本函數嗎?

是否有可能明確使用像秩相關(斯皮爾曼相關係數)作爲我的成本函數?到目前爲止,我主要依靠MSE作爲相關性的代理。

我現在所擁有的三大絆腳石:

1)排名的概念變成了迷你批次,更加模糊。

2)您如何動態執行排名? TensorFlow是否沒有梯度誤差/無法追蹤重量/偏差的變化如何影響成本?

3)如何確定運行期間張量的大小?

例如,下面的代碼是我想粗略地做的,如果我只是使用相關性。實際上,長度需要通過而不是在運行時確定。

length = tf.shape(x)[1] ## Example code. This line not meant to work. 

original_loss = -1 * length * tf.reduce_sum(tf.mul(x, y)) - (tf.reduce_sum(x) * tf.reduce_sum(y)) 
divisor = tf.sqrt(
    (length * tf.reduce_sum(tf.square(x)) - tf.square(tf.reduce_sum(x))) * 
    (length * tf.reduce_sum(tf.square(y)) - tf.square(tf.reduce_sum(y))) 
) 
original_loss = tf.truediv(original_loss, divisor) 

回答

1

下面是Spearman相關代碼:

predictions_rank = tf.nn.top_k(predictions_batch, k=samples, sorted=True, name='prediction_rank').indices 
real_rank = tf.nn.top_k(real_outputs_batch, k=samples, sorted=True, name='real_rank').indices 
rank_diffs = predictions_rank - real_rank 
rank_diffs_squared_sum = tf.reduce_sum(rank_diffs * rank_diffs) 
six = tf.constant(6) 
one = tf.constant(1.0) 
numerator = tf.cast(six * rank_diffs_squared_sum, dtype=tf.float32) 
divider = tf.cast(samples * samples * samples - samples, dtype=tf.float32) 
spearman_batch = one - numerator/divider 

與Spearman相關的問題是,你需要使用(在我的代碼top_k)排序算法。無法將其轉化爲損失價值。沒有衍生的排序算法。您可以使用正常的相關性,但我認爲使用均方誤差沒有數學差異。

我現在正在爲圖像工作。我在他們用來將排名添加到損失函數中的論文中讀到的內容是比較2或3個圖像(我說圖像可以說你想排名的任何東西)。

比較兩個元素:

enter image description here

enter image description here

其中N是元件的總數,α的裕度的值。我得到這個方程從Photo Aesthetics Ranking Network with Attributes and Content Adaptation

您還可以使用3個elemens,你比較兩個人與另一個具有不同的一個類似的排名損失:

enter image description here

但是在這個等式中還需要添加排名方向,更多詳情請見Will People Like Your Image?。在本文中,他們使用向量編碼而不是實際值,但您也可以只使用一個數字。

在圖像的情況下,當這些圖像相關時,圖像之間的比較更有意義。因此,運行聚類算法以創建(可能?)10個羣集是個好主意,因此您可以使用同一個羣集的元素進行比較,而不是進行非常不同的事情。這將有助於網絡作爲輸入相關聯,而不是完全不同。

作爲一個便箋,你應該知道什麼對你更重要,如果它是最終排名或排名值。如果這是你應該使用均方誤差的價值,如果它是排名順序,你可以使用我之前寫的損失。或者你甚至可以把它們合併。

如何確定運行期間張量的大小?

tf.shape(tensor)返回形狀的張量。然後你可以使用tf.gather(tensor,index)來獲得你想要的值。

+0

我在嘗試複製使用Spearman Correlations作爲評估指標的圖像評估網絡。針對小批量運行Spearman相關性有意義嗎?如果是這樣,你如何彙總結果以獲得最終數字? – michael

+0

@michael從小批量到完整的數據集,我得到了非常不同的結果。它可能會給你一些關於趨勢的見解,但不能告訴你最終的價值。你不能聚合小批量的結果來計算最終的結果,你必須使用整個數據集(我使用普通的Python代碼)。 – jorgemf

+0

這是我的猜測,但我不是這個話題的專家。謝謝。 – michael

相關問題