Модель с несколькими выходами с пользовательскими потерями, содержащая зависимости от других выходов и других данных

У меня есть модель с несколькими выходами, потери для каждого выхода могут зависеть от одного из других выходов, а также от некоторых масок, вычисленных по данным. Общая потеря модели представляет собой взвешенную сумму над потерями.

Моя модель подкласса tf.keras.Model и я пытаюсь написать чистый код, который я могу использовать с compile и fit . Я хотел бы, чтобы веса потерь были даны во время компиляции.

Один из способов решения проблемы зависимостей потерь (после прочтения некоторой документации и этого ответа ) состоит в том, чтобы подавать данные типа масок в качестве входных данных модели и, при реализации call , добавлять потери каждого выходного сигнала с помощью Model.add_loss . Может кто-нибудь подтвердить мне это? Как мне получить y_true оттуда?

Если это хорошее решение, как мне указать, что общая потеря модели представляет собой взвешенную сумму этих потерь во время compile , как я могу получить к ним доступ?

Также было бы лучше использовать add_loss на каждом слое при реализации call модели? Тот же вопрос, как мне получить к ним доступ во время compile ?

Если это не было хорошим решением, что является хорошим?

import tensorflow as tf

class MyModel(tf.keras.Model):

    def __init__(self, base_trainable=False, feature_extractor=None, n=4, *kwargs):
        super(MyModel, self).__init__(*kwargs)
        if feature_extractor:
            self.feature_extractor = feature_extractor
        else:
            feature_extractor = tf.keras.applications.Resnet101(include_top=False,
                                                                weights='imagenet',
                                                                trainable=base_trainable)

        self.out1 = layers.Conv2D(n, kernel_size=(1,1), activation='sigmoid', name='out1')
        self.out2 = layers.Conv2D(n, kernel_size=(1,1), name='out2')
        self.out3 = layers.Conv2D(2*n, kernel_size=(1,1), 'out3')

    def call(self, inputs):
        img, mask1, mask2 = inputs
        x = self.feature_extractor(img)
        out1 = self.out1(x)
        out2 = self.out2(x)
        out3 = self.out3(x)
        # compute losses for each output? (but how do I access to each y_true?...)
        # ex:
        # 
        # model.add_loss(my_loss_for_out1(y1_true??
        #                                 out1,
        #                                 out2))
        # model.add_loss(my_loss_for_out1(y2_true??
        #                                 out2,
        #                                 mask1))
        # model.add_loss(my_loss_for_out1(y3_true??
        #                                 out3,
        #                                 mask2))


        return out1, out2, out3

model = MyModel()

model.compile(loss=???
              loss_weights=???)

Спасибо

Всего 1 ответ


Вам нужно поставить имя для выходных слоев, а затем использовать имя для подключения вывода к правильной функции потерь, например:

output_1 = SoftmaxLayer(X, name="output_1")
output_2 = SoftmaxLayer(X, name="output_2")    
model = Model(inputs=input, outputs=[output_1, output_2])    
losses = {
        "output_1": fun_1,
        "output_2": fun_2
    }

lossWeights = {"output_1": alpha, "output_2": beta}

model.compile(optimizer=opt, loss=losses, metrics=["acc"], loss_weights=lossWeights)

Есть идеи?

10000