分支输出Keras

时间:2017-12-12 14:04:54

标签: python keras

我的模型是这样的,它分为2个输出层,如下所示:

输入 - > L1 - > L2 - > L3-> OUT1

输入 - > L1 - > L2 - > L3-> out2

我这样使用它是因为我希望out1out2拥有2种不同的激活功能。因此,我创建了一个模型:

model = Model(inputs=[input_layer], outputs=[out1, out2])

我正在使用以下方法编译它:

model.compile(Adam(lr=1e-2), loss=[loss_fn1, loss_fn2], metrics=[accuracy])

损失函数以这种方式定义:

def loss_fn1(y_true, y_pred):
    #send channel 1 to get bce dice loss
    loss1 = binary_crossentropy(y_true[:, :, :, 0:1], y_pred[:, :, :, 0:1])   
    return loss1

def loss_fn2(y_true, y_pred):    
    #l2 loss for channels 2 and 3
    loss2 = mean_squared_error(y_true[:, :, :, 1:3], y_pred[:, :, :, 1:3])
    return loss2

这是loss_fn1 out1loss_fn2 out2上的loss_fn1吗?因为,这是我打算做的,但我不确定我的代码是否真的这样做。任何指针都会有所帮助。

我想在out1张量上使用loss_fn2 out2张量{{1}}函数。

编辑:

loss_fn1范围内的损失值:[0,1] - sigmoid激活。

loss_fn2范围内的损失值:[0,inf] - 无激活

有没有办法独立减少loss_fn1和loss_fn2,而不使用单独的模型?我担心loss1 + loss2最终只会导致loss2值的减少,因为与loss2相比,loss1的值较低。

1 个答案:

答案 0 :(得分:2)

是的,你的解释是正确的。来自Keras documentation

  

如果模型有多个输出,则可以通过传递字典或损失列表在每个输出上使用不同的损失。然后,模型将最小化的损失值将是所有单个损失的总和。