用Keras实施“无用损失”的正确方法是什么?

时间:2019-09-25 13:54:34

标签: tensorflow keras

我有一个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 个答案:

答案 0 :(得分:1)

我认为Keras没有考虑过这样的事情。
我也经常自己使用这些技巧。

但是,不确定是不是更好的解决方案,实际上可能不是,您可以创建训练模型和推理模型,两者共享可训练的部分:

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,并且自动训练其他模型。