在具有tensorflow后端的keras中定义弹球丢失功能

Dah*_*Gan 4 machine-learning keras tensorflow

我正在尝试定义一个pinbal损失函数,以使用Keras(以Tensorflow作为后端)在神经网络中实现``分位数回归''。

定义在这里:弹球损失

很难实现传统的K.means()等函数,因为它们处理了整批y_pred,y_true,但是我必须考虑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)
Run Code Online (Sandbox Code Playgroud)

我试图将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"]()]]
Run Code Online (Sandbox Code Playgroud)

我该如何解决?谢谢!

Dah*_*Gan 5

我已经通过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
Run Code Online (Sandbox Code Playgroud)