我在Keras中开发了两个不同版本的模型,并将它们转换为Tensorflow,如下所示:
import keras.backend as K
from keras.models import load_model, Sequential
from tensorflow.python.saved_model import builder as saved_model_builder
from tensorflow.python.saved_model import tag_constants, signature_constants
from tensorflow.python.saved_model.signature_def_utils_impl import predict_signature_def
# reset session
K.clear_session()
sess = tensorflow.Session()
K.set_session(sess)
# disable loading of learning nodes
K.set_learning_phase(0)
# load model
model = load_model('model.h5')
config = model.get_config()
weights = model.get_weights()
new_Model = Sequential.from_config(config)
new_Model.set_weights(weights)
# export saved model
export_path = 'export-pb-variables'
builder = saved_model_builder.SavedModelBuilder(export_path) #builder = tf.saved_model.builder.SavedModelBuilder(export_path)
signature = predict_signature_def(inputs={'input': new_Model.input},
outputs={'output': new_Model.output})
with K.get_session() as sess:
builder.add_meta_graph_and_variables(
sess=sess,
tags=[tag_constants.SERVING],
signature_def_map={
signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature}
)
builder.save()
每个模型都生成.pb文件以及变量文件夹。然后,我测试了可以使用这些文件来还原模型并以这种方式获得预测:
# reset session
keras.backend.clear_session()
sess = tf.Session()
keras.backend.set_session(sess)
with keras.backend.get_session() as sess:
tf.saved_model.loader.load(sess, [tag_constants.SERVING], path_to_exported_model)
result = sess.run('dense_1/Sigmoid:0', feed_dict={'lstm1_input_1:0': one_input_example})
print(result)
在本地,这两个版本是可复制的,并且对于不同的输入参数,应该给我不同的结果。但是,将它们上传到GC以便使用ML Engine进行预测后,这两个版本会产生相同的结果(与本地两个版本中的任何一个的结果都大不相同)。如果我测试其他输入示例,结果将再次相同(但不同输入之间的结果并不完全相同)
您能告诉我可能是什么原因吗?