私はこの損失関数を実装しようとしています: MCFD_loss_function このドキュメント(P6)から: 損失関数
だから私はこのような新しい関数を作成しました:
def mcfd_loss(y_true, y_pred):
return K.sum( # ∑
K.cast(
K.greater( # only values greater than 0 (+ float32 cast)
K.dot(K.sign(y_pred), # π
K.sign(y_true))
, 0)
, 'float32')
)
しかし、トレーニングを開始すると、このエラーが発生します:
ValueError:操作には勾配の
None
があります。すべての操作に勾配が定義されていることを確認してください(つまり、微分可能です)。勾配なしの一般的な操作:K.argmax、K.round、K.eval。
どの点を見逃したのかわかりません。より大きな機能を使用しているため、エラーが発生しているようです。このエラーの意味と問題の修正方法がわかりません。
ありがとう。
損失関数で、sign(f_(t,1))*sign(Y_(t+1))
が0より大きいかどうかをチェックする必要があります。sign
は0で微分できないため、代わりにsoftsign
を使用することをお勧めします。
大なり関数も微分できないため、次の近似を使用できます( here を参照)。maxϵ(x,y):= 0.5(x + y + absϵ(x − y))
、ここでabsϵ(x):=sqrt(x^2 + ϵ)
およびϵ > 0
。簡単にするために、以下のコード例ではこの近似値をgreater_approx
と呼びます。 (注意、上記の計算を挿入するだけです)
損失関数の定義を見ると、合計を予測数(K.get_variable_shape(y_pred)[0]
)で割る必要があります(マイナスも追加します)。 P
は、 時系列予測論文の損失関数 に従う予測の数に対応します。
損失関数はすべて次のようになります。
def mcfd_loss(y_true, y_pred):
return - (1/K.get_variable_shape(y_pred)[0]) * K.sum( # ∑
K.cast(
greater_approx( # only values greater than 0 (+ float32 cast)
K.dot(K.softsign(y_pred), # π
K.softsign(y_true))
, 0)
, 'float32')
)
最後のコメント:Kerasチェックアウトでカスタム損失関数を使用する場合、この SOの質問