#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 /