多输出keras模型的混合损失函数

时间:2019-03-02 01:19:33

标签: python keras

我有一个只有一个输入和两个输出的keras模型。这两个输出是分开的,因为一个输出具有线性激活(用于估计线性回归值),另一个输出具有softmax激活(尝试进行实验以学习由于输入数据嘈杂而产生的置信度值)。

in_layer = Input((1,))
Hlayer1 = Dense(4,activation='linear')(in_layer)
Hlayer2 = Dense(4,activation='relu')(Hlayer1)
out_1 = Dense(1, activation='linear')(Hlayer2)
out_2 = Dense(1, activation='softmax')(Hlayer2) 
model = Model(inputs=[in_layer], outputs = [out_1,out_2])

我想创建以下形式的混合损失函数:

loss = (1 - out_2) x MSE(out_1) + out_2 x MSE(out_1)

尝试使用out_2预测捕获答案中的不确定性以及out_1预测中的实际答案。

我尝试编写一个自定义损失函数,并且可以使玩具示例在单个输出模型上工作,但是对于多输出模型,损失函数似乎针对每个输出单独调用,因此我很难访问混合损失函数所需的变量。

对实现这一目标有何建议?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您想在不去tf的情况下留在Keras,这里是一种解决方法。 1)将两个输入连接为一个张量作为模型输出 2)编写自定义损失函数

示例代码如下

in_layer = Input((1,))
Hlayer1 = Dense(4,activation='linear')(in_layer)
Hlayer2 = Dense(4,activation='relu')(Hlayer1)
out_1 = Dense(1, activation='linear')(Hlayer2)
out_2 = Dense(1, activation='softmax')(Hlayer2) 
out_concat = Concatenate(axis=-1)([out_1, out_2])
model = Model(inputs=[in_layer], outputs = out_concat)

def my_loss(y_true, y_pred):
    out_1 = y_pred[:, 0:1]
    out_2 = y_pred[:, 1:2]
    return your_loss_function

干杯