Пользовательская функция потерь Keras со скрытым выводом слоя - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь создать собственный убыток в Керасе, для расчета которого необходим вывод скрытого слоя. Я не хочу использовать конкатенацию этого скрытого выходного слоя и слоя прогнозирования как 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.

Я использую:

  • тензор потока [2.0.0]
  • Керас [2.3.1]

I проверил и проблема в layer.output. Кто-нибудь знает как это исправить?

...