Как мне указать модели, что принимать в качестве входных данных пользовательской функции потерь?

#python #tensorflow #keras #deep-learning #loss-function

#python #тензорный поток #keras #глубокое обучение #функция потерь

Вопрос:

У меня возникли проблемы с пониманием / внедрением пользовательской функции потерь в моей модели.

У меня есть модель keras, которая состоит из 3 подмоделей, как вы можете видеть здесь, в архитектуре модели,

архитектура модели

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

     def custom_mse(y_true, y_pred):
        *calculate stuff*
    return loss
 

Но как мне сказать модели, чтобы она использовала свои 2 выхода в качестве входных данных функции потерь?

Может быть, и я на это надеюсь, это очень тривиально, но я ничего не нашел в Интернете, если бы вы могли мне помочь, это было бы фантастически.

Заранее спасибо

контекст модели
: и model_2 — это одна и та же предварительно подготовленная модель, двоичный классификатор, который предсказывает взаимодействие между 2 входами (типа, подобного изображению). model_1 — это генеративная модель, которая будет редактировать один из входных данных.

Поэтому:

     complete_model = Model(inputs=[input_1, input_2], outputs=[out_model, out_model2])
    opt = *an optimizer*
    
    complete_model.compile(loss=custom_mse,
                           ??????,
                           optimizer = opt,
                           metrics=['whatever'])
 

Основная цель — сравнить прогноз с отредактированным вводом с тем, с неотредактированным вводом, поэтому модель выведет 2 взаимодействия, которые мне нужно использовать в функции потерь.

РЕДАКТИРОВАТЬ: Спасибо, Андрей, за решение,

Теперь, однако, мне не удается реализовать вместе 2 функции потерь, а именно функцию с add_loss(func) и классическую binary_crossentropy в model.complie(loss=’binary_crossentropy’, …).

Могу ли я добавить add_loss, указывающий model_2.output и метку? Если да, знаете ли вы, как это сделать?

Они работают сами по себе, но не вместе, когда я пытаюсь запустить код, который они вызывают

ValueError: Shapes must be equal rank, but are 0 and 4 From merging shape 0 with other shapes. for '{{node AddN}} = AddN[N=2, T=DT_FLOAT](binary_crossentropy/weighted_loss/value, complete_model/generator/tf_op_layer_SquaredDifference_3/SquaredDifference_3)' with input shapes: [], [?,500,400,1].

Ответ №1:

Вы можете добавить потери compile() только для стандартной подписи функции потерь (y_true, y_pred). Вы не можете его использовать, потому что ваша подпись выглядит примерно так (y_true, (y_pred1, y_pred2)) . add_loss() Вместо этого используйте API. Смотрите здесь: https://keras.io/api/losses /