首页 > 解决方案 > 具有多个输出的网络,如何计算损失?

问题描述

在训练具有多个分支的网络时,因此具有多个损失,keras 描述中提到全局损失是两个部分损失的加权和,即 final_loss = l1*loss1 + l2*loss2

然而,在我的模型由两个分支组成的训练过程中,并使用选项 loss_weights=[1., 1.] 编译两个分支的分类交叉熵损失。我希望将全局损失视为两次损失的平均值(因为两个部分损失的权重相同),但事实并非如此。我得到了一个相对较高的全局损失,我无法猜测它是如何使用部分损失及其权重计算的。以下是一些训练值。谁能向我解释如何使用这些参数计算全局损失?并且损失权重的总和是否应该不超过1(即我应该使用loss_weights=[0.5, 0.5]代替吗?)我将非常感谢那些可以提供帮助的人,因为我被封锁了很长时间。

Epoch 2/200
26/26 [==============================] - 39s 1s/step - loss: 9.2902 - 
dense_1_loss: 0.0801 - dense_2_loss: 0.0717 -
Epoch 3/200
26/26 [==============================] - 39s 1s/step - loss: 8.2261 - 
dense_1_loss: 0.0251 - dense_2_loss: 0.0199 -
Epoch 4/200 
26/26 [==============================] - 39s 2s/step - loss: 7.3107 - 
dense_1_loss: 0.0595 - dense_2_loss: 0.0048 -
Epoch 5/200
26/26 [==============================] - 39s 1s/step - loss: 6.4586 - 
dense_1_loss: 0.0560 - dense_2_loss: 0.0025 -
Epoch 6/200
26/26 [==============================] - 39s 1s/step - loss: 5.9463 - 
dense_1_loss: 0.1964 - dense_2_loss: 0.0653 -
Epoch 7/200
26/26 [==============================] - 39s 1s/step - loss: 5.3730 - 
dense_1_loss: 0.1722 - dense_2_loss: 0.0447 -
Epoch 8/200
26/26 [==============================] - 39s 1s/step - loss: 4.8407 - 
dense_1_loss: 0.1396 - dense_2_loss: 0.0169 -
Epoch 9/200
26/26 [==============================] - 39s 1s/step - loss: 4.4465 - 
dense_1_loss: 0.1614 - dense_2_loss: 0.0124 -
Epoch 10/200
26/26 [==============================] - 39s 2s/step - loss: 3.9898 - 
dense_1_loss: 0.0588 - dense_2_loss: 0.0119 -
Epoch 11/200
26/26 [==============================] - 39s 1s/step - loss: 3.6347 - 
dense_1_loss: 0.0302 - dense_2_loss: 0.0085 -

标签: tensorflowkerasbackpropagationloss-functionconv-neural-network

解决方案


正确的。全局损失是两个部分损失的加权和

Global loss=(loss1 * weight1 + loss2 * weight2)

我采用了一个 keras 函数模型来证明全局损失是两个部分损失的加权和。请在此处查看整个代码。

模型编译为

model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
              loss=[keras.losses.BinaryCrossentropy(from_logits=True),
                    keras.losses.CategoricalCrossentropy(from_logits=True)],
              loss_weights=[1., 0.2])

模型训练为

model.fit({'title': title_data, 'body': body_data, 'tags': tags_data},
          {'priority': priority_targets, 'department': dept_targets},
          epochs=2,batch_size=32)

Epoch 1/2
40/40 [==============================] - 2s 45ms/step - loss: 1.2723 - priority_loss: 0.7062 - department_loss: 2.8304
Epoch 2/2
40/40 [==============================] - 2s 46ms/step - loss: 1.2593 - priority_loss: 0.6995 - department_loss: 2.7993

检查如何使用权重和两个损失来获得整体损失 (loss1*weight1+loss2*weight2) (0.7062*1.0+2.8304*0.2) #1.27228

希望这可以帮助。


推荐阅读