Обертка функции потери работает в keras, но не с tf.keras - PullRequest
0 голосов
/ 12 июля 2020

Я строю сетевую архитектуру, в которой мне нужен вывод слоя в функции потерь. Для этого я оборачиваю свою пользовательскую функцию потерь, чтобы передать слой в качестве дополнительного параметра. Моя функция потерь выглядит так:

def loss_wrapper(weights):
    def custom_loss(y_true, y_pred):
        return ((y_true - y_pred) ** 2) / weights # dummy formula

Теперь, используя эту потерю в простой архитектуре, например:

inputs = Input(shape=(2, 1))
x = LSTM(5, return_sequences=True, activation="tanh")(inputs)
x1 = Dense(3, activation='relu')(x)
x2 = Dense(1, activation='relu')(x1)

loss = loss_wrapper(x1)
model = Model(inputs, x2)
model.compile(loss=loss, optimizer="adam")
model.fit(dataset, steps_per_epoch=1000, epochs=10)

Этот код хорошо работает с прямым использованием keras. При выполнении того же кода с использованием материала tf.keras возникает эта ошибка при выполнении метода подгонки:

TypeError: An op outside of the function building code is being passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.init_scope in your function building code.

_SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found 
[<tf.Tensor 'dense_0/Identity:0' shape=(None, 2, 3) dtype=float32>]

Также не работает аннотирование обернутой функции потерь с помощью tf.function.

Tensor tf.Tensor 'density_0 / Identity: 0 - это тензор, переданный как параметр функции потерь. Как следует изменить функцию потерь, чтобы принять этот ввод?

Есть ли какие-либо другие обходные пути в TF 2.1 / 2.2 вместо обертывания функции потерь? Я хочу избежать хакерского подхода, объединяющего слой x1 с выводом и дальнейшего разделения его от y_pred.

...