2016-07-21 8 views
0

Ich versuche, den Kippverlust zu berechnen, der wiederum in Keras verwendet wird. Allerdings muss ich etwas falsch machen, da ich negative Verlustwerte bekomme (was nicht möglich sein sollte). Kann jemand darauf hinweisen, was ich falsch gemacht habe? Ich nehme an, es ist die Theano-Syntax, die ich falsch verstanden habe.Tilted Verlust in Theano

Der Verlust definiert wird mathematisch als: enter image description here wobei $ \ xi_i = y_i - f_i $, wo y_i $ $ die Beobachtung und $ f_i $ ist die Vorhersage. Außerdem bin ich nach dem mittleren Verlust, so habe ich meine Verlustfunktion wie folgt definiert:

$$ 
\mathcal{L} = \frac{\alpha\sum \xi_i-\sum I(\xi_i<0)\xi_i}{N} 
$$ 

wo $ I() $ ist die Indikatorfunktion und nimmt den Wert 1, wenn wahr.

Daher meine Verlustfunktion ist wie folgt definiert:

def tilted_loss2(y,f): 
    q = 0.05 
    e = (y-f) 
    return (q*tt.sum(e)-tt.sum(e[e<0]))/e.shape[0] 

jedoch, wenn ich mein Netzwerk betreibe ich negative Werte erhalten. Ist hier etwas mit der Theano-Syntax nicht in Ordnung? Mein größter Verdacht ist hier: tt.sum(e[e<0])). Kannst du es so schneiden?

Alle Gedanken würden geschätzt werden.

Antwort

2

Sie können nicht so schneiden. see this answer

Sie benötigen eine Verlustfunktion wie folgt zu ändern:

def tilted_loss2(y,f): 
    q = 0.05 
    e = (y-f) 
    return (q*tt.sum(e)-tt.sum(e[(e<0).nonzero()]))/e.shape[0] 

Sie können auch versuchen, diese Behelfslösung mit abs Funktion anstelle komplexer Slicing-Syntax, die nicht funktionieren könnte:

def tilted_loss2(y,f): 
    q = 0.05 
    e = (y-f) 
    return (q*tt.sum(e)-tt.sum(e-abs(e))/2.)/e.shape[0]