【问题标题】:Branched output Keras分支输出 Keras
【发布时间】:2017-12-12 14:04:54
【问题描述】:

我的模型是这样的,它分为 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

这是否在out1loss_fn2 上使用loss_fn1 out2 张量?因为,这就是我打算做的,但我不确定我的代码是否真的做到了。任何指针都会有所帮助。

我想在out1张量上使用loss_fn1,在out2张量上使用loss_fn2函数。

编辑:

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

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

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

【问题讨论】:

    标签: python keras


    【解决方案1】:

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

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

    【讨论】:

    • 但是,我的损失值 1 在 [0, 1] 范围内,我的损失值 2 可以是任意数字,例如 500。如何确保损失值 1 也减少?因为,损失值 1 和 2 之和将是 500+1 = 501,其中损失值 1 的贡献很小,这意味着将损失值 1 减少到 0 只会将总损失减少到 500,这是微不足道的。我将如何处理这样的问题?有没有办法单独减少loss_fn1和loss_fn2?
    • 为了独立减少损失,您可能应该定义 2 个单独的模型并交替训练它们。在实践中,您通常会权衡损失以解决规模问题。在 Keras 中,这可以通过 compile 中的 loss_weights 参数来完成
    • loss_weights 对我来说似乎是个好主意。你有这方面的经验吗?当一个损失为 [0, 1] 而另一个损失可以达到无穷大时。我可以将“loss_weights”参数设置为[1.0, 0.00001]。不知道什么是正确的方法。我不想训练单独的模型,因为我希望其余层具有相同的权重,因为 out1 和 out2 是相关的。
    • 损失如何上升到无穷大?对于 [0, 500] 范围内的“有限”损失,您可以将 loss_weights 系数设置为 1 和 1/500。此外,仍然可以与 2 个不同的模型共享权重。例如。你可以定义model1 = Model(inputs=[input_layer], outputs=[out1])model2 = Model(inputs=[input_layer], outputs=[out2])
    • 它是一个均方误差损失,所以没有定义特定的范围。所以,如果我定义 model1 = Model(inputs=[input_layer], outputs=[out1])model2 = Model(inputs=[input_layer], outputs=[out2]) 并针对每个批量大小交替训练它们,它应该可以工作,对吧?更好的方法是让 2 个模型独立地减少损失函数,并且由于共享权重仍然相互关联,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2020-03-29
    • 2020-10-27
    • 2017-04-18
    • 2018-09-24
    • 2018-12-15
    相关资源
    最近更新 更多