Keras множественный вывод: пользовательская функция потерь
Я использую модель с несколькими выходами в Керасе
model1 = Model(input=x, output=[y2,y3])
model1.compile((optimizer='sgd', loss=cutom_loss_function)
мой custom_loss_function
является;
def custom_loss(y_true, y_pred):
y2_pred = y_pred[0]
y2_true = y_true[0]
loss = K.mean(K.square(y2_true - y2_pred), axis=-1)
return loss
Я только хочу обучить сеть на выходе y2
,
Какова форма / структура y_pred
а также y_true
аргумент в функции потерь при использовании нескольких выходов? Могу ли я получить к ним доступ, как указано выше? Это y_pred[0]
или же y_pred[:,0]
?
3 ответа
Я только хочу обучить сеть на выходе у2.
На основе функционального руководства API Keras вы можете достичь этого с
model1 = Model(input=x, output=[y2,y3])
model1.compile(optimizer='sgd', loss=custom_loss_function,
loss_weights=[1., 0.0])
Какова форма / структура аргумента y_pred и y_true в функции потерь при использовании нескольких выходов? Могу ли я получить к ним доступ, как указано выше? Это y_pred[0] или y_pred[:,0]
В керас-моделях с несколькими выходами функция потерь применяется для каждого выхода отдельно. В псевдокоде:
loss = sum( [ loss_function( output_true, output_pred ) for ( output_true, output_pred ) in zip( outputs_data, outputs_model ) ] )
Функциональность для выполнения функции потерь на нескольких выходах кажется мне недоступной. Вероятно, этого можно добиться, включив функцию потерь в качестве слоя сети.
Принятый ответ в целом не будет работать, если пользовательская потеря не может быть применена к выходным данным, которые вы пытаетесь игнорировать, например, если они имеют неправильную форму. В этом случае вы можете назначить фиктивную функцию потерь для этих выходов:
labels = [labels_for_relevant_output, dummy_labels_for_ignored_output]
def dummy_loss(y_true, y_pred):
return 0.0
model.compile(loss = [custom_loss_function, dummy_loss])
model.fit(x, labels)
Ответ Шараполаса правильный.
Однако есть лучший способ, чем использовать слой для построения пользовательских функций потерь со сложной взаимозависимостью нескольких выходных данных модели.
Метод, который я знаю, используется на практике - никогда не вызывать model.compile, а только model._make_predict_function(). После этого вы можете продолжить и создать собственный метод оптимизатора, вызвав там модель.output. Это даст вам все выходные данные, [y2,y3] в вашем случае. Делая с ним свою магию, возьмите keras.optimizer и используйте его метод get_update, используя ваш model.trainable_weights и ваш проигрыш. Наконец, верните функцию keras.f со списком необходимых входных данных (в вашем случае только model.input) и обновления, которые вы только что получили из вызова optimizer.get_update. Эта функция теперь заменяет model.fit.
Вышеуказанное часто используется в алгоритмах PolicyGradient, таких как A3C или PPO. Вот пример того, что я пытался объяснить: https://github.com/Hyeokreal/Actor-Critic-Continuous-Keras/blob/master/a2c_continuous.py Посмотрите на методы build_model и crit_optimizer и прочитайте документацию kreas.backend.function. чтобы понять, что происходит.
Я обнаружил, что у этого способа часто бывают проблемы с управлением сессиями, и в настоящее время он не работает в tf-2.0 keras вообще. Следовательно, если кто-нибудь знает метод, пожалуйста, дайте мне знать. Я пришел сюда в поисках одного:)