keras如何处理多重损失?
deep-learning
keras
5
0

如果我有类似的东西:

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来源的图层上的权重?还是将其用于模型的所有层?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

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

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

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

收藏
评论

model文档中

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

...

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。
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号