Tensorflow给出的预测结果与Keras不同

3

我有一个使用1.10版本Tensorflow后端在Keras中训练的模型,现在我想要使用Tensorflow 2.4进行推断。

我已将.h5模型转换为SavedModel格式:

import tensorflow as tf
from tensorflow.keras.models import load_model
from tensorflow.python.saved_model import builder
from tensorflow.python.saved_model.signature_def_utils import predict_signature_def
from tensorflow.python.saved_model import tag_constants

def export_h5_to_pb(path_to_h5, export_path):
    if tf.executing_eagerly():
        tf.compat.v1.disable_eager_execution()
    loaded_model = load_model(path_to_h5)
    b = builder.SavedModelBuilder(export_path)
    signature = predict_signature_def(inputs={"inputs": loaded_model.input},
                                      outputs={"score": loaded_model.output})
    session = tf.compat.v1.Session()
    init_op = tf.compat.v1.global_variables_initializer()
    session.run(init_op)
    b.add_meta_graph_and_variables(
        sess=session, tags=[tag_constants.SERVING], signature_def_map={"serving_default": signature})
    b.save()
    
export_h5_to_pb('./trained_nework_VGG3_5comp.h5', './export/Servo/1')

Tensorflow预测给出的结果如下:

import tensorflow as tf
imported = tf.saved_model.load('./export/Servo/1', tags='serve')

f = imported.signatures["serving_default"]
f(inputs=tf.constant(test_payload))

> {'score': <tf.Tensor: shape=(1, 6), dtype=float32, numpy=array([[0.16693498, 0.16678475, 0.16666655, 0.16653116, 0.16678214,
     0.16630043]], dtype=float32)>}

当原始的(正确的)Keras预测为:

from keras.models import load_model

model = load_model('./trained_nework_VGG3_5comp.h5')
model.predict(test_payload)

> array([[1.0000000e+00, 3.0078113e-09, 2.0143587e-10, 5.7580127e-09, 1.9100479e-09, 4.1776910e-10]], dtype=float32)

我做错了什么?
1个回答

0

我曾经遇到过一个非常类似的问题,你在这里回答了我的问题,现在我来分享一下解决方法。如果你是在做Sagemaker/AWS(从文件目录路径和使用“payload”这个词可以看出),那么问题是由于TensorFlow版本不一致引起的。

在我找到的所有博客中(例如这篇),他们在使用TensorflowModel加载模型时都使用了framework_version 1.12。因此,我在Sagemaker Jupyter实例中重新安装了TensorFlow 1.12版本,使用1.12重新训练了我的模型,并将framework_version更改为1.12,这对我有用。如果你没有在AWS上使用模型,这可能并不适用,但如果你在使用,这是一个潜在的解决方案。祝你好运!


我通过使用新的TF版本重新训练成功解决了这个问题。之后SavedModel按预期工作。虽然不是我希望的解决方案,但至少现在它可以正常工作了。 - alex

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