2017-04-01 2 views
2

Keras (백엔드로 Tensorflow 사용)를 사용하여 신경 네트워크에서 'quantile regression'을 구현하기위한 핀거 손실 함수를 정의하려고합니다. pinball losstensorflow 백엔드가있는 케라에서 핀볼 손실 함수 정의

그것은 그들이 y_pred, y_true의 전체 일괄 처리하기 때문에 전통 등 K.means() 함수를 구현하기 어렵다, 그러나 나는 y_pred, y_true의 각 구성 요소를 고려해야합니다 :

이 정의는 여기 그리고 여기 내 원래의 코드입니다 :

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) 

내가 y_pred 전송하려고 시도 y_true는 벡터화 된 데이터 구조입니다 그래서 인덱스를 인용, 개별 구성 요소를 처리, 아직이 문제로 인해의 부족으로 발생하는 것 같다 수 있습니다 y_pred, y_true를 개별적으로 취급하는 지식.

나는 오류에 의해 지시 된 라인으로 잠수하려했지만, 나는 거의 잃어 버렸다.

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"]()]] 

어떻게 해결할 수 있습니까? 감사!

+0

하면이 라인'y_pin = tf.placeholder (tf.float32, [없음, 1])'도 전체 세션 기반의 블록을 제거합니다. – lejlot

+0

감사! 나는 이것을 알아 냈다. –

답변

2

나는 Keras 백엔드 자신에 의해이 문제를 알아 냈어요 :

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 
관련 문제