1.SavedModel和HDF5加载TensorFlow模型

为了加载一个TensorFlow模型,我们首先需要明确模型的格式。TensorFlow支持多种模型格式,但最常见的两种是SavedModel和HDF5(对于Keras模型)。这里,我将分别给出加载这两种模型格式的示例代码。

1.1加载SavedModel格式的TensorFlow模型

SavedModel是TensorFlow推荐的高级格式,用于保存和加载整个TensorFlow程序,包括TensorFlow图和检查点。

示例代码

假设你已经有一个训练好的SavedModel模型保存在./saved_model目录下。

import tensorflow as tf  

# 加载模型
loaded_model = tf.saved_model.load('./saved_model') # 查看模型的签名
print(list(loaded_model.signatures.keys())) # 假设你的模型有一个名为`serving_default`的签名,并且接受一个名为`input`的输入
# 你可以这样使用模型进行预测(假设输入数据为x_test)
# 注意:这里的x_test需要根据你的模型输入进行调整
import numpy as np # 假设输入是一个简单的numpy数组
x_test = np.random.random((1, 28, 28, 1)) # 例如,用于MNIST模型的输入 # 转换为Tensor
x_test_tensor = tf.convert_to_tensor(x_test, dtype=tf.float32) # 创建一个批次,因为大多数模型都期望批次输入
input_data = {'input': x_test_tensor} # 调用模型
predictions = loaded_model.signatures['serving_default'](input_data) # 打印预测结果
print(predictions['output'].numpy()) # 注意:这里的'output'需要根据你的模型输出调整

1.2加载HDF5格式的Keras模型

HDF5格式是Keras(TensorFlow高层API)用于保存和加载模型的常用格式。

示例代码

假设你有一个Keras模型保存在model.h5文件中。

from tensorflow.keras.models import load_model  

# 加载模型
model = load_model('model.h5') # 查看模型结构
model.summary() # 假设你有一组测试数据x_test和y_test
# 注意:这里的x_test和y_test需要根据你的数据集进行调整
import numpy as np x_test = np.random.random((10, 28, 28, 1)) # 假设的输入数据
y_test = np.random.randint(0, 10, size=(10, 1)) # 假设的输出数据 # 使用模型进行预测
predictions = model.predict(x_test) # 打印预测结果
print(predictions)

1.3注意

  • 确保你的模型文件路径(如'./saved_model''model.h5')是正确的。
  • 根据你的模型,你可能需要调整输入数据的形状和类型。
  • 对于SavedModel,模型的签名(signature)和输入输出名称可能不同,需要根据你的具体情况进行调整。
  • 这些示例假设你已经有了模型文件和相应的测试数据。如果你正在从头开始,你需要先训练一个模型并保存它。

2.TensorFlow中加载SavedModel模型

在TensorFlow中加载SavedModel模型是一个相对直接的过程。SavedModel是TensorFlow的一种封装格式,它包含了完整的TensorFlow程序,包括计算图(Graph)和参数(Variables),以及一个或多个tf.function签名(Signatures)。这些签名定义了如何向模型提供输入和获取输出。

以下是在TensorFlow中加载SavedModel模型的步骤和示例代码:

2.1步骤

(1)确定SavedModel的路径:首先,你需要知道SavedModel文件被保存在哪个目录下。这个目录应该包含一个saved_model.pb文件和一个variables目录(如果模型有变量的话)。

(2)使用tf.saved_model.load函数加载模型:TensorFlow提供了一个tf.saved_model.load函数,用于加载SavedModel。这个函数接受SavedModel的路径作为参数,并返回一个tf.saved_model.Load对象,该对象包含了模型的所有签名和函数。

(3)访问模型的签名:加载的模型对象有一个signatures属性,它是一个字典,包含了模型的所有签名。每个签名都有一个唯一的键(通常是serving_default,但也可以是其他名称),对应的值是一个函数,该函数可以接收输入并返回输出。

(4)使用模型进行预测:通过调用签名对应的函数,并传入适当的输入数据,你可以使用模型进行预测。

2.2示例代码

import tensorflow as tf  

# 加载SavedModel
model_path = './path_to_your_saved_model' # 替换为你的SavedModel路径
loaded_model = tf.saved_model.load(model_path) # 查看模型的签名
print(list(loaded_model.signatures.keys())) # 通常会有一个'serving_default' # 假设你的模型有一个名为'serving_default'的签名,并且接受一个名为'input'的输入
# 你可以这样使用模型进行预测(假设你已经有了适当的输入数据x_test) # 注意:这里的x_test需要根据你的模型输入进行调整
# 假设x_test是一个Tensor或者可以转换为Tensor的numpy数组
import numpy as np x_test = np.random.random((1, 28, 28, 1)) # 例如,对于MNIST模型的一个输入 # 将numpy数组转换为Tensor
x_test_tensor = tf.convert_to_tensor(x_test, dtype=tf.float32) # 创建一个字典,将输入Tensor映射到签名的输入参数名(这里是'input')
# 注意:'input'这个名称需要根据你的模型签名进行调整
input_data = {'input': x_test_tensor} # 调用模型
predictions = loaded_model.signatures['serving_default'](input_data) # 获取预测结果
# 注意:这里的'output'需要根据你的模型输出签名进行调整
# 如果你的模型有多个输出,你可能需要访问predictions字典中的多个键
predicted_output = predictions['output'].numpy() # 打印预测结果
print(predicted_output)

