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

时间:2019-02-22 21:18:37

标签: tensorflow keras deep-learning keras-layer keras-2

我已经使用自定义优化器编译并训练了keras模型。我保存了模型,但是当我尝试加载模型时,它抛出错误,指出 public void onButtonJump() { if (controller.isGrounded ) { verticalVelocity = -gravity * Time.deltaTime; { verticalVelocity = jumpForce; animator.SetBool("is_in_air", true); jump.Play(); } } else { animator.SetBool("is_in_air", false); verticalVelocity -= gravity * Time.deltaTime; } } 。我试图将MyOptimizer作为自定义对象传递,例如:ValueError: Unknown optimizer: MyOptimizer,但仍然会引发错误。如何使用自定义对象将模型加载为keras模型?

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。但是,我的模型中有两种不同的自定义内容。一个是我的优化器,另一个是自定义层。因此,我解决了我的问题如下:

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

答案 1 :(得分:0)

我遇到了同样的问题:)

我通过向模型加载models.load_model('myModel.h5', compile=False)使之起作用。

来自喀拉拉邦source code

  

如果在保存的模型中找到优化器,则该模型已经编译。否则,该模型将无法编译,并且将显示警告。当compile设置为False时,编译会被忽略,而不会发出任何警告。

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

答案 2 :(得分:0)

我认为您需要更改custom_objects字典的密钥:

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

我相信它应该与对象的函数名称匹配。

答案 3 :(得分:0)

在您的情况下,您必须使用优化程序类的名称作为custom_objects词典中的键,因为优化程序将是“ MyOptimizer”对象,

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

应该工作