我正在研究回归问题,在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)
但是当我们处理张量时,我们似乎无法轻易改变它们的价值观。是不是有可能做到这一点?
答案 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
导入损失函数并在那里使用。