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? :)
ist 'y_true' eine Bestelldaten oder indeces der bestellten Daten? –
@ 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
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. –