keras如何处理多重损失?

jfg*_*fga 29 backpropagation deep-learning keras loss-function

所以我的问题是,如果我有类似的东西:

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

l1 = 0.5
l2 = 0.3
model.compile(loss = [loss1,loss2], loss_weights = [l1,l2], ...)
Run Code Online (Sandbox Code Playgroud)

为了获得最终损失,keras做了什么损失?是这样的:

final_loss = l1*loss1 + l2*loss2
Run Code Online (Sandbox Code Playgroud)

此外,在培训期间意味着什么?loss2仅用于更新y2来自的层的权重吗?或者它是否用于所有模型的图层?

我很困惑

Fáb*_*rez 33

来自model文档:

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

...

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

所以,是的,最终损失将是"所有个人损失的加权和,由loss_weights系数加权".

您可以检查计算损失代码.

此外,在培训期间意味着什么?loss2仅用于更新y2来自的层的权重吗?或者它是否用于所有模型的图层?

权重通过反向传播进行更新,因此每次丢失只会影响将输入连接到损失的层.

例如:

                        +----+         
                        > C  |-->loss1 
                       /+----+         
                      /                
                     /                 
    +----+    +----+/                  
 -->| A  |--->| B  |\                  
    +----+    +----+ \                 
                      \                
                       \+----+         
                        > D  |-->loss2 
                        +----+         
Run Code Online (Sandbox Code Playgroud)
  • loss1 会影响A,B和C.
  • loss2 会影响A,B和D.

  • 注意!!!来自文档:“如果模型有多个输出......模型将最小化的损失值将是所有单独损失的总和”(合理)https://www.tensorflow.org/api_docs/ python/tf/keras/Model#compile 所以最终的损失将影响所有 (5认同)

小智 5

对于多个输出进行反向传播,我认为这不是FábioPerez提到的完整答案。

另外,在训练期间是什么意思?loss2是否仅用于更新y2来源的图层上的权重?还是将其用于模型的所有层?

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