深入理解 TensorFlow 的模型保存与加载机制(SavedModel vs H5)

深入理解 TensorFlow 的模型保存与加载机制(SavedModel vs H5)

在使用 TensorFlow 进行模型训练后,模型的保存与加载是部署、复用和迁移学习的重要环节。TensorFlow 提供了两种主要的保存格式:SavedModelHDF5 (.h5)。本篇文章将详细对比它们的异同,并通过代码实战帮你掌握使用方法。


📦 一、为什么需要保存模型?

在训练完一个神经网络模型后,通常需要将模型持久化用于:

  • 模型部署(线上服务)
  • 迁移学习
  • 断点训练(Resume Training)
  • 团队共享模型

TensorFlow 支持以下两种主流保存方式:

格式文件扩展名支持特性
SavedModel无扩展名(文件夹)✅ 推荐格式,包含完整计算图,支持多语言部署(TF Serving、TensorFlow Lite 等)
HDF5.h5✅ Keras 风格保存,适合快速保存和加载模型

📂 二、SavedModel 格式详解

✅ 特点:

  • 官方推荐格式
  • 保存了计算图、变量值、优化器状态等全部信息。
  • 适用于 TensorFlow Serving、TensorFlow Lite、TF.js 等部署场景。
  • 支持自定义对象(如自定义层、自定义训练逻辑)。

🛠 保存模型:

model.save("my_model")  # 保存为SavedModel格式(默认)

会生成一个目录:

my_model/
├── assets/
├── variables/
│   ├── variables.data-00000-of-00001
│   └── variables.index
└── saved_model.pb

📥 加载模型:

loaded_model = tf.keras.models.load_model("my_model")

可以继续训练或直接用于预测。


💾 三、HDF5(.h5)格式详解

✅ 特点:

  • 更接近早期 Keras 用户的使用习惯。
  • 使用一个单一的 .h5 文件保存全部信息(结构、权重、优化器状态)。
  • 不兼容 TensorFlow Serving。

🛠 保存模型:

model.save("my_model.h5")  # 显式指定保存为HDF5格式

📥 加载模型:

loaded_model = tf.keras.models.load_model("my_model.h5")

⚠ 注意:如使用自定义层或自定义训练函数,加载时需使用 custom_objects 参数指定。


🔄 四、对比:SavedModel vs H5

对比项SavedModelHDF5 (.h5)
文件形式文件夹单一文件
保存信息结构 + 权重 + 优化器状态 + 计算图同上(不含完整计算图)
多语言部署✅ 支持❌ 不支持
TensorFlow Serving✅ 支持❌ 不支持
TensorFlow Lite 支持✅ 支持❌ 不支持
自定义训练逻辑支持✅ 更好✅ 有限支持
文件大小稍大相对较小

🧪 五、实战代码对比

以下是一个完整的模型保存与加载实战代码:

