Keras如何处理多个损失函数?

78
如果我有类似以下的内容:

If I have something like:


假如我有这样的东西:

If I have something like:

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

l1 = 0.5
l2 = 0.3
model.compile(loss = [loss1,loss2], loss_weights = [l1,l2], ...)
Keras如何处理损失函数以得到最终的损失值?类似这样吗:
final_loss = l1*loss1 + l2*loss2

另外,在训练过程中它是什么意思?loss2只用于更新y2所在的层的权重吗?还是用于模型所有层的权重?

2个回答

75

来自model文档:

loss: 字符串(目标函数名称)或目标函数。请参见losses。如果模型有多个输出,可以通过传递一个字典或一个损失列表在每个输出上使用不同的损失。然后,模型将最小化的损失值将是所有单独损失的总和。

...

loss_weights: 可选的列表或字典,用于指定加权不同模型输出的损失贡献的标量系数(Python浮点数)。然后,模型将最小化的损失值将是所有单独损失的加权和,由loss_weights系数加权。如果是列表,则应该与模型的输出具有1:1的映射关系。如果是张量,则应该将输出名称(字符串)映射到标量系数。

所以,是的,最终的损失将是"加权的单独损失的总和,由loss_weights系数加权。"

您可以查看计算损失的代码

此外,训练期间意味着什么?loss2是否仅用于更新y2所来自的层上的权重?还是用于所有模型的层?

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

例如:

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

9
注意!!!来自文档的内容:“如果模型具有多个输出...那么模型将最小化的损失值将是所有单独损失的总和”(如此合理)。因此,最终的损失将影响所有的输出。请参考链接:https://www.tensorflow.org/api_docs/python/tf/keras/Model#compile - Marco Cerliani

15

对于多个输出的反向传播,我认为从Fábio Perez所提到的内容中得出的答案是不完整的。

同时,在训练过程中这意味着什么?loss2只用于更新y2所在的层的权重吗?还是它用于模型的所有层?

对于输出C和输出D,keras将计算最终损失F_loss=w1 * loss1 + w2 * loss2。然后,最终损失F_loss应用于输出C和输出D。最后使用相同的F_loss从输出C和输出D进行反向传播。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接