tf.saved_model.save要求路径为干净目录而非文件,如"./my_saved_model";模型需为tf.keras.Model或可追踪对象;加载时需区分tf.keras.models.load_model(支持.predict())与tf.saved_model.load(需signature调用)。
tf.saved_model.save 保存模型时路径必须是目录,不能是文件名
直接用
会报错,因为
要求第二个参数是**空目录路径**,不是文件。TensorFlow 会自己在该路径下创建
、
和
等结构。
常见错误现象:
或
,往往是因为路径不存在或传入了带后缀的文件名。
正确做法:确保路径是干净目录,例如
如果目录已存在,TensorFlow 默认会覆盖(不报错),但建议先清理:
模型必须是
实例或带
的自定义对象,且所有计算逻辑需可追踪(即不能含纯 Python 控制流,如
,应改用
)
加载 tf.saved_model 需用 tf.keras.models.load_model 或 tf.saved_model.load
两种加载方式用途不同,选错会导致后续调用失败:
:返回标准
对象,支持
、
(如果保存时含 optimizer)、
等;适合继续训练或推理
:返回一个
可调用对象(或带签名的
),更底层,适合部署场景(如 TensorFlow Serving);它不保证有
方法,需通过
显式调用
若保存时用了
参数,加载后必须按对应 signature 名调用,否则报
保存带自定义层或损失函数的模型要显式传参
如果模型用了自定义
或自定义 loss,
默认无法序列化它们,加载时会提示
或
。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
解决方法:保存时加
参数 —— 但注意,
**本身不接受**
参数,这是
的用法
正确做法是:改用
并指定
,同时传入
:
或者,在自定义类中实现
和
,并确保类在加载环境里已定义(推荐)
tf.saved_model 格式不保存训练状态(optimizer weights)除非显式要求
默认情况下,
只保存模型结构和参数(
),不保存
的内部状态(比如 Adam 的
、
)。所以加载后不能直接
接续训练。
若需恢复训练:保存前确保模型已编译,并传入
(仅对
有效)
不支持
,所以必须用
检查是否保存了 optimizer:加载后运行
,若为
就说明没存;也可以看保存目录下是否有
之外的 optimizer 相关文件(通常没有)
最易被忽略的是:签名(signature)和自定义对象的加载环境一致性。哪怕只差一个类定义位置或版本,
都可能静默失败或在调用时才抛异常。
tf.saved_model.save(model, "model.h5")tf.saved_model.saveassets/variables/saved_model.pbNotImplementedError: Saving custom objects not supportedTypeError: expected str, bytes or os.PathLike, not NoneTypetf.saved_model.save(model, "./my_saved_model")import shutil; shutil.rmtree("./my_saved_model", ignore_errors=True)tf.keras.Model__call__if x > 0:tf.condtf.keras.models.load_model("./my_saved_model")tf.keras.Model.predict().fit().summary()tf.saved_model.load("./my_saved_model")ConcreteFunctionMetaGraph.predictinference = loaded.signatures["serving_default"]signatures=...KeyError: 'serving_default'tf.keras.layers.Layertf.saved_model.saveValueError: Unknown layerAttributeError: 'NoneType' object has no attribute 'name'custom_objectstf.saved_model.savecustom_objectsmodel.save(..., save_format="h5")tf.keras.models.save_modelsave_format="tf"custom_objectstf.keras.models.save_model(
model,
"./my_custom_model",
save_format="tf",
custom_objects={"MyCustomLayer": MyCustomLayer}
)get_config()from_config()tf.saved_model.savetrainable_variablesoptimizermvmodel.fit()include_optimizer=Truetf.keras.models.save_modeltf.saved_model.saveinclude_optimizertf.keras.models.save_model(..., save_format="tf")loaded.optimizerNonevariables/variables.indextf.saved_model.load