2

我有一个多标签分类任务,有 6 个标签。任何样本都可能没有标签或某些标签为 1。我在 tensorflow 中使用了损失:

self.loss = tf.losses.sigmoid_cross_entropy(self.labels, self.logits)

每次有一批(1000)个样本进来,就会计算损失。

但我不确定损失是否是每个预测列的对数损失的平均值。如果不是,我如何将损失修改为上面提到的平均列对数损失

4

2 回答 2

3

实际上,它并不完全是平均值,或者更准确地说,并不总是平均值。

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表示不减少(结果形状与输入相同)。

如您所见,结果取决于它们两者。是的,当两者都有默认值时,损失等于平均值​​。但是如果其中一个是非默认的,例如,其中一个权重为零,则平均值将在非零权重上计算,而不是在整个批次上计算。

于 2018-01-24T14:39:07.370 回答
0

是的,张量流产生的任何损失都意味着整个批次。所以,如果批量损失如下

[2, 3, 1, 4]

净亏损将2.5

于 2018-01-24T09:30:40.440 回答