2017-09-01 54 views
2

我有1000個類的多標籤問題,但一次只選擇少數幾個。當使用tf.nn.sigmoid_cross_entropy_with_logits時,這會導致損失非常快地接近0,因爲預計有990+個0。tf.nn.sigmoid_cross_entropy_with_logits權重

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

它是數學上可能只是多由大的恆定損失(比如1000),只是讓我可以在tensorboard,我可以真正區分情節損失次數?我意識到我可以簡單地多重我繪製的值(不會影響我傳遞給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)

你所期望的培訓結果不同,如果一個常數像這樣介紹?

回答

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) 

這段代碼是不夠的當然,適應你的情況。