请注意,上面的代码示例假设你的模型签名有一个名为input的输入参数和一个名为output的输出参数。然而,在实际应用中,这些名称可能会根据你的模型而有所不同。因此,你需要检查你的模型签名以了解正确的参数名称。你可以通过打印loaded_model.signatures['serving_default'].structured_outputs(对于TensorFlow 2.x的某些版本)或检查你的模型训练代码和保存逻辑来获取这些信息。

3.TensorFlow中加载SavedModel模型进行预测示例

在TensorFlow中加载SavedModel模型是一个直接的过程,它允许你恢复之前保存的整个TensorFlow程序,包括计算图和权重。以下是一个详细的示例,展示了如何在TensorFlow中加载一个SavedModel模型,并对其进行预测。

首先,确保你已经有一个SavedModel模型保存在某个目录中。这个目录应该包含一个saved_model.pb文件(或者在新版本的TensorFlow中可能不包含这个文件,因为图结构可能存储在variables目录的某个子目录中),以及一个variables目录,其中包含了模型的权重和变量。

3.1示例代码

import tensorflow as tf  

# 指定SavedModel的保存路径
saved_model_path = './path_to_your_saved_model' # 请替换为你的SavedModel实际路径 # 加载SavedModel
loaded_model = tf.saved_model.load(saved_model_path) # 查看模型的签名
# 注意:SavedModel可以有多个签名,但通常会有一个默认的'serving_default'
print(list(loaded_model.signatures.keys())) # 假设模型有一个默认的'serving_default'签名,并且我们知道它的输入和输出
# 通常,这些信息可以在保存模型时通过tf.function的inputs和outputs参数指定 # 准备输入数据
# 这里我们使用随机数据作为示例,你需要根据你的模型输入要求来调整
import numpy as np # 假设模型的输入是一个形状为[batch_size, height, width, channels]的Tensor
# 例如,对于MNIST模型,它可能是一个形状为[1, 28, 28, 1]的Tensor
input_data = np.random.random((1, 28, 28, 1)).astype(np.float32) # 将numpy数组转换为Tensor
input_tensor = tf.convert_to_tensor(input_data) # 创建一个字典,将输入Tensor映射到签名的输入参数名
# 注意:这里的'input_tensor'需要根据你的模型签名中的输入参数名来调整
# 如果签名中的输入参数名确实是'input_tensor',则保持不变;否则,请替换为正确的名称
# 但在很多情况下,默认的名称可能是'input'或类似的东西
input_dict = {'input': input_tensor} # 假设输入参数名为'input' # 调用模型进行预测
# 使用签名对应的函数,并传入输入字典
predictions = loaded_model.signatures['serving_default'](input_dict) # 获取预测结果
# 预测结果通常是一个字典,其中包含了一个或多个输出Tensor
# 这里的'output'需要根据你的模型签名中的输出参数名来调整
# 如果签名中只有一个输出,并且它的名字是'output',则可以直接使用;否则,请替换为正确的键
predicted_output = predictions['output'].numpy() # 打印预测结果
print(predicted_output) # 注意:如果你的模型有多个输出,你需要从predictions字典中访问每个输出
# 例如:predictions['second_output'].numpy()

3.2注意事项

(1)输入和输出名称:在上面的示例中,我使用了inputoutput作为输入和输出的名称。然而,这些名称可能并不适用于你的模型。你需要检查你的模型签名来确定正确的输入和输出参数名。你可以通过打印loaded_model.signatures['serving_default'].structured_inputsloaded_model.signatures['serving_default'].structured_outputs(对于TensorFlow 2.x的某些版本)来查看这些信息。

(2)数据类型和形状:确保你的输入数据具有模型期望的数据类型和形状。如果数据类型或形状不匹配,可能会导致错误。

(3)批处理:在上面的示例中,我创建了一个包含单个样本的批次。如果你的模型是为批处理而设计的,并且你希望一次性处理多个样本,请相应地调整输入数据的形状。

(4)错误处理:在实际应用中,你可能需要添加错误处理逻辑来处理加载模型时可能出现的任何异常,例如文件不存在或模型格式不正确。

