2017-04-01 12 views
2

ケラス(バックエンドとしてTensorflowを使用)を使用したニューラルネットワークで「量子リグレッション」を実装するためのピンバル損失関数を定義しようとしています。 pinball lossテンソルフローバックエンドを持つケラスのピンボール損失関数を定義する

それは、彼らが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_trueは、ベクトル化データ構造にある、まだ問題が原因の不足のために起こるようで、y_pred転送しようとし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 
関連する問題