如何在不同机器上保存并加载集成Universal Sentence Encoder的Keras模型
报错原因
H5格式为Keras旧版序列化格式,仅会存储hub.KerasLayer初始化时传入的路径字符串,不会打包Universal Sentence Encoder(USE)的结构与预训练权重,因此跨机器加载时会默认寻找源机器的USE存储路径,触发路径不存在报错。同时H5格式本身无法实现将USE完整打包进单个.h5文件的需求。
解决方案
方案1:仅修改加载逻辑,无需重新保存模型
如果不想改动机器A上的模型保存逻辑,可在机器B加载时通过自定义KerasLayer初始化参数替换路径:
import tensorflow as tf import tensorflow_hub as hub from tensorflow.keras.models import load_model # 替换为机器B上的USE实际存储路径 local_use_path = "/different/path/on/machine/B/universal-sentence-encoder_4" def custom_use_layer(*args, **kwargs): # 覆盖原有路径参数 kwargs["handle"] = local_use_path return hub.KerasLayer(*args, **kwargs) # 加载时传入自定义层 model = load_model("model.h5", custom_objects={"KerasLayer": custom_use_layer})
方案2:打包所有依赖,无需使用者单独配置USE
改用TensorFlow原生的SavedModel格式存储模型,该格式会自动将USE的结构、权重以及你的业务层参数全部打包到同一目录下,使用者无需单独部署USE环境:
- 机器A上重新保存模型:
# 原有训练逻辑不变,仅修改保存代码 model.save("text_classifier", save_format="tf")
- 将生成的
text_classifier目录打包传输到机器B,直接加载即可:
model = tf.keras.models.load_model("text_classifier")
注意事项
- 保存与加载的TensorFlow版本建议保持一致,避免出现兼容性问题
- SavedModel为目录格式,可压缩为单个压缩包传输,使用前解压即可
内容的提问来源于stack exchange,提问作者E.K.
相关产品推荐
相关产品推荐

