Optimization Keras:将损失计算为数据点的*中值*,而不是平均值

Optimization Keras:将损失计算为数据点的*中值*,而不是平均值,optimization,deep-learning,keras,Optimization,Deep Learning,Keras,页面上说,如果我们有一个自定义损失函数,那么“实际优化的目标是所有数据点上输出数组的平均值”。有没有任何方法可以优化所有数据点上输出数组的中值(而不是平均值)?要做到这一点,您需要降低到tensorflow级别 import keras import tensorflow def pick_median(arg_tensor): the_upper_tensor = tensorflow.contrib.distributions.percentile(arg_tensor, 50,

页面上说,如果我们有一个自定义损失函数,那么“实际优化的目标是所有数据点上输出数组的平均值”。有没有任何方法可以优化所有数据点上输出数组的中值(而不是平均值)?

要做到这一点,您需要降低到tensorflow级别

import keras
import tensorflow


def pick_median(arg_tensor):
    the_upper_tensor = tensorflow.contrib.distributions.percentile(arg_tensor, 50, interpolation='higher')
    the_lower_tensor = tensorflow.contrib.distributions.percentile(arg_tensor, 50, interpolation='lower')

    final_tensor = (the_upper_tensor + the_lower_tensor) / 2
    # print(the_count.eval(session=keras.backend.get_session()))

    return final_tensor
下面是如何定义,比如说,
median\u squared\u error
损失函数:

def median_squared_error(arg_y_true,
                         arg_y_pred):
    final_tensor = keras.backend.square(arg_y_pred - arg_y_true)
    final_tensor = pick_median(arg_tensor=final_tensor)
    return final_tensor

中位数是不可微的。即使这样,我们不能通过单独返回“中间”点来进行反向传播吗?我也在尝试这样做。我认为我们可以用一些系数来惩罚重大损失。然后平均值将接近中位数。但如何计算系数,这是另一个数学问题。目前,我不知道怎么做。