具有隐藏层输出的Keras自定义损失功能

时间:2020-02-11 14:08:02

标签: python tensorflow keras loss-function

我正在尝试在Keras中创建自定义损失,该损失需要隐藏层的输出来计算损失。我不想将此隐藏层输出和预测层的连接用作y_pred,一旦它会更改Keras使用的常规方式。当我在没有output_layer的情况下进行测试时,我的代码可以正常运行,尽管在运行时会出现异常。下面是我的代码和例外。

我有以下自定义损失:

class MyLoss(LossFunctionWrapper):

    def my_calculation_function(y_pred, y_true, output_layer)
        ... # All functions are differentiable

    def loss(self, y_true, y_pred, output_layer):
        return my_calculation_function(y_pred, y_true, output_layer)

    def __init__(self,
                 layer,
                 reduction=losses_utils.Reduction.SUM_OVER_BATCH_SIZE,
                 name='d_loss'):
        super(MyLoss, self).__init__(self.loss, name=name, reduction=reduction, output_layer=layer.output)

我这样使用:

model.compile(optimizer='adam', loss=MyLoss(layer), metrics=['accuracy'])

运行代码时,收到以下错误消息:

ValueError: An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

我正在使用:

  • tensorflow [2.0.0]
  • 凯拉斯[2.3.1]

我已经检查过,问题出在layer.output上。有人知道如何解决这个问题吗?

0 个答案:

没有答案