我知道理论上,一个批次内的网络损失仅是每个单独损失的总和。这体现在Keras代码中计算总损失的部分。相关内容如下:
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%
的差别。但是,这两个网络的准确性仍然完全相同。因此,批量大小对网络影响不大。我的问题是,如果批量大小加倍,假设损失实际上正在被求和,那么损失是否应该是之前的两倍甚至更大?通过大批量大小可能会使网络学习得更好的说法被事实所否定,因为准确性保持不变。
无论批量大小如何,损失值基本保持不变,这让我认为它是在平均计算。
fit()
的代码时,它似乎是取平均值,但compile()
似乎是求和。为什么会有两个函数? - JonathanK.mean()
中,这表明它们是平均值而不是总和。 - enumaris