Python 加载 TensorFlow 模型的更多相关文章

  1. 开园第一篇---有关tensorflow加载不同模型的问题

    写在前面 今天刚刚开通博客,主要想法跟之前某位博主说的一样,希望通过博客园把每天努力的点滴记录下来,也算一种坚持的动力.我是小白一枚,有啥问题欢迎各位大神指教,鞠躬~~ 换了新工作,目前手头是OCR项 ...

  2. 6_1 持久化模型与再次加载_探讨(1)_三种持久化模型加载方式以及import_meta_graph方式加载持久化模型会存在的变量管理命名混淆的问题

    笔者提交到gitHub上的问题描述地址是:https://github.com/tensorflow/tensorflow/issues/20140 三种持久化模型加载方式的一个小结论 加载持久化模型 ...

  3. 深度学习之加载VGG19模型分类识别

    主要参考博客: https://blog.csdn.net/u011046017/article/details/80672597#%E8%AE%AD%E7%BB%83%E4%BB%A3%E7%A0% ...

  4. ceisum_加载倾斜摄影模型

    osgb转换为3Dtiles格式(使用工具转换) 然后加载到cesium中(加载代码见下,可以控制模型高度) var offset = function(height,tileset) { conso ...

  5. xBIM 实战02 在浏览器中加载IFC模型文件并设置特效

    系列目录    [已更新最新开发文章,点击查看详细]  在模型浏览器中加载模型后,可以对模型做一些特殊操作.下图是常用的设置. 都是通过 xbim-viewer.js 中的 API 来设置以达到一定的 ...

  6. xBIM 实战01 在浏览器中加载IFC模型文件

    系列目录    [已更新最新开发文章,点击查看详细]  一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5  选择一个空的项目 新建完成后,项目结构如下: 二.添 ...

  7. cesium 学习(五) 加载场景模型

    cesium 学习(五) 加载场景模型 一.前言 现在开始实际的看看效果,目前我所接触到基本上都是使用Cesium加载模型这个内容,以及在模型上进行操作.So,现在进行一些加载模型的学习,数据的话可以 ...

  8. cesium加载gltf模型

    cesium加载gltf模型 一.采用vue-cesium:在项目里加载依赖包.命令如下: npm i --save vue-cesium 在main.js中加入如下代码: https://www.n ...

  9. WebGL three.js学习笔记 加载外部模型以及Tween.js动画

    WebGL three.js学习笔记 加载外部模型以及Tween.js动画 本文的程序实现了加载外部stl格式的模型,以及学习了如何把加载的模型变为一个粒子系统,并使用Tween.js对该粒子系统进行 ...

  10. live2d web端加载moc3模型

    大佬博客链接:https://blog.csdn.net/weixin_44128558/article/details/104792345 照着大佬的博客做一下,可以先学会怎么生成bundle.js ...

随机推荐

  1. WAV音频文件按秒切片段

    wav音频文件按秒切片段 import wave def split_wav_by_seconds(input_file, output_file, start_second, end_second) ...

  2. QT学习:06 常用的全局变量与宏定义

    --- title: framework-cpp-qt-06-常用的全局变量与宏定义 EntryName: framework-cpp-qt-06-global date: 2020-04-10 11 ...

  3. debian11 简单搭建go环境

    简单环境,目前仅支持单版本go,后续可以考虑直接把go环境放到docker中或podman中,这样每个容器都是一套go版本. 新建文件夹目录 # 我直接用的root账户 cd /root mkdir ...

  4. MySQL 获取所有表名、所有表结构

    获取所有表名 SELECT A.TABLE_SCHEMA '数据库', A.TABLE_NAME '表名', A.TABLE_ROWS '表记录行数', A.CREATE_TIME '创表时间', A ...

  5. redis出现错误提示MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for......

    某天,redis出现了这样一个错误提示: MISCONF Redis is configured to save RDB snapshots, but is currently not able to ...

  6. springboot实现异步调用demo

    springboot实现异步调用 异步调用特点 异步调用在开发程序中被广泛应用,在异步任务中,主线程不需要阻塞等待异步任务的完成,而是可以继续处理其他请求. 异步调用的特点如下: 非阻塞:主线程在调用 ...

  7. vue中的<script setup>与<script>

    <script setup>是在vue3.2之后新增的语法糖,简化了API的写法 1.声明的变量无需return,可以直接在模板中使用,实现了顶层的绑定 2.引入组件会自动注册,无需再使用 ...

  8. k8s(3) 集群运行

    Master下面执行 mkdir -p $HOME/.kube 执行的脚本,需要读取的配置文件 cp -i /etc/kubernetes/admin.conf $HOME/.kube/config ...

  9. 【SQL】 牛客网SQL训练Part2 中等难度

    查找当前薪水详情以及部门编号dept_no 查找 1.各个部门当前领导的薪水详情以及其对应部门编号dept_no, 2.输出结果以salaries.emp_no升序排序, 3.并且请注意输出结果里面d ...

  10. “refer to”和“refer to as”在英语中的用法有所不同

    "refer to"和"refer to as"在英语中的用法有所不同,具体区别如下: Refer to "Refer to"意为" ...