我有一个只有一个输入和两个输出的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预测中的实际答案。
我尝试编写一个自定义损失函数,并且可以使玩具示例在单个输出模型上工作,但是对于多输出模型,损失函数似乎针对每个输出单独调用,因此我很难访问混合损失函数所需的变量。
对实现这一目标有何建议?
谢谢!
答案 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
干杯