2016-05-10 2 views
1

Ich teste das Tensorflow-Framework mit einem Regressionsproblem. Meine Eingabe hat viele Funktionen und meine Ausgabe nur eine. Für jetzt funktioniert es, aber ich denke, dass meine Kostenfunktion nicht genau ist, was ich will, also habe ich ziemlich niedrige Genauigkeit.Neuronale Netze: Entwurf der Kostenfunktion "nicht unterscheidbar"/Tensorflow

Mein Ziel ist es, die Leistung innerhalb eines 10% -Bereich der aktuellen Ausgangsvorherzusagen, dh für jeden Ausgang sagen:

if (y_actual - y_predicted) < 0.1 * y_actual : 
    cost = 0 
else : 
    cost = 1 

Also für einen vorhergesagten Ausgangsvektor von: [130, 35, 65, 43] vs einer aktuellen Ausgabe Vektor von [125, 10, 75, 40], sollte ich eine Kosten von 2 bekommen. (130 und 40 sind in den 10%, 35 und 65 sind nicht)

Für jetzt verwende ich einen quadratischen Unterschied.

cost = tf.reduce_sum(tf.squared_difference(y_predicted,y_)/(2*nb_batches)) 

Also eigentlich, erhalte ich eine ziemlich gute Vorhersage für die Summe der Ausgaben, aber ich habe nur eine 60% ige Genauigkeit, wenn ich eine Vorhersage prüfen genau zu sein, wenn es in dem 10% der tatsächlichen Ausgabe ist. Meine Genauigkeit ist so geschrieben:

with tf.name_scope('accuracy'): 
    with tf.name_scope('correct_prediction'): 
     correct_prediction = tf.less_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs((y_))) # True if y_diff <= 10% * y_actual 
    with tf.name_scope('accuracy'): 
     accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) # count 1 if correct prediction is True ; else False ; Do the sum on all the data tested 
    tf.scalar_summary('accuracy', accuracy) 

Ich habe versucht, andere Kostenfunktionen zu schreiben wie:

cost = tf.reduce_sum(tf.cast((tf.greater_equal(tf.abs((y_predicted-y_)), 0.1*tf.abs(y_))),tf.float32) 

Aber ich habe den Fehler: No gradients provided for any variable. Ich denke, das liegt daran, dass wir die Ableitung von tf.cast nicht bekommen können.

Gibt es eine geeignete Möglichkeit, eine Verlustfunktion zu schreiben, die meinen Anforderungen entspricht? Ich weiß, dass die Verlustfunktion, die ich will, nicht "ableitbar" ist. Denken Sie, dass die Umwandlung in eine ableitbare Funktion eine Lösung wäre?

Ich bin nicht sicher, ob ich war sehr klar ...

Vielen Dank für Ihre Hilfe!

Paul

+0

Ich denke, der Fehler tritt auf, wenn es keinen Pfad von den Variablen zur Verlustfunktion gibt. Könnte ein möglicher Fehler in Ihrer Diagrammdefinition sein. – shekkizh

+0

Ja, ich denke, dass Tensorflow mit tf.cast nicht in der Lage ist, zu den Variablen zurück zu kommen ... Aber da die Kosten ein Float sein müssen ... –

+0

Haben Sie zufällig eine Arbeit für 'tf.cast gefunden? '? –

Antwort

1

Statt den Vergleichsoperator verwenden, könnten Sie
tf.nn.relu(tf.abs(y_predicted-y_)-tf.abs(y_))
eine differenzierbare Kostenfunktion zu erhalten.

Die Reluing-Operation berechnen max (0, x) und wird somit eine kontinuierliche Version von dem, was Sie getan haben. Der Hauptunterschied wird sein, dass Sie mehr bestraft werden, wenn Sie weiter weg sind und somit nicht die binäre Eigenschaft haben (aber das ist normalerweise das, was Sie in der Regression anstreben).
Dies sollte zu einem besseren Ergebnis führen als der quadratische Verlust.

+0

Danke für Ihre Antwort. Ich denke, es gibt nur einen Tippfehler: Ich denke, es sollte tf.nn.relu (tf.abs (y_predicted-y _) - 0,1 * tf.abs (y_)) Wie Sie schon sagten, ein Fehler von " 27 "würden als 27 Fehler von" 1 "gezählt werden, während dies für die Genauigkeit nicht der Fall ist. –

+0

Tatsächlich hatte ich eine Genauigkeit, die kleiner war als wenn ich den quadratischen Verlust verwendete ... Eine Möglichkeit wäre, die Anzahl der Nicht-Null-Werte zu "zählen", aber ich kenne keine TF-Funktion, die das tut und np testet .count_nonzero, es funktioniert nicht. Ich fragte mich auch, ob die Fehlerfunktion, d. H. Erf (alpha * x) wäre eine gute Passform ... –

Verwandte Themen