Keras:如何加载具有两个输出和一个自定义损失函数的模型?

时间:2019-02-13 07:01:37

标签: python tensorflow keras keras-layer

我已经训练了Keras(带有Tensorflow后端)模型,该模型具有两个带有自定义损失功能的输出。我需要使用custom_objects参数从磁盘加载模型的帮助。

在编译模型时,我使用了loss和loss_weights参数,如下所示:

losses = {
            'output_layer_1':custom_loss_fn,
            'output_layer_2':custom_loss_fn
         }

loss_weights = {
                'output_layer_1': 1.0, 
                'output_layer_2': 1.0
               }

model.compile(loss=losses, loss_weights=loss_weights, optimizer=opt)

该模型正在训练,没有任何问题。我将模型保存如下:

model.save(model_path)

我之所以没有定义“ custom_loss_fn”的原因是因为custom_loss_fn是在另一个自定义Keras图层中定义的。

我的问题是如何在推理过程中将持久化的模型加载到磁盘上。如果它是单个输出模型,那么我将按照以下stackoverflow问题Loading model with custom loss + keras

所述,使用custom_objects加载模型。
model = keras.models.load_model(model_path, custom_objects={'custom_loss_fn':custom_loss_fn})

但是,在我有两个输出,字典中定义的损失和损失权重以及自定义损失函数的情况下,该如何扩展呢?

换句话说,在custom_objectslosses被定义为字典的情况下,应该如何填充loss_weights

我正在使用Keras v2.1.6和Tensorflow后端v1.8.0。

1 个答案:

答案 0 :(得分:0)

如果您可以在加载侧重新编译模型,最简单的方法是仅保存权重:model.save_weights()。如果要使用save_model并具有自定义的Keras图层,请确保它们实现了get_config方法(请参见this参考)。 至于没有渐变的操作,我在混合使用tensorflow和Keras时没有正确使用keras.backend函数就已经看到了这一点,但是如果没有模型代码本身,我将无济于事。