修改损失函数中的地面实况值

时间:2018-05-15 21:39:37

标签: python tensorflow keras deep-learning

我正在研究回归问题,在TensorFlow上使用Keras。给定输入向量 [x_1,...,x_n],任务是预测输出向量[y_1,...,y_n]。 我使用简单的完全连接网络进行relu激活,将均方误差作为损失函数。

我的问题是地面实况是不完整的:即某些输出向量没有完全注释。当没有注释向量的值时,给定的值为0.例如,我们可以有y = [54,0,3]。

因此,我希望损失函数不会惩罚试图预测实际价值的网络。我的想法是将基础事实的值更改为网络在训练期间预测的值,因此对于未注释的点,损失为空 - 例如:

def custom_loss(y_true, y_pred):
    for i in range(0,len(y_true)):
        if y_true[i] == 0:
            y_true[i] = y_true[pred]
    return K.mean(K.square(y_pred - y_true), axis=-1)

但是当我们处理张量时,我们似乎无法轻易改变它们的价值观。是不是有可能做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为反过来更容易。将您的预测值乘以您所拥有的精确零,并且该元素的渐变将不会传播。

def customLoss(true,pred):

    nonZeroTrue = K.cast(K.not_equal(true,0),K.floatx())
    maskedPred = pred * nonZeroTrue

    return anyStandardLoss(true,maskedPred)

anyStandardLoss可能在哪里,对于' mse'

K.mean(K.square(maskedPred - true), axis=-1)

您可以从keras.losses导入损失函数并在那里使用。