背景介绍:
使用keras_bert训练了模型,采用三种方式分别保存了模型结构、模型权重和完整模型,其中模型结构为json格式,模型权重和完整模型都是h5格式。tensorflow = 1.14,2.0以后貌似更加简单了
保存代码:
现在的需求是将h5模型转为SavedModel格式,并通过tf_serving部署。
Step1:格式转换
1.1 加载h5模型
参考:
keras模型保存和加载_fu6543210的博客-CSDN博客blog.csdn.net注意:使用原生keras,tf.keras出现意想不到的错误。
1.1.1 json、load_weights方式
除了json以外,还有yaml方法。这种保存的都是模型结构,无法直接进行inference,需要加载权重。API:keras.model.model_from_config,model.load_weights()。没有使用这种方法,就不过多展开。
1.1.2 完整模型加载
API:model = keras.models.load_model(‘模型路径’)
坑1:使用上述代码直接加载模型的时候会出现:ValueError: Unknown layer: TokenEmbedding
原因:keras_bert这个包的需求
解决:
from keras_bert import get_custom_objects
model = keras.models.load_model('model.h5', custom_objects = get_custom_objects())
如果还是出现ValueError: Unknown layer: xxx,很可能是因为你用了tf.keras
1.2 转为SavedModel
1.2.1 创建bulider、回复计算图
参考:
https://zhuanlan.zhihu.com/p/81999483zhuanlan.zhihu.com上面的链接有一些api使用会出错,我的代码如下
import keras.backend as K
K.set_learning_phase(0)
export_path = '../models_pb'
builder = tf.saved_model.Builder(export_path)
signature_def_map = {
"predict": tf.saved_model.build_signature_def(
# 根据自己模型的要求
inputs = {"input0": tf.saved_model.build_tensor_info(model.input[0]),
"input1": tf.saved_model.build_tensor_info(model.input[1])},
out