Как оптимизировать функции множественных потерь отдельно в Keras? - PullRequest
0 голосов
/ 04 октября 2019

В настоящее время я пытаюсь построить модель глубокого обучения с тремя различными функциями потерь в Керасе. Первая функция потерь - это типичная среднеквадратичная потеря ошибок. Две другие функции потерь - это те, которые я построил сам, который находит разницу между вычислениями, сделанными из входного изображения и выходного изображения (этот код является упрощенной версией того, что я делаю).

def p_autoencoder_loss(yTrue,yPred):

    def loss(yTrue, y_Pred):
       return K.mean(K.square(yTrue - yPred), axis=-1)

    def a(image):
       return K.mean(K.sin(image))

    def b(image):
       return K.sqrt(K.cos(image))


a_pred = a(yPred)
a_true = a(yTrue)

b_pred = b(yPred)
b_true = b(yTrue)

empirical_loss = (loss(yTrue, yPred))
a_loss = K.mean(K.square(a_true - a_pred))
b_loss = K.mean(K.square(b_true - b_pred))
final_loss = K.mean(empirical_loss + a_loss + b_loss)
return final_loss

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

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

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

У вас может быть 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, ноэто довольно высокий уровень, и я не знаю другого способа использования чистых керасов. Надеюсь, кто-нибудь может поправить меня с лучшим решением!

0 голосов
/ 04 октября 2019

Поскольку имеется только один выход, несколько вещей, которые можно сделать:

1. Мониторинг отдельных компонентов потерь, чтобы увидеть, как они изменяются.

def a_loss(y_true, y_pred):
    a_pred = a(yPred)
    a_true = a(yTrue)   
    return K.mean(K.square(a_true - a_pred))

model.compile(....metrics=[...a_loss,b_loss])

2. Взвесьте компоненты потерь, где lambda_a & lambda_b - гиперпараметры.

final_loss = K.mean(empirical_loss + lambda_a * a_loss + lambda_b * b_loss)
Используйте другую функцию потерь, такую ​​как SSIM.

https://www.tensorflow.org/api_docs/python/tf/image/ssim

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...