python - Keras:如何加载具有两个输出和自定义损失函数的模型?
问题描述
我已经训练了一个 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 层中定义的。
我的问题是如何加载在推理过程中持久保存到磁盘的模型。如果它是单个输出模型,我将使用 custom_objects 加载模型,如此 stackoverflow 问题中所述:Loading model with custom loss + keras
model = keras.models.load_model(model_path, custom_objects={'custom_loss_fn':custom_loss_fn})
但是在我有两个输出的情况下如何扩展它,其中损失和损失权重在字典中定义以及自定义损失函数?
换句话说,custom_objects
在这种情况下应该如何填充 wherelosses
和loss_weights
被定义为字典?
我正在使用带有 Tensorflow 后端 v1.8.0 的 Keras v2.1.6。
解决方案
如果您可以在加载端重新编译模型,最简单的方法是只保存权重:model.save_weights()
. 如果您想使用 save_model 并拥有自定义 Keras 层,请确保它们实现了该get_config
方法(请参阅此参考)。至于没有梯度的操作,我在没有正确使用keras.backend
函数的情况下混合 tensorflow 和 Keras 时看到了这一点,但是如果没有模型代码本身,我就无能为力了。
推荐阅读
- bash - Bash 循环 - 并行化和迭代
- android - FCM 通知 - 多个设备
- python - 为什么这个while循环执行但产生了不正确的答案?
- ruby-on-rails - ActiveModel::Serializer 将动态接受任何属性的子类?
- go - 如何解决 Go 项目中嵌套应用程序二进制文件中的依赖关系?
- java - 如何在java中只获取父类的一些*属性/参数*
- python - 根据列值从 pandas 数据框创建字典
- javascript - 使用 javascript 在新选项卡中打开 - 异常情况,无法访问代码
- sql - hive sql:无效的列引用'2'
- python - 使用分配运算符时的 Python 错误 TOS = 优先级 [数据 >> 5] + 选项卡 + 延迟 [D] + 选项卡 + 吞吐量 [T] + 选项卡 + 可靠性 [R] + 选项卡 = 成本 [M]