【发布时间】:2019-02-09 20:59:49
【问题描述】:
我知道理论上,一个批次的网络损失只是所有单个损失的总和。这反映在用于计算总损失的Keras code 中。相关:
for i in range(len(self.outputs)):
if i in skip_target_indices:
continue
y_true = self.targets[i]
y_pred = self.outputs[i]
weighted_loss = weighted_losses[i]
sample_weight = sample_weights[i]
mask = masks[i]
loss_weight = loss_weights_list[i]
with K.name_scope(self.output_names[i] + '_loss'):
output_loss = weighted_loss(y_true, y_pred,
sample_weight, mask)
if len(self.outputs) > 1:
self.metrics_tensors.append(output_loss)
self.metrics_names.append(self.output_names[i] + '_loss')
if total_loss is None:
total_loss = loss_weight * output_loss
else:
total_loss += loss_weight * output_loss
但是,我注意到,当我用 batch_size=32 和 batch_size=64 训练网络时,每个 epoch 的损失值仍然或多或少相同,只有 ~0.05% 差异。然而,两个网络的准确度保持不变。所以本质上,batch size 对网络没有太大影响。
我的问题是,当我将批量大小加倍时,假设损失确实被求和,损失实际上不应该是以前值的两倍,或者至少更大吗?网络可能通过更大的批大小更好地学习的借口被准确度保持完全相同的事实所否定。
无论批次大小如何,损失或多或少都保持不变的事实让我认为它被平均了。
【问题讨论】:
-
损失是平均值,而不是单个损失的总和。
-
能否通过代码确认一下?
-
@enumaris 当我遵循
fit()的代码时,它似乎是平均的,但compile()似乎是总和。为什么两者都有? -
见这里:github.com/keras-team/keras/blob/master/keras/losses.py 所有损失都带有
K.mean(),向您表明这是平均值而不是总和。 -
@enumaris 查看对已接受答案的评论。
标签: python tensorflow keras deep-learning loss