如何使用自定义优化器加载keras保存的模型

15

我已经用自定义优化器编译和训练了一个Keras模型。我保存了这个模型,但是当我尝试加载它时,会出现错误信息:“ValueError: 未知的优化器:MyOptimizer”。我试图通过传递自定义对象来解决这个问题,代码如下:models.load_model('myModel.h5', custom_objects={'optimizer':MyOptimizer}),但它仍然报错。那么,如何加载带有自定义对象的Keras模型?


保存/加载自定义优化器的状态:https://dev59.com/fFUL5IYBdhLWcg3w-sR4 - Contango
3个回答

18

我也遇到了同样的问题 :)

通过使用models.load_model('myModel.h5', compile=False)来加载模型,我解决了这个问题。

根据keras 源代码:

如果在保存的模型中已经存在优化器,则模型已经被编译。否则,模型未被编译,将显示一条警告信息。当设置compile为False时,编译将被省略而不会有任何警告。

在加载了未编译的模型后,我可以再次使用自定义优化器进行编译。


顺便提一下,你只需要进行推理,无需编译。 - Eugene Krevenets

9

您需要在custom_objects字典中使用优化器类名作为键,对于您的情况,优化器将是'MyOptimizer'对象。

models.load_model('myModel.h5', custom_objects={'MyOptimizer': MyOptimizer})

应该正常工作


1

我有同样的问题。然而,我的模型中有两个不同的自定义部分。一个是我的优化器,另一个是自定义层。因此,我解决了我的问题如下:

my_loaded_model = tf.keras.models.load_model('my_models_name.h5', custom_objects={'KerasLayer':hub.KerasLayer , 'AdamWeightDecay': optimizer})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接