2017-09-01 3 views
2

Ich habe ein Multi-Label-Problem mit ~ 1000 Klassen, aber nur eine Handvoll sind auf einmal ausgewählt. Wenn tf.nn.sigmoid_cross_entropy_with_logits verwendet wird, nähert sich der Verlust sehr schnell 0 an, da 990+ 0 vorhergesagt werden.tf.nn.sigmoid_cross_entropy_with_logits Gewichte

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

Ist es mathematisch möglich, nur der Verlust von einer großen Konstante mehrere (etwa 1000) nur so, dass ich Verlust Zahlen in tensorboard zeichnen kann, die ich zwischen tatsächlich unterscheiden kann? Ich weiß, dass ich die Werte, die ich zeichne, einfach multiplizieren könnte (ohne den Wert zu beeinflussen, den ich an train_op übergebe), aber ich versuche ein besseres Verständnis dafür zu bekommen, ob die Multiplikation des train_op mit einer Konstante einen wirklichen Effekt haben würde. Zum Beispiel könnte ich eine der folgenden Entscheidungen umzusetzen und ich versuche, durch die möglichen Folgen zu denken:

  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)

Möchten Sie die Trainingsergebnisse unterscheiden erwarten, wenn eine Konstante ist so eingeführt?

Antwort

2

Je größer Ihr Verlust ist, desto größer wird Ihr Gradient. Wenn Sie also Ihren Verlust mit 1000 multiplizieren, wird Ihr Farbverlauf groß und kann zu Divergenzen führen. Untersuchen Sie Gradientenabstieg und Rückpropagation, um dies besser zu verstehen.

Darüber hinaus reduce_mean berechnen Sie den Mittelwert aller Elemente Ihres Tensors. Multiplikation vor dem Mittelwert oder nach ist mathematisch identisch. Ihre zwei Zeilen machen also dasselbe.

Wenn Sie Ihren Verlust multiplizieren möchten, nur um größere Zahlen zu manipulieren, um sie zu plotten, erstellen Sie einfach einen anderen Tensor und multiplizieren Sie ihn. Sie verwenden Ihren Verlust für das Training und multiplicate_loss zum Plotten.

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) 

Dieser Code ist natürlich nicht genug, passen Sie ihn an Ihren Fall an.