在没有自定义对象的情况下保存完整的 tf.keras 模型?

dan*_*451 3 python restore save keras tensorflow

假设我们有一些模型,包括在训练期间很重要的自定义损失和指标。是否可以在没有自定义对象的情况下保存完整的模型,即权重 + graphdef / pb 文件?

在推理过程中不需要自定义损失和指标,因此...

tf.keras.models.load_model("some_model", custom_objects={...})
Run Code Online (Sandbox Code Playgroud)

...只会使推理代码更加复杂,因为需要包含自定义对象代码以进行推理(尽管未使用它)。

但是,tf.keras.callbacks.ModelCheckpoint(即使使用include_optimizer=False)以及调用model.save()始终保存模型定义,包括自定义对象。

因此,只需加载模型...

tf.keras.models.load_model("some_model")
Run Code Online (Sandbox Code Playgroud)

...总是会失败并抱怨缺少自定义对象。

是否可以在没有自定义损失/指标的情况下以某种方式保存整个模型?获得易于加载的网络的“推理”版本?

或者是将所有内容冻结到 TFLite 模型的唯一解决方案?

当然,可以简单地使用model.save_weights(),但随后需要包含实际代码以进行推理,这是不希望的。

Mat*_*gro 5

如果目的是防止加载 loss 和 metrics,可以使用compilein 中的参数load_model

model = tf.keras.models.load_model("some_model", compile=False)
Run Code Online (Sandbox Code Playgroud)

这应该跳过损失和指标/优化器的要求,因为模型未编译。当然你现在不能训练模型,但它应该适用于推理使用model.predict()