У меня следующая проблема:
У меня есть последовательный NN для выполнения регрессии для конкретной c проблемы. Мой вход - 5-D массив, мой выход - 6-D массив. Моя обычная функция потерь - это просто MSE на разность (y_pred - y_true).
Теперь у меня есть это свойство: 1-й элемент выходного вектора (т.е. y_pred [:, 0]), умноженный на 1-й элемент входного вектора (то есть x [:, 0]) ограничен сверху константой K. Таким образом, мне нужно добавить штраф к моей функции потерь, что-то вроде: (1 / n) * || y_pred [:, 0] * x [:, 0] - K ||.
Я создал свою оболочку для пользовательской функции потерь, чтобы иметь возможность использовать входные значения:
def custom_loss_wrapper(input_train):
def custom_loss(y_true, y_pred):
return K.mean(K.square(y_true - y_pred)) + K.mean(K.square(input_train))
return custom_loss
Здесь я просто использовал MSE на входе для простоты, но следующий результат тот же!
Проблема в том, что, когда я пытаюсь вставить вычисление с input_train, во время подгонки модели I получить эту ошибку:
Входные данные для активной функции исполнения не могут быть символами Keras c тензорами, но найдены [ ]
Теперь я обнаружил, что могу использовать следующее, чтобы не было этой проблемы:
tf.config.experimental_run_functions_eagerly(True)
Но если я сделаю это, ошибка станет:
NotImplementedError: Невозможно преобразовать символ c Tensor (truediv_65: 0) в массив numpy.
ТАК, что я мог сделать, чтобы использовать свою пользовательскую функцию потерь?