Python Tensorflow给出的预测与Keras不同

Python Tensorflow给出的预测与Keras不同,python,tensorflow,keras,predict,Python,Tensorflow,Keras,Predict,我有一个在Keras中使用1.10 Tensorflow后端训练的模型,我想使用Tensorflow 2.4进行推断 我将.h5模型转换为SavedModel格式: 将tensorflow导入为tf 从tensorflow.keras.models导入负载_模型 从tensorflow.python.saved_模型导入生成器 从tensorflow.python.saved_model.signature_def_utils导入predict_signature_def 从tensorflow

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

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

将tensorflow导入为tf
从tensorflow.keras.models导入负载_模型
从tensorflow.python.saved_模型导入生成器
从tensorflow.python.saved_model.signature_def_utils导入predict_signature_def
从tensorflow.python.saved_model导入标记_常量
def导出_h5_至_pb(路径_至_h5,导出路径):
如果tf.急切地执行_():
tf.compat.v1.disable_eager_execution()
加载模型=加载模型(路径到路径h5)
b=builder.SavedModelBuilder(导出路径)
signature=predict\u signature\u def(输入={“输入”:加载的\u model.input},
outputs={“score”:加载的_model.output})
session=tf.compat.v1.session()
init_op=tf.compat.v1.global_variables_initializer()
session.run(初始化操作)
b、 添加元图和变量(
sess=session,tags=[tag_constants.SERVING],signature_def_map={“SERVING_default”:signature})
b、 保存()
将h5输出到pb(‘/经过培训的网络公司VGG3公司h5’,‘/输出/伺服/1’)
Tensorflow预测给了我:

将tensorflow导入为tf
imported=tf.saved_model.load('./export/Servo/1',tags='serve')
f=已导入。签名[“提供默认值”]
f(输入=tf常数(测试有效载荷))
>{'score':}
而原始(正确的)Keras预测给出:

从keras.models导入负载模型
模型=负载模型('./经过培训的网络VGG3公司h5')
模型预测(测试单元有效载荷)
>数组([[1.0000000e+00,3.0078113e-09,2.014587e-10,5.7580127e-09,1.9100479e-09,4.1776910e-10]],数据类型=float32)

我做错了什么?

我有一个非常类似的问题,您已经回答了,我将与您分享对我有效的方法。如果您是为Sagemaker/AWS这样做的(通过文件目录路径和使用单词“payload”,我认为您是?),那么问题是由TensorFlow版本中的差异引起的


在我发现的所有博客中(例如),当使用TensorflowModel加载模型时,他们都使用framework_版本1.12。因此,我在Sagemaker Jupyter实例中将TensorFlow重新安装到版本1.12,使用1.12重新训练我的模型,并将framework_版本更改为1.12,这对我来说很有效。如果您不使用AWS的模型,那么这可能不适用,但如果您使用AWS,那么这是一个潜在的解决方案。祝你好运

我设法通过使用新的TF版本进行再培训来解决这个问题。之后,SavedModel按预期工作。这不是我所希望的解决方案,但至少它现在起作用了。