У вас может быть 3 выхода в вашей модели keras, каждый с указанными вами потерями, а затем у keras есть поддержка для взвешивания этих потерь. Затем он также сгенерирует итоговые комбинированные потери для вас в выходных данных, но он будет оптимизирован для уменьшения всех трех потерь. Будьте осторожны с этим, хотя, в зависимости от ваших данных / проблем / потерь, вы можете обнаружить, что он немного останавливается или работает медленно, если у вас есть потери, сражающиеся друг с другом. Однако это требует использования функционального API . Я не уверен относительно того, реализует ли это на самом деле отдельные экземпляры оптимизатора, однако я думаю, что это настолько близко, насколько это возможно, к чистым Керасам, о которых я знаю, без необходимости начинать писать более сложные режимы обучения TF.
Например:
loss_out1 = layers.Dense(1, activation='sigmoid', name='loss1')(x)
loss_out2 = layers.Dense(1, activation='sigmoid', name='loss2')(x)
loss_out3 = layers.Dense(1, activation='sigmoid', name='loss3')(x)
model = keras.Model(inputs=[input],
outputs=[loss1, loss2, loss3])
model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
loss=['binary_crossentropy', 'categorical_crossentropy', 'custom_loss1],
loss_weights=[1., 1., 1.])
Это должно скомпилировать модель с 3 выходами в конце из (x), который был бы выше. При компиляции вы устанавливаете выходные данные в виде списка, а также устанавливаете потери и веса потерь в виде списка. Обратите внимание, что когда вы подгоняете (), вам нужно будет предоставить целевые выходы три раза в виде списка, например, [y, y, y]
, поскольку ваша модель теперь имеет три выхода.
Я не эксперт по Keras, ноэто довольно высокий уровень, и я не знаю другого способа использования чистых керасов. Надеюсь, кто-нибудь может поправить меня с лучшим решением!