import tensorflow as tf
from tensorflow.keras import layers, models# 构建简单模型
model = models.Sequential([layers.Dense(64, activation='relu', input_shape=(100,)),layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')# 保存为 SavedModel
model.save("model_savedmodel")# 保存为 HDF5 格式
model.save("model.h5")# 加载 SavedModel
model1 = tf.keras.models.load_model("model_savedmodel")# 加载 HDF5
model2 = tf.keras.models.load_model("model.h5")

🔐 六、进阶话题:只保存权重 vs 保存结构

1. 只保存权重

model.save_weights("weights.h5")

加载:

model = create_model()  # 需先定义好模型结构
model.load_weights("weights.h5")

2. 保存结构(不含权重)

# 保存JSON格式结构
json_str = model.to_json()

加载结构:

model = tf.keras.models.model_from_json(json_str)

✅ 七、结语:选择哪种格式?

  • 如果你是部署服务或计划使用 TensorFlow Serving、TensorFlow Lite:推荐 SavedModel
  • 如果你是快速实验、迁移学习或保存简单模型HDF5 更方便
  • 如果只是保存参数,用于 Resume Training:save_weights() 即可。

📌 小贴士

  • model.save() 不指定扩展名时默认保存为 SavedModel。

  • 加载模型时也可以查看其结构和权重是否正确:

    model.summary()
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之特殊类设计及类型转换

目录 一、设计一个不能被拷贝的类 二、设计一个只能在堆上创建对象的类 三、设计一个只能在栈上创建对象的类 四、设计一个不能被继承的类 五、设计一个只能创建一个对象的类(单例模式) 六、C语言中的类型转换 七、C中的三类类型转换 八、C强制类型转换 8.1、为什么C需…

制作一款打飞机游戏36:调度编辑器

我们正在创建一个调度编辑器。嗯,这个名字听起来可能有点奇怪,对吧?但如果你了解射击游戏中的“调度”,那就是敌人出现的时间表。 你可能已经看到了,我们有一个可以滚动的关卡。现在,我想增加一些交互性&a…

wordperss AI插件:AI图文+视频+长尾关键词自动生成,已内置deepseek、kimi全模型,支持简单一键接入更多自定义API

【2.17最新版】Linkreate wordperss AI插件:AI图文视频长尾关键词自动生成,已内置deepseek、kimi全模型。 支持自定义接入其它API,包括但不限于腾讯云API和它的deepseek模型 后台只需要设置对应的API url 、模型 、API key,就可以让插件调用…

从零开始学Python:开启编程新世界的大门

在当今数字化时代,Python作为一门简洁、高效且功能强大的编程语言,受到了越来越多人的喜爱与追捧。无论是数据科学、人工智能、Web开发,还是自动化脚本编写,Python都展现出了卓越的能力。本文将带领大家踏上Python学习之旅&#x…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.2 缺失值检测与处理(NULL值填充/删除策略)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 缺失值检测与处理全攻略:NULL值填充与删除策略实战3.2 缺失值检测与处理3.2.1 缺失值类型与业务影响3.2.1.1 缺失值的三种形态3.2.1.2 业务影响分级 3.2.2 缺失值…

Java求职面试:Spring Boot与微服务的幽默探讨

Java求职者面试:技术与幽默的碰撞 场景概述 在某互联网大厂的面试现场,面试官严肃认真,程序员则是一个搞笑的水货角色。面试者名叫张伟,年龄28岁,硕士学历,拥有5年的Java开发经验。以下是面试的详细过程。…

使用 NGINX 实现 HTTP Basic 认证ngx_http_auth_basic_module 模块

一、前言 在 Web 应用中,对部分资源进行访问控制是十分常见的需求。除了基于 IP 限制、JWT 验证、子请求校验等方式外,最经典也最简单的一种方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模块支持基于用户名和密码的基…

map和set的设计以及红黑树的设计

1.map和set的底层是红黑树 2.map和set在STL是容器&#xff0c;在我看来&#xff0c;不过也是封装了平衡二叉搜索树红黑树的适配器 我们先看红黑树的设计&#xff0c;看完后map和set的封装易如反掌 #pragma once #include<utility> #include<iostream> using name…

Linux运维——Vim技巧二

Vim技巧 一、管理多个文件1.1、用缓冲区列表管理打开的文件1.2、用参数列表将缓冲区分组1.3、将工作区切分成窗口1.4、用标签页将窗口分组1.5、用:edit命令打开文件1.6、使用:find打开文件1.7、把文件保存到不存在的目录中 二、动作命令在文档中移动2.1、区分实际行与屏幕行2.2…

2025 年 408 真题及答案

2025 年 408 真题 历年408真题及答案下载直通车 1、以下 C 代码的时间复杂度是多少&#xff1f;&#xff08;&#xff09; int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、对于括号匹配问题&#xff0c;符号栈…

【MuJoCo仿真】开源SO100机械臂导入到仿真环境

主要参考&#xff1a;https://github.com/jpata/gym-so100/tree/integration/gym_so100/assets/trs_so_arm100 参考&#xff1a;&#xff08;八&#xff09;lerobot开源项目扩展so100的仿真操控&#xff08;操作记录&#xff09;_so100机械臂 仿真-CSDN博客 下载&#xff1a;…

Socat 用法详解:网络安全中的瑞士军刀

Socat 用法详解&#xff1a;网络安全中的强大工具 引言 socat&#xff08;SOcket CAT&#xff09;是一款功能强大的命令行工具&#xff0c;被誉为“网络瑞士军刀”&#xff0c;广泛应用于数据传输、端口转发和网络调试等场景。它支持多种协议和数据通道&#xff08;如文件、管…

永磁同步电机控制算法--基于PI和前馈的位置伺服控制

一、原理介绍 永磁同步伺服系统是包含了电流环、速度环和位置环的三环控制系统。 伺服系统通过电流检测电路和光电编码器检测电动机三相绕组电流和转子位置θ&#xff0c;通过坐标变换&#xff0c;计算出转矩电流分量iq和励磁电流分量id。 位置信号指令与实际转子位置信号的差…

Lucene多种数据类型使用说明

Lucene 作为一款高性能的全文检索引擎库&#xff0c;其核心功能围绕索引和搜索文本数据&#xff0c;但它也支持多种数据类型以满足复杂的应用场景。以下是 Lucene 支持的主要数据类型及其用途的详细说明&#xff1a; 1. 文本类型&#xff08;Text&#xff09; 用途&#xff1a;…

Web网页布局

目录 一、传统的DIVCSS布局&#xff08;使用率最高的&#xff09; 1.div传统的一块块转 2.以猫眼电影为例‘ 3.div布局格式&#xff08;唯一的id属性&#xff0c;不唯一写class重复的&#xff09; 3.2总体布局样式 二、HTML5语义标签CSS3布局 1.把div改为绿色的语义标签…

大模型基础(五):transformers库(下):快速分词器、自动配置类、快速微调

transformers库&#xff08;下&#xff09; 1 快速分词器1.1 Fast 分词器的核心特点1.2 对比示例1.3 何时使用 Fast 分词器&#xff1f;1.4 注意事项 2 自动配置类 AutoConfig2.1 核心功能2.2 基本用法2.3 主要应用场景2.4 常用函数2.5 与具体配置类的区别2.6 注意事项 3 快速微…

在pycharm profession 2020.3上离线安装.whl类型的包(以PySimpleGUI为例)

今天写个小代码&#xff0c;用到了PySimpleGUI。 在pycharm profession 2020.3的项目中的Terminal里运行如下代码即可安装。 python3 -m pip install --force-reinstall --extra-index-url https://PySimpleGUI.net/install PySimpleGUI 安装方法如图&#xff1a; 安装后使用…

SpringBoot整合RabbitMQ(Java注解方式配置)

1.生产端 1. 创建生产者SpringBoot工程 2. 引入start&#xff0c;依赖坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 3. 编写yml配置&#xff0c;基本…

分析strtol(),strtoul()和strtod()三个函数的功能

字符串转换为数值部分和子字符串首地址的函数有strtol(),strtoul()和strtod()三个函数。 1、strtol()函数 long int strtol(const char *str, char **endptr, int base) //当base0时,若字符串不是以"0","0x"和"0X"开头,则将数字部分按照10进制…

Spring 的事务隔离

在Spring框架中&#xff0c;事务管理是一个非常重要的方面&#xff0c;它允许开发者以声明式的方式定义事务边界&#xff0c;并且通过配置不同的隔离级别来控制并发事务的行为。Spring支持多种事务管理方式&#xff0c;包括编程式事务管理和声明式事务管理&#xff08;如使用Tr…