我正在尝试了解sigmoid_cross_entropy损失函数对图像分割神经网络的作用:
以下是相关的Tensorflow源代码:
zeros = array_ops.zeros_like(logits, dtype=logits.dtype)
cond = (logits >= zeros)
relu_logits = array_ops.where(cond, logits, zeros)
neg_abs_logits = array_ops.where(cond, -logits, logits)
return math_ops.add(
relu_logits - logits * labels,
math_ops.log1p(math_ops.exp(neg_abs_logits)), name=name)
Run Code Online (Sandbox Code Playgroud)
我的主要问题是为什么math_ops.add()在返程中会有一个?加法是指图像中每个像素的损失总和,还是总和有所不同?我无法正确地遵循尺寸变化来推断总和。
python machine-learning neural-network deep-learning tensorflow
我知道,从理论上讲,一批网络的损失只是所有单个损失的总和。这反映在用于计算总损耗的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
Run Code Online (Sandbox Code Playgroud)
但是,我注意到,当我使用a batch_size=32和a 训练网络时batch_size=64,每个时期的损失值仍然或多或少地相同,只有a~0.05%有所不同。但是,两个网络的准确性都完全相同。因此,从本质上讲,批量大小对网络没有太大影响。
我的问题是,如果我将批处理量加倍,并假设损失确实在被累加,那么损失实际上不应该是以前的两倍,或者至少更大吗?精度保持不变的事实否定了网络可能以更大的批量学习得更好的借口。
无论批次大小如何,损失都大致相同,这一事实使我认为这是平均水平。