tf.nn.sigmoid_cross_entropy_with_logits权重

时间:2017-09-01 18:15:21

标签: python tensorflow

我有〜1000个类的多标签问题,但一次只选择少数几个。当使用tf.nn.sigmoid_cross_entropy_with_logits时,这会导致损失很快接近0,因为预测有990+ 0。

loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits, labels))

在数学上是否可以通过一个大常数(比如1000)将损失加倍,这样我就可以在张量板中绘制损失数字,我可以实际区分?我意识到我可以简单地多次绘制我正在绘制的值(不影响我传递给train_op的值)但是我试图更好地理解是否将train_op乘以常量会产生任何实际效果。例如,我可以实施以下任何一种选择,并试图思考潜在的后果:

  1. loss = tf.reduce_mean(tf.multiply(tf.nn.sigmoid_cross_entropy_with_logits(logits, labels), 1000.0))
  2. loss = tf.multiply(tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits, labels)), 1000.0)
  3. 如果像这样引入常量,你会期望训练结果不同吗?

1 个答案:

答案 0 :(得分:2)

损失越大,渐变越大。因此,如果将损失乘以1000,则渐变步长会很大并且可能导致分歧。调查梯度下降和反向传播以更好地理解这一点。

此外,reduce_mean计算张量的所有元素的平均值。在均值之前或之后相乘在数学上是相同的。因此,你的两条线也在做同样的事情。

如果你想增加你的损失只是为了操纵更大的数字来绘制它们,只需创建另一个张量并将其相乘。您将使用损失进行训练,使用multiplied_loss进行绘图。

loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits, labels))
multiplied_loss = tf.multiply(loss, 1000.0)
optimizer.minimize(loss)
tf.summary.scalar('loss*1000', multiplied_loss)

这个代码当然不够,适应你的情况。