加载自定义损失+ keras的模型

时间:2018-01-22 02:15:35

标签: python keras

在Keras中,如果您需要使用其他参数进行自定义丢失,我们可以像https://datascience.stackexchange.com/questions/25029/custom-loss-function-with-additional-parameter-in-keras

中提到的那样使用它
def penalized_loss(noise):
    def loss(y_true, y_pred):
        return K.mean(K.square(y_pred - y_true) - K.square(y_true - noise), axis=-1)
    return loss

当我训练模型时,上述方法有效。但是,一旦训练模型,我就难以加载模型。当我尝试在load_model中使用custom_objects参数时,如下所示

model = load_model(modelFile, custom_objects={'penalized_loss': penalized_loss} )

抱怨ValueError: Unknown loss function:loss

有没有办法将损失函数作为custom_objects中的一个自定义损失传递?从我可以收集的内容来看,在load_model调用期间,内部函数不在命名空间中。是否有更简单的方法来加载模型或使用带有附加参数的自定义损失

3 个答案:

答案 0 :(得分:12)

是的,有! custom_objects期望您用作损失函数的确切函数(在您的情况下是内部函数):

model = load_model(modelFile, custom_objects={ 'loss': penalized_loss(noise) })

不幸的是,keras不会在模型中存储噪声值,因此您需要手动将其提供给load_model函数。

答案 1 :(得分:3)

如果您加载模型只是为了预测(而非训练),您可以在 load_model 中将编译标志设置为 False,如下所示:

model = load_model(model_path, compile=False)

这不会搜索损失函数,因为它只用于编译模型。

答案 2 :(得分:0)

您可以尝试以下方法:

import keras.losses
keras.losses.penalized_loss = penalized_loss

(在当前“ py”文件中定义“ penalized_loss”函数之后)。