Keras 如何处理多重损失?

如果我有这样的东西:

model = Model(inputs = input, outputs = [y1,y2])


l1 = 0.5
l2 = 0.3
model.compile(loss = [loss1,loss2], loss_weights = [l1,l2], ...)

克拉斯如何处理损失以获得最终的损失? 是不是像这样:

final_loss = l1*loss1 + l2*loss2

还有,在训练期间这意味着什么?损失2是否只用于更新 y2来源层上的权重?还是用于模型的所有层次?

44305 次浏览

来自 model文档:

Loss : String (目标函数的名称)或目标函数。看到损失。如果模型有多个输出,可以通过传递字典或损失列表在每个输出上使用不同的损失。该模型将最小化的损失价值将是所有个人损失的总和。

...

Loss _ weight : 指定标量系数(Python float)的可选列表或字典,用于权重不同模型输出的损失贡献。将被模型最小化的损失价值将是所有单独损失的加权和,由 loss_weights系数加权。如果是一个列表,那么它应该与模型的输出有1:1的映射关系。如果是张量,则需要将输出名称(字符串)映射到标量系数。

因此,是的,最终的损失将是“所有个人损失的加权总和,由 loss_weights系数加权”。

你可以检查 计算损失的代码

还有,在训练期间这意味着什么?损失2是否只用于更新 y2来源层上的权重?还是用于模型的所有层次?

权重是通过 反向传播更新的,因此每个损失将只影响连接输入到损失的层。

例如:

                        +----+
> C  |-->loss1
/+----+
/
/
+----+    +----+/
-->| A  |--->| B  |\
+----+    +----+ \
\
\+----+
> D  |-->loss2
+----+
  • loss1将影响 A、 B 和 C。
  • loss2将影响 A、 B 和 D。

对于多个输出反向传播,我认为这并不是法比奥 · 佩雷斯提到的一个完整的答案

还有,这在训练中是什么意思? 是不是只有在训练中才会出现这种情况 更新 y2来源的图层的权重? 还是用于 所有模型的层次?

对于输出 C 和输出 D,keras 将计算最终损失 F _ loss = w1 * loss 1 + w2 * loss 2。然后对输出 C 和输出 D 应用最终损耗 F _ loss,最后使用相同的 F _ loss 对输出 C 和输出 D 进行反向传播。