在Keras中编写没有y_true的自定义损失函数

时间:2017-12-04 18:40:09

标签: python keras

我在Keras实施三重损失功能。通常,损失函数将预测值与基础事实作为参数。但三重态损失不使用标签,只是输出。我尝试用一​​个参数编写函数:

def triplet_loss(y_pred):
    margin = 1
    return K.mean(K.square(y_pred[0]) - K.square(y_pred[1]) + margin)

失败说triplet_loss()接受1个参数但是给出了两个参数(在score_array = fn(y_true, y_pred)中。当我用两个参数y_true, y_pred编写函数时,程序运行没有错误。为什么这样?我是否应该使用这两个参数实现此函数,虽然y_true不会被使用?这是正确的还是有其他方法可以做到?

2 个答案:

答案 0 :(得分:0)

嗯......根本就没有使用基本事实:

def triplet_loss(y_true,y_pred):
    #all your code as it is.

在没有基本事实的情况下训练网络并不常见。当我们期望它学到一些东西时,往往有一个基本的事实。如果你不这样做,那就忽略它吧。

另外,如果忽略y_true,你传递给fit方法的是什么?只是一个虚拟数组?

答案 1 :(得分:0)

通过K.function方法实现它。

output_tensor = your_model(input_tensor)
total_loss = K.mean( K.abs (input_tensor - output_tensor) )

nn_train = K.function ([input_tensor],[total_loss], 
                Adam(lr=5e-5, beta_1=0.5, beta_2=0.999).get_updates(total_loss, your_model.trainable_weights)

loss, = nn_train ([input])