我有一个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文档中没有发现任何官方的无用损失。
答案 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
,并且自动训练其他模型。