【问题标题】:How to load a tensorflow keras model saved with saved_model to use the predict function?如何加载用 saved_model 保存的 tensorflow keras 模型以使用预测功能?
【发布时间】:2021-12-29 13:57:28
【问题描述】:

我有一个 keras 顺序模型。我已经使用命令保存了该模型。

tf.keras.models.save_model(model, 'model')

现在它具有以下文件夹结构,

现在我正在使用加载模型

model = tf.saved_model.load('model')

我也试过

model = tf.keras.models.load_model('model')

然后我尝试使用预测

model.predict(padded_seq, verbose=0)

它给了我错误

AttributeError: '_UserObject' object has no attribute 'predict'

如何在加载的模型上使用预测。我试过h5模型,效果很好。但我的主要用途是使用这种会抛出错误的模型。

【问题讨论】:

  • 如果您的 h5 模型运行良好,您为什么不使用它? “我的主要用途是使用这种模型”是什么意思?
  • @obr 我正在使用 triton 推理服务器进行推理。我们需要 saved_model 格式。这就是为什么我正在寻求帮助,如果我能获得任何帮助以顺利使用 saved_model。我不知道如何在推理端使用 h5 模型。

标签: python tensorflow keras sequential


【解决方案1】:

您正在使用不正确的函数来加载您的模型 (tf.saved_model.load);它不返回 Keras 对象(来自the docs):

tf.saved_model.load 返回的对象不是 Keras 对象(即没有.fit.predict 等方法)。

您应该使用tf.keras.models.load_model 来加载 Keras 模型。

【讨论】:

  • 感谢@obr,我也尝试了 load_model。它也有相同的方法。
【解决方案2】:

我在使用从 TFHUB 下载的 SavedModel 模型(例如:InceptionV3)时遇到了同样的问题,即使使用 tf.keras.models.load_model() 加载它也会返回一个普通模型(一种允许向后兼容的基本通用模型),它没有keras API(预测、拟合、总结、构建等)在其之上,对象类型为:<tensorflow.python.saved_model.load.Loader._recreate_base_user_object.<locals>._UserObject object at 0x14a42ac2bcf8> 如果您只想使用推理调用(预测),您可以直接在数据上调用您的模型(__call__ 方法已定义),如下所示:

model(padded_seq) # or model.__call__(padded_seq)

我发现再次获取 Keras API 的一种解决方法是将其包装在顺序模型中的 KerasLayer 中,如下所示:

import tensorflow as tf
import tensorflow_hub as hub

model = tf.keras.Sequential([
    hub.KerasLayer("saved/model/path")
])
model.build(<input_shape>)

现在模型支持所有 Keras API,如预测、摘要等,现在应该可以工作了:

model.predict(padded_seq, verbose=0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 2021-12-25
    • 2020-05-20
    • 1970-01-01
    • 2020-12-24
    • 2019-09-17
    • 2020-03-16
    相关资源
    最近更新 更多