web-dev-qa-db-ja.com

Kerasカスタム損失の実装:ValueError:操作には勾配の `None`があります

私はこの損失関数を実装しようとしています: 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。

どの点を見逃したのかわかりません。より大きな機能を使用しているため、エラーが発生しているようです。このエラーの意味と問題の修正方法がわかりません。

ありがとう。

12

損失関数で、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の質問

1
Simdi