PyTorch中只保存权重应使用torch.save(model.state_dict(), path),而非torch.save(model, path);后者保存完整模型(结构+权重+优化器状态),体积大、有安全风险且版本兼容性差;加载权重前必须先实例化结构完全一致的模型,并调用load_state_dict(),推荐始终使用weights_only=True确保安全。

只保存权重用 model.save_weights(),不是 model.save()
很多人误以为 model.save() 是“保存模型”,其实它默认保存的是完整模型(架构 + 权重 + 优化器状态),文件体积大、加载时依赖原始代码定义。如果只想存参数(比如做模型蒸馏、迁移学习、或部署时分离权重和结构),必须显式调用 model.save_weights()。
常见错误现象:model.save('my_model.h5') 后试图用 tf.keras.models.load_model() 加载失败,报错 ValueError: No model found in config file 或无法重建自定义层——因为那根本不是权重文件,而是全模型 HDF5。
-
model.save_weights('weights.h5'):生成纯权重 HDF5,兼容性好,适合 TensorFlow 2.x 通用场景 -
model.save_weights('weights')(无后缀):会自动保存为 TensorFlow 检查点格式(checkpoint+data-00000-of-00001),更轻量,但加载时需先有相同结构的模型实例 - 不推荐用
.ckpt手动拼后缀——TensorFlow 会自动管理,硬写可能引发路径解析异常
加载权重前必须先构建相同结构的模型
model.load_weights() 不恢复架构,只填充变量值。这意味着你不能直接从权重文件“复活”一个模型——必须先用完全一致的代码(层类型、顺序、输入形状、自定义类注册)创建空模型,再调用 load_weights()。
典型踩坑场景:
- 训练时用了自定义
tf.keras.layers.Layer,加载时没 import 对应类 → 报错Unknown layer - 训练模型输入 shape 是
(32, 32, 3),加载时新建模型设成(224, 224, 3)→ 权重张量 shape 不匹配,报Shape mismatch - 用
Sequential训练,但加载时改用FunctionalAPI 构建 → 层名/顺序不同,权重映射失败
验证方式:加载后执行 model.weights,检查数量和 shape 是否与训练模型一致。
save_weights_only=True 在 ModelCheckpoint 中才生效
训练中自动保存最佳权重,靠的是 tf.keras.callbacks.ModelCheckpoint。注意:它的 save_weights_only 参数只在回调里起作用,和 model.save_weights() 是两套机制。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
正确写法:
cp_callback = tf.keras.callbacks.ModelCheckpoint(
filepath='best_weights.h5',
save_weights_only=True, # ← 关键:设为 True 才只存权重
monitor='val_loss',
save_best_only=True
)
容易忽略的点:
- 如果
filepath写成'best_model.h5'却设save_weights_only=True,结果仍是权重文件,但名字误导人 -
save_freq='epoch'时,每个 epoch 都覆盖同名文件;想保留多版本,得用格式化字符串如'weights_ep{epoch:02d}.h5' - 检查点路径不含扩展名(如
'ckpt')时,TensorFlow 默认用检查点格式;加了.h5才强制走 HDF5
HDF5 vs 检查点:选哪个取决于部署环境
两种权重格式没有绝对优劣,差异集中在使用链路上:
-
.h5:单文件、易传输、支持跨平台读取,但无法增量保存(每次全量写入),且 HDF5 库需额外安装 - 检查点(无后缀或
.index+.data):支持断点续训、内存映射友好、TensorFlow 原生支持,但文件多、路径管理稍烦,不适合直接发给非 TensorFlow 环境
真实项目里,训练服务器常用检查点做容错,交付给边缘设备则转成 .h5 或进一步转 TFLite —— 这个转换环节最容易漏掉权重加载验证,务必在目标环境跑一次 model.load_weights() + model.predict() 对比输出。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










