我正在尝试在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.
我正在使用:
我已经检查过,问题出在layer.output上。有人知道如何解决这个问题吗?