sigmoid_cross_entropy 是不是会产生整个批次的平均损失?
Posted
技术标签:
【中文标题】sigmoid_cross_entropy 是不是会产生整个批次的平均损失?【英文标题】:Does sigmoid_cross_entropy produce the mean loss over the whole batch?sigmoid_cross_entropy 是否会产生整个批次的平均损失? 【发布时间】:2018-07-03 06:35:37 【问题描述】:我有一个多标签分类任务,有 6 个标签。任何样本都可能没有标签或某些标签为 1。我在 tensorflow 中使用了损失:
self.loss = tf.losses.sigmoid_cross_entropy(self.labels, self.logits)
每进一批(1000)个样本,就会计算损失。
但我不确定损失是否是每个预测列的对数损失的平均值。如果不是,我如何将损失修改为平均列-上面提到的明智的日志丢失?
【问题讨论】:
【参考方案1】:实际上,这不是完全的意思,或者更准确地说,不是总是的意思。
tf.losses.sigmoid_cross_entropy
有一个reduction
参数(默认等于Reduction.SUM_BY_NONZERO_WEIGHTS
)和一个weights
参数(默认1.0
):
weights
:可选Tensor
,其rank为0,或与labels
相同的rank,并且必须可广播到labels
(即所有维度必须为1,或与对应的相同)损失维度)。
reduction
:适用于损失的减少类型。
有几种类型的减少:
Reduction.SUM_BY_NONZERO_WEIGHTS
计算 SUM
除以非零权重的数量。
Reduction.SUM
是加权和。
Reduction.MEAN
是加权平均值。
Reduction.NONE
表示不减少(结果形状与输入相同)。
如您所见,结果取决于两者。是的,当两者都有默认值时,损失等于平均值。但如果其中一个是非默认的,例如,其中一个权重为零,则平均值将在非零权重上计算,而不是在整个批次上计算。
【讨论】:
谢谢。如果 logits 和 label 都没有 none 值,则损失应为列的平均值。【参考方案2】:是的,张量流中的任何损失都会产生整个批次的平均值。所以,如果batchwise loss如下
[2, 3, 1, 4]
净亏损将2.5
【讨论】:
以上是关于sigmoid_cross_entropy 是不是会产生整个批次的平均损失?的主要内容,如果未能解决你的问题,请参考以下文章
损失函数softmax_cross_entropybinary_cross_entropysigmoid_cross_entropy之间的区别与联系