Keras 实现自定义损失函数,最大化关键帧和非关键帧之间的KL差异

Keras 实现自定义损失函数,最大化关键帧和非关键帧之间的KL差异,keras,backend,loss-function,Keras,Backend,Loss Function,据我所知,训练神经网络最常用的方法是最小化数据分布和模型分布输出之间的KL发散,从而最小化交叉熵。现在假设我们有一个二元分类任务,我们的目标是优化网络,使两类分布之间的KL差异最大化。我有一个应用程序需要最大化两类分布之间的KL差异。我在keras中实现了一个自定义损失函数,但出现了以下错误。有没有更好的方法来实现这个功能 ValueError: No gradients provided for any variable: ['dense/kernel:0', 'dense/bias:0',

据我所知,训练神经网络最常用的方法是最小化数据分布和模型分布输出之间的KL发散,从而最小化交叉熵。现在假设我们有一个二元分类任务,我们的目标是优化网络,使两类分布之间的KL差异最大化。我有一个应用程序需要最大化两类分布之间的KL差异。我在keras中实现了一个自定义损失函数,但出现了以下错误。有没有更好的方法来实现这个功能

ValueError: No gradients provided for any variable: ['dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0', 'dense_2/kernel:0', 'dense_2/bias:0'].


def loss(y_true,y_pred):

      y_true=K.flatten(y_true)
      y_pred=K.flatten(y_pred)

      p_1=K.cast(K.greater(y_true*y_pred,0.5), K.floatx())
      p_1=K.sum(p_1)

      p_0=K.cast(K.greater(y_true*y_pred,K.epsilon()), K.floatx())
      p_0=K.sum(p_0)-p_1

      q_1=K.cast(K.greater((1-y_true)*y_pred,0.5), K.floatx())
      q_1=K.sum(q_1)

      q_0=K.cast(K.greater((1-y_true)*y_pred,K.epsilon()), K.floatx())
      q_0=K.sum(q_0)-q_1

      p_total=p_0+p_1
      q_total=q_0+q_1

      p_0=p_0/p_total
      p_1=p_1/p_total
      q_0=q_0/q_total
      q_1=q_1/q_total

      return 0-(p_0*K.log(p_0/q_0)+p_1*K.log(p_1/q_1))