从 tensorflow 2.0 中保存的模型运行预测

Posted

技术标签:

【中文标题】从 tensorflow 2.0 中保存的模型运行预测【英文标题】:Run prediction from saved model in tensorflow 2.0 【发布时间】:2020-02-07 00:48:44 【问题描述】:

我有一个已保存的模型(一个包含 model.pd 和变量的目录)并想在 pandas 数据框上运行预测。

我尝试了几种方法都没有成功:

尝试 1:从保存的模型中恢复估计器

estimator = tf.estimator.LinearClassifier(
    feature_columns=create_feature_cols(),
    model_dir=path,
    warm_start_from=path)

其中 path 是具有model.pd 和变量文件夹的目录。我遇到了错误

ValueError: Tensor linear/linear_model/dummy_feature1/weights is not found in 
gs://bucket/Trainer/output/2013/20191008T170504.583379-63adee0eaee0/serving_model_dir/export/1570554483/variables/variables 
checkpoint 'linear/linear_model/dummy_feature1/weights': [1, 1], 'linear/linear_model/dummy_feature2/weights': [1, 1]

尝试 2:通过运行直接从保存的模型运行预测

imported = tf.saved_model.load(path)  # path is the directory that has a `model.pd` and variables folder
imported.signatures["predict"](example)

但尚未成功传递参数 - 看起来该函数正在寻找 tf.example,但我不确定如何将数据框转换为 tf.example。 我的转换尝试如下,但出现 df[f] 不是张量的错误:

for f in features:
    example.features.feature[f].float_list.value.extend(df[f])

我在 *** 上看到过解决方案,但它们都是 tensorflow 1.14。如果有人可以为 tensorflow 2.0 提供帮助,我们将不胜感激。

【问题讨论】:

【参考方案1】:

考虑到您保存的模型如下所示:

my_model
assets  saved_model.pb  variables

您可以使用以下方式加载您保存的模型:

new_model = tf.keras.models.load_model('saved_model/my_model')

# Check its architecture
new_model.summary()

要对 DataFrame 执行预测,您需要:

    将标量包装到一个列表中,以便具有批量维度(模型只处理批量数据,而不是单个样本) 就每个功能致电convert_to_tensor

示例 1: 如果您将第一个测试行的值设为

sample = 
    'Type': 'Cat',
    'Age': 3,
    'Breed1': 'Tabby',
    'Gender': 'Male',
    'Color1': 'Black',
    'Color2': 'White',
    'MaturitySize': 'Small',
    'FurLength': 'Short',
    'Vaccinated': 'No',
    'Sterilized': 'No',
    'Health': 'Healthy',
    'Fee': 100,
    'PhotoAmt': 2,


input_dict = name: tf.convert_to_tensor([value]) for name, value in sample.items()
predictions = new_model.predict(input_dict)
prob = tf.nn.sigmoid(predictions[0])

print(
    "This particular pet had a %.1f percent probability "
    "of getting adopted." % (100 * prob)
)

示例 2: 或者,如果您有多行以与火车数据相同的顺序出现

predict_dataset = tf.convert_to_tensor([
    [5.1, 3.3, 1.7, 0.5,],
    [5.9, 3.0, 4.2, 1.5,],
    [6.9, 3.1, 5.4, 2.1]
])

# training=False is needed only if there are layers with different
# behavior during training versus inference (e.g. Dropout).
predictions = new_model(predict_dataset, training=False)

for i, logits in enumerate(predictions):
  class_idx = tf.argmax(logits).numpy()
  p = tf.nn.softmax(logits)[class_idx]
  name = class_names[class_idx]
  print("Example  prediction:  (:4.1f%)".format(i, name, 100*p))

【讨论】:

以上是关于从 tensorflow 2.0 中保存的模型运行预测的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tensorflow 2.0 w/keras 中保存/恢复大型模型?

TensorFlow 2.0 在单 GPU 上训练模型

以第一性原理思维模型解读tensorFlow 2.0的架构设计

使用 tf.function 的 Tensorflow 2.0 模型非常慢,并且每次列车数量发生变化时都会重新编译。 Eager 的运行速度提高了大约 4 倍

TensorFlow模型持久化

如何修改 Tensorflow 2.0 中的 epoch 数?