2017-02-28 3 views
1

Ich habe einige Probleme mit dieser benutzerdefinierten Verlustfunktion machen (es überprüft, ob y_pred Daten kohärent mit der realen Ordnungsindizes von y_true bestellt und bezogen werden) arbeiten:Wie benutze ich tf.nn.top_k in einer Keras-Loss-Funktion?

def custom_objective(y_true, y_pred): 
    y_true = tf.cast(y_true, tf.float32) 
    ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32) 
    return tf.sqrt(tf.reduce_mean(tf.square(ordered_output - y_true), axis=-1)) 

ich es richtig mit Beispieldaten ausführen kann:

with tf.Session() as sess: 
    print(custom_objective(tf.constant([0, 1, 2, 3, 4, 5]), 
          tf.constant([0.0, 0.9, 0.2, 0.3, 0.5, 0.8])).eval()) # 1.82574 

Aber irgendwie funktioniert es nicht, wenn ich es in model.compile verwenden, da es aufwirft:

/Users/luca/.virtualenvs/python3/lib/python3.6/site-packages/tensorflow/python/framework/tensor_util.py in make_tensor_proto(values, dtype, shape, verify_shape) 
    358 else: 
    359  if values is None: 
--> 360  raise ValueError("None values not supported.") 
    361  # if dtype is provided, forces numpy array to be the type 
    362  # provided if possible. 

ValueError: None values not supported. 

Beachten Sie, dass es keine "None" -Werte in meinem Trainingstestsatz gibt, wenn ich ordered_output = tf.cast(tf.nn.top_k(-y_pred, k=5)[1], tf.float32) zu ordered_output = -y_pred ändere, das Modell kompiliert und das Training richtig beginnt (aber es ist eindeutig nicht die Verlustfunktion, die ich will).

Ich habe das subtile Gefühl, dass etwas nicht in Ordnung bei der Verwendung top_k in einer Verlustfunktion sein könnte, wie ich sehe nicht, wie es differenzierbar sein könnte, aber ich habe keine besseren Ideen für Unterschiede bei der vorhergesagten Reihenfolge auswertet. Hinweise/Ideen/Papiere/Referenzen? :)

+0

ist 'y_true' eine Bestelldaten oder indeces der bestellten Daten? –

+0

@ MarcinMożejko der zweite. y ist ursprünglich geordnet, dann wird es vor dem Training gemischt und y_true repräsentiert die Indizes der geordneten Daten, die ich vorhersagen möchte. atm Ich benutze standardmäßig MSE, um es vorherzusagen, aber es ist nicht super effizient – luke14free

+0

Ich kann Ihnen zeigen, wie Sie Ihr Modell umschreiben, um es zu optimieren, um das gewünschte Ergebnis zu erhalten. Derzeit - Ihr Modell könnte dies schlecht machen. –

Antwort

2

werden Dies könnte stimmt, da ich nicht wirklich Code beheben, aber hier geht nichts:

Ich glaube nicht, in der Tat, dass Sie top_k als objektive Funktion nutzen können. Genauso wie Sie die Genauigkeit nicht als objektive Funktion verwenden können.

Der Grund ist mathematisch. Auch wenn Keras, Tensorflow, Theano und Co. sind großartige Werkzeuge für KI und erlauben es jedem, mit neuronalen Netzen zu spielen, wobei letztere immer noch sehr komplexe mathematische Werkzeuge bleiben. Diese Mathematik ist gut versteckt unter der Haube, aber Sie sollten sich ihrer bewusst sein, wenn Sie versuchen, weiter als vorgefertigte Werkzeuge zu gehen.

Was passiert, wenn Sie ein Netzwerk trainieren, dass Sie berechnen, wie falsch das Netzwerk in einem Beispiel ist, und Sie diesen Fehler zurückpropagieren, um daraus zu lernen. Die Algorithmen hinter dieser Backpropagation sind Optimierer, genauer gesagt sind sie Gradienten basierte Optimierer. Die Berechnung eines Gradienten erfordert die Unterscheidung der Funktion, die wir optimieren, die Verlust-/Zielfunktion. Es bedeutet, dass das Objektiv differenzierbar sein muss. Die Genauigkeit ist keine differenzierbare Funktion, sie nimmt als Eingabe eine reelle Zahl zwischen 0 und 1 und gibt eine stufenartige Funktion aus: 0 wenn x < 0,5 und 1 wenn x> 0,5. Diese Funktion ist nicht differenzierbar, da wir ihren Gradienten nicht in 0.5 erhalten können. Die Funktion top_k ist eine Art von Genauigkeitsfunktion. Meiner Meinung nach kann man es also nicht in einem Objektiv verwenden, denn unter der Haube muss der intelligente Tensorflow die Gradienten Ihrer Funktion berechnen.

Ich hoffe, das hilft :)

+0

Danke nochmal für dich Hilfe/Eingabe Nassim, was du sagst macht Sinn und war auch was ich erwartet habe. Nichtsdestotrotz habe ich gesehen, wie Leute mit neuronalen Netzen spielten, die Dinge sortieren, und ich fragte mich, ob es eine kluge Herangehensweise an diese Art von Problemen gab. Zum Beispiel wäre eine "schwache" Alternative für die Überprüfung die Verwendung von MSE oder Categorical Crossentropy, aber ich würde einige Informationen über die Reihenfolge der Daten verlieren. – luke14free

+0

Können Sie mehr Informationen darüber geben, was Sie erreichen möchten? Ein kleines Beispiel für Eingaben, Ziele und warum Sie es tun möchten, wäre perfekt! –