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之间的区别与联系

在 Java 中对资源使用 try 是不是安全 - 它是不是检查可关闭对象是不是不为空,是不是在尝试关闭它时捕获异常

“滚动” FFT 是不是可能,是不是有用?

GetKeyState() 是不是检测到密钥是不是被释放?

JS判断是不是为数字,是不是为整数,是不是为浮点数

inno setup是不是判断文件是不是存在,然后弹出提示安装时是不是覆盖文件,根据提示安装程序?