我使用 Keras 后端函數編寫了 huber loss,效果很好:def huber_loss(y_true, y_pred, clip_delta=1.0): error = y_true - y_pred cond = K.abs(error) < clip_delta squared_loss = 0.5 * K.square(error) linear_loss = clip_delta * (K.abs(error) - 0.5 * clip_delta) return tf_where(cond, squared_loss, linear_loss)但我需要一個更復雜的損失函數:如果error <= A,使用squared_loss如果A <= error < B,使用線性損失如果error >= B,使用sqrt_loss我是這樣寫的:def best_loss(y_true, y_pred, A, B): error = K.abs(y_true - y_pred) cond = error <= A cond2 = tf_logical_and(A < error, error <= B) squared_loss = 0.5 * K.square(error) linear_loss = A * (error - 0.5 * A) sqrt_loss = A * np.sqrt(B) * K.sqrt(error) - 0.5 * A**2 return tf_where(cond, squared_loss, tf_where(cond2, linear_loss, sqrt_loss))但是不行,用這個損失函數的模型不收斂,有什么bug?
1 回答

呼喚遠方
TA貢獻1856條經驗 獲得超11個贊
我喜歡通過使用像 Desmos 這樣的程序繪制自定義函數的圖形來調試它們。我使用您的實現繪制了 Huber 損失圖,它看起來應該是這樣的。
當我嘗試繪制第二個函數的圖表時,它看起來也像是一個有效的損失函數。唯一的問題是當 B 小于 A 時。如果 B 的值大于 A,那么損失函數應該不會有問題。如果這不是問題,那么您可以嘗試在目標和輸出之間切換減法,因為我不熟悉張量流如何處理微分,但順序會影響梯度的方向。
添加回答
舉報
0/150
提交
取消