Keras中具有多输入多输出模型的单损失函数



我正在尝试使用Keras训练一个多输入(3)多输出(4)模型,我需要使用一个单一的损失函数来接受所有的输出预测。这些输出中有2个是我关心的真实模型输出,并且有相应的标签,而另外2个输出是我的模型中可学习的参数,我想用它们来动态更新真实模型输出的损失权值。我需要这样写:

model.compile(optimizer=optimizer, loss = unified_loss

,其中统一的loss应该能够访问我所有的模型输出和相应的标签。我用tf.data.from_tensor_slices(...)训练。

我发现的唯一解决方案是使用自定义训练循环,它允许这一点。但是,我失去了很多功能,并且回调变得更加难以实现。

是否有办法解决这个问题,使用常规的model.compilt(...)model.fit(...)?

除了自定义训练循环(这不是首选)之外,我确实尝试了标准方法:

model.compile(optimizer=optimizer, loss = [loss1, loss2], loss_weights = [alpha, beta]

我试图使α和β可学习的参数,但这是不希望的,因为我有一个自定义方程,比简单的加权和更复杂。

在模型中添加一个层,将损失连接到单个张量/输出中。让您的自定义loss解析出这四个值中的每一个,并对它们进行必要的数学运算。在推理期间,运行没有额外层的模型。

训练和推理模型略有不同的模式是常见的模式。

下面是一个基本思想的例子:

import tensorflow as tf
inp1 = tf.keras.Input((1,))
inp2 = tf.keras.Input((1,))
inp3 = tf.keras.Input((1,))
inputs = tf.keras.layers.Concatenate()([inp1, inp2, inp3])
out1 = tf.keras.layers.Dense(1)(inputs)
out2 = tf.keras.layers.Dense(1)(inputs)
out3 = tf.keras.layers.Dense(1)(inputs)
out4 = tf.keras.layers.Dense(1)(inputs)
model = tf.keras.Model([inp1, inp2, inp3], [out1, out2, out3, out4])
x1 = tf.convert_to_tensor([1])
x2 = tf.convert_to_tensor([1])
x3 = tf.convert_to_tensor([1])
model((x1, x2, x3))
outs = tf.stack([out1, out2, out3, out4])
training_model = tf.keras.Model([inp1, inp2, inp3], outs)
training_model((x1, x2, x3))
def exotic_loss(y_true, y_pred):
true1, true2, true3 = tf.unstack(y_true)
pred1, pred2, pred3 = tf.unstack(y_pred)
return true1 + true2 + true3 + pred1 + pred2 + pred3
training_model.compile(loss=exotic_loss)

相关内容

  • 没有找到相关文章

最新更新