在Keras使用自定义损失和预测

时间:2017-09-21 21:27:33

标签: python keras

我在Keras创造了一个自定义的损失。让我们假设我们有以下内容:

def a_loss(X):
    a, b = X
    loss = . . . 
    return loss

def mean_loss(y_true, y_pred):
    return K.mean(y_pred - 0 * y_true)

模型类似于:

                             .
                             .
                             .
z1 = Dense(shape1, activation="linear")(conv_something)
z2 = Dense(shape1, activation="linear")(conv_something2)
loss = a_loss([z1, z2])

model = Model(
    inputs=[input1, input2, ..],
    outputs=[loss])

model.compile(loss=mean_loss,optimizer=Adam())

现在这个假设模型正常。但是,当我必须使用训练有素的模型来预测我正在使用的东西时:

model.predict(X_dictionary)

我假设上面的输出是lossa_loss函数的输出)。对吗?如果不正确我。

我想要model.predict的输出是z2。搜索API你可以使用多个输出:

model = Model(
    inputs=[sequence_input_desc, sequence_input_title_positive, sequence_input_title_negative],
    outputs=[loss, z2]
)

但上述内容将培训最小化lossz2。我想要的是仅训练以最小化loss和预测函数以输出z2。检查文档的一种方法是在loss_weights=[1.0,0.0]中使用compile,但它不起作用。它输出错误The model expects 2target arrays, but only received one array. Found: array with shape ..

知道该怎么做吗?

1 个答案:

答案 0 :(得分:1)

训练完成后,您只需创建一个使用相同图层但输出不同的新模型:

model = Model(
    inputs=[input1, input2, ..],
    outputs=[z2])

它将重复使用学习的权重,因为它们存储在图层中,而不是模型中(它只是一个容器)。

然后,您可以像往常一样使用model.predict来获得结果。