我有一个多标签分类任务,有6个标签。任何样本可能没有标签或部分标签为 1。我在张量流中使用了损失:
self.loss = tf.losses.sigmoid_cross_entropy(self.labels, self.logits)
每一批(1000)个样品进来,就会计算损失。
但我不确定损失是否是每个预测列的对数损失的平均值。如果不是,我如何将损失修改为上述平均列对数损失?
实际上,它不完全是平均值,或者更准确地说,并不总是平均值。
tf.losses.sigmoid_cross_entropy
有一个reduction
参数(默认等于Reduction.SUM_BY_NONZERO_WEIGHTS
)和一个weights
参数(默认1.0
):
weights
:可选Tensor
,其等级为 0,或与labels
的等级相同,并且必须可广播到labels
(即,所有维度必须为 1,或与相应的损失维度相同)。
reduction
: 适用于损失的减少类型。
有几种类型的减少:
Reduction.SUM_BY_NONZERO_WEIGHTS
计算SUM
除以非零权重的数量。Reduction.SUM
是加权总和。Reduction.MEAN
是加权平均值。Reduction.NONE
表示不减少(结果形状与输入相同)。
如您所见,结果取决于它们。是的,当两者都有默认值时,损失等于平均值。但是,如果其中一个是非默认值,例如,其中一个权重为零,则平均值将针对非零权重计算,而不是针对整个批次计算。
是的,张量流产生的任何损失都意味着整个批次。因此,如果批量损失如下
[2, 3, 1, 4]
净亏损将2.5