[英]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.