2017-04-01 8 views
2

Ich versuche eine Pinbal-Loss-Funktion zur Implementierung einer 'Quantil-Regression' im neuronalen Netzwerk mit Keras (mit Tensorflow als Backend) zu definieren.Definiere Pinball-Loss-Funktion in Keras mit Tensorflow-Backend

Die Definition ist hier: pinball loss

Es ist schwer, traditionellen K.means() usw. Funktion zu implementieren, da sie mit der ganzen Charge von y_pred, y_true beschäftigen, aber ich habe jede Komponente y_pred, y_true zu berücksichtigen und hier ist meine Original-Code:

def pinball_1(y_true, y_pred): 
    loss = 0.1 
    with tf.Session() as sess: 
     y_true = sess.run(y_true) 
     y_pred = sess.run(y_pred) 
    y_pin = np.zeros((len(y_true), 1)) 
    y_pin = tf.placeholder(tf.float32, [None, 1]) 
    for i in range((len(y_true))): 
     if y_true[i] >= y_pred[i]: 
      y_pin[i] = loss * (y_true[i] - y_pred[i]) 
     else: 
      y_pin[i] = (1 - loss) * (y_pred[i] - y_true[i]) 
    pinball = tf.reduce_mean(y_pin, axis=-1) 
    return K.mean(pinball, axis=-1) 

sgd = SGD(lr=0.1, clipvalue=0.5) 
model.compile(loss=pinball_1, optimizer=sgd) 
model.fit(Train_X, Train_Y, nb_epoch=10, batch_size=20, verbose=2) 

ich versuchte y_pred zu übertragen, y_true zu vektorisiert Datenstruktur ist, so kann ich sie mit dem Index, zitieren und mit einzelnen Komponenten beschäftigen, doch scheint es Probleme aufgrund der fehlenden tritt von Wissen in der Behandlung von y_pred, y_true individuell.

Ich habe versucht, in fehlerbehaftete Zeilen zu tauchen, aber ich verliere mich fast.

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'dense_16_target' with dtype float 
[[Node: dense_16_target = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

Wie kann ich es beheben? Vielen Dank!

+0

entfernen Sie diese Zeile 'y_pin = tf.placeholder (tf.float32, [None, 1])' auch ganze Sitzung auf Basis Block. – lejlot

+0

Danke! Ich habe es herausgefunden. –

Antwort

2

Ich habe das von mir mit Keras Backend herausgefunden:

def pinball(y_true, y_pred): 
    global i 
    tao = (i + 1)/10 
    pin = K.mean(K.maximum(y_true - y_pred, 0) * tao + 
       K.maximum(y_pred - y_true, 0) * (1 - tao)) 
    return pin