2017-02-11 5 views
0

Ich trainiere ein multi-objektives neuronales Netz in TensorFlow mit meiner eigenen Verlustfunktion und finde keine Dokumentation darüber, wie Batching mit dieser Funktionalität interagiert.Wie interagiert die Stapelverarbeitung mit der Verlustfunktion in TensorFlow?

Zum Beispiel habe ich unter Snippet meiner Verlust-Funktion, die den Tensor/Liste der Prognosen nimmt und stellt sicher, dass ihre absolute Wert Summen nicht mehr als ein:

def fitness(predictions,actual): 

    absTensor = tf.abs(predictions) 
    sumTensor = tf.reduce_sum(absTensor) 
    oneTensor = tf.constant(1.0) 

    isGTOne = tf.greater(sumTensor,oneTensor) 

    def norm(): return predictions/sumTensor 
    def unchanged(): return predictions 

    predictions = tf.cond(isGTOne,norm,unchanged) 

    etc... 

Aber wenn ich bin in einer Reihe von Schätzungen passiert, ich fühle mich wie diese Verlustfunktion normalisiert den gesamten Satz von Eingaben an diesem Punkt zu 1 zu summieren, anstatt jeden einzelnen Satz zu 1 summieren. Dh
[[.8, .8], [. 8, .8]] -> [[.25, .25], [. 25,25]]
anstelle der gewünschten
[[.8, .8], [. 8, .8]] -> [[.5, .5], [. 5, .5]]

Kann jemand meinen Verdacht klären oder ruhen lassen? Wenn meine Funktion gerade funktioniert, wie kann ich das ändern?

Antwort

2

Sie müssen eine Reduzierungsachse für Reduzierungsoperationen angeben, andernfalls werden alle Achsen reduziert. Traditionell ist dies die erste Dimension Ihres Tensors. Also, Zeile 2 sollte so aussehen:

Nachdem Sie diese Änderung vornehmen, werden Sie in ein anderes Problem laufen. sumTensor wird nicht länger ein Skalar sein und wird daher als Bedingung für tf.cond keinen Sinn mehr ergeben (d. H. Was bedeutet es, pro Eintrag eines Stapels zu verzweigen?). Was Sie wirklich wollen, ist tf.select, da Sie Logik pro Batch-Eintrag nicht wirklich verzweigen möchten. Wie folgt aus:

isGTOne = tf.greater(sumTensor,oneTensor) 

norm = predictions/sumTensor 

predictions = tf.select(isGTOne,norm,predictions) 

Aber bei dieser nun auf der Suche, würde ich nicht einmal bedingt stören die Einträge zu normalisieren. Da Sie jetzt mit der Granularität eines Stapels arbeiten, können Sie meiner Meinung nach keine Leistung durch die Normalisierung eines Eintrags eines Stapels einzeln erzielen. Vor allem, da das Teilen nicht wirklich ein teurer Nebeneffekt ist. Könnte auch einfach nur tun:

def fitness(predictions,actual): 

    absTensor = tf.abs(predictions) 
    sumTensor = tf.reduce_sum(absTensor, 0) 

    predictions = predictions/sumTensor 

    etc... 

Hoffe, dass hilft!

+0

Das ist perfekt. Vielen Dank. Gibt es irgendwo in der Dokumentation, die über dieses Verhalten spricht? Ich würde gerne lesen, wenn es nichts Unerwartetes mehr gibt. – liqiudilk

+0

Welches Verhalten haben Sie besonders gesucht? Die [tf.select docs] (https://www.tensorflow.org/api_docs/python/control_flow_ops/comparison_operators#select) ist nützlich. – suharshs

Verwandte Themen