所以我的问题是,如果我有类似的东西:
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来自的层的权重吗?或者它是否用于所有模型的图层?
我很困惑
答案 0 :(得分:21)
损失:字符串(目标函数的名称)或目标函数。看到损失。如果模型具有多个输出,则可以通过传递字典或损失列表在每个输出上使用不同的损失。然后,模型将最小化的损失值将是所有单个损失的总和。
...
loss_weights :指定标量系数(Python浮点数)的可选列表或字典,用于加权不同模型输出的损失贡献。然后,模型将最小化的损失值将是所有单个损失的加权和,由
loss_weights
系数加权。如果是列表,则应该将1:1映射到模型的输出。如果是张量,则期望将输出名称(字符串)映射到标量系数。
所以,是的,最终损失将是“所有个人损失的加权和,由loss_weights
系数加权”。
您可以查看code where the loss is calculated。
此外,在培训期间意味着什么? loss2仅用于更新y2来自的层的权重吗?或者它是否用于所有模型的图层?
权重通过backpropagation更新,因此每次丢失都只会影响将输入与损失相关联的图层。
例如:
+----+
> C |-->loss1
/+----+
/
/
+----+ +----+/
-->| A |--->| B |\
+----+ +----+ \
\
\+----+
> D |-->loss2
+----+
loss1
会影响A,B和C. loss2
会影响A,B和D. 答案 1 :(得分:2)
对于要传播的多个输出,我认为这不是FábioPerez提到的完整答案。
此外,在培训期间意味着什么?是损失2只用于 更新y2来自的图层的权重?或者是否用于 所有模型的图层?
对于输出C和输出D,keras将计算最终损失F_loss = w1 * loss1 + w2 * loss2。然后,最终的损失F_loss应用于输出C和输出D.最后来自输出C和输出D的反向传播使用相同的F_loss来反向传播。