如果我有类似的东西:
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 来自的层的权重?还是用于模型的所有层?
loss:字符串(目标函数的名称)或目标函数。见损失。如果模型有多个输出,您可以通过传递字典或损失列表对每个输出使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。 ... 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。
对于多个输出反向传播,我认为这不是 Fábio Perez 提到的完整答案。
另外,在训练期间是什么意思? loss2 是否仅用于更新 y2 来自的层的权重?还是用于模型的所有层?
对于输出 C 和输出 D,keras 将计算最终损失 F_loss=w1 * loss1 + w2 * loss2。然后,最终损失 F_loss 应用于输出 C 和输出 D。最后来自输出 C 和输出 D 的反向传播使用相同的 F_loss 反向传播。