Как правильно реализовать «бесполезную потерю» с помощью Keras? - PullRequest
1 голос
/ 25 сентября 2019

У меня есть модель Keras, которая имеет два выхода:

  • output - это истинный выход сети, в которой будет рассчитываться потеря

  • additional используется для выполнения внешней задачи во время логического вывода (с этим выводом не следует рассчитывать потери)

Когда я строю модель, я пишу что-то вродечто:

model = Model(inputs=inp, outputs=[output, additional])

Поскольку у моего Model есть два выхода, мне нужно обеспечить две потери при компиляции модели, чтобы я создал бесполезную потерю, подобную этой:

class NoopLoss(object):

    def __call__(self, y_true, y_pred, **kwargs):
        return self.compute_loss(y_true, y_pred)

    def compute_loss(self, y_true, y_pred):
        return tf.math.square(0.0)

Какой яинтегрировать на этапе компиляции следующим образом:

loss = UsefulLoss()  # the real loss I'm using
noop_loss = NoopLoss()

model.compile(loss=[loss, noop_loss], optimizer=optimizer, metrics=['binary_accuracy'])

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

1 Ответ

1 голос
/ 25 сентября 2019

По моему мнению, Керас не задумывался над такими вещами.
Я тоже часто использую эти хаки.

Но, не будучи уверенным, что это лучшее решение, на самом деле это может быть и не так, вы можете создать модель обучения и модель логического вывода, совместно используя обучаемую часть:

inputs = Input(...)
trainable_out = SomeLayer(...)(inputs)
....
trainable_out = ....

extra_output = SomeLayer(...)(something)    

training_model = Model(inputs, trainable_out)
inference_model = Model(inputs, [trainable_out, extra_output])   

Вы можете тренироватьсяtraining_model и автоматически будет обучена и другая модель.

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