簡體   English   中英

如何在keras損失函數中使用tf.nn.top_k?

[英]How to use tf.nn.top_k in a keras loss function?

我有一些問題,使得這個自定義損失函數(它會檢查是否y_pred數據與所提供的實際訂貨指數連貫有序y_true )工作:

def custom_objective(y_true, y_pred):
    y_true = tf.cast(y_true, tf.float32)
    ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32)
    return tf.sqrt(tf.reduce_mean(tf.square(ordered_output - y_true), axis=-1))

我可以使用示例數據正確運行它:

with tf.Session() as sess:
    print(custom_objective(tf.constant([0, 1, 2, 3, 4, 5]), 
                           tf.constant([0.0, 0.9, 0.2, 0.3, 0.5, 0.8])).eval())  # 1.82574

但是以某種方式,如果我在model.compile使用它, model.compile ,因為它引發了:

/Users/luca/.virtualenvs/python3/lib/python3.6/site-packages/tensorflow/python/framework/tensor_util.py in make_tensor_proto(values, dtype, shape, verify_shape)
    358   else:
    359     if values is None:
--> 360       raise ValueError("None values not supported.")
    361     # if dtype is provided, forces numpy array to be the type
    362     # provided if possible.

ValueError: None values not supported.

請注意,有在我的訓練測試集沒有“無”的值,如果我改變ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32)ordered_output = -y_pred的模型可以正常編譯並開始正確訓練(但顯然不是我想要的損失函數)。

我有一種微妙的感覺,在損失函數中使用top_k可能會出錯,因為我看不到它如何可微,但是我沒有更好的主意來評估預測順序的差異。 提示/創意/紙/引用? :)

這可能會被否決,因為我不會真正修復您的代碼,但是什么也沒做:

我確實不相信您可以將top_k用作目標函數。 就像您不能將精度用作目標函數一樣。

原因是數學上的。 即使keras,tensorflow,theano和co。 是AI的絕佳工具,可讓每個人都玩弄神經網絡,而神經網絡仍然是非常復雜的數學工具。 這些數學知識隱藏在幕后,但是當您嘗試使用比預制工具更進一步的方法時,您應該意識到它們。

訓練網絡時,發生的事情是您計算示例中網絡的錯誤率,並向后傳播該錯誤以從中學習。 反向傳播背后的算法是優化器,更確切地說,它們是基於梯度的優化器。 計算梯度需要區分我們正在優化的函數(損失/目標函數)。 這意味着目標必須是可區分的 精度不是微分函數,它以0到1之間的一個實數作為輸入,並輸出一個類似階梯的函數:x <0.5時為0,x> 0.5時為1。 該函數不可微,因為我們無法在0.5中獲得其梯度。 top_k函數是某種精度函數。 因此我認為確實不能在客觀上使用它,因為在后台,智能張量流必須計算函數的梯度。

我希望這有幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM