.h5转onnx,获取onnx中间层特征值

0. 背景

因为近些年工作中基本都是使用pytorch框架,tensorflow框架还是最初的时候使用过一段时间,现在一个项目中给到的训练后的模型是基于tensorflow keras保存的.h5文件。但是在后面部署的时候需要使用onnx进行,所以需要进行一下模型的转换。

环境依赖

这些库之间都互相有依赖关系,经过多次尝试,各个库版本如下
tensorflow 2.11.0
onnx 1.11.0
protobuf 3.19.0
tf2onnx 1.14.0
numpy 1.20.0

步骤1. 从一个HDF5文件中加载一个Keras模型,并将其保存为TensorFlow的原生格式。

步骤2. 将TensorFlow模型(SavedModel格式)转换为ONNX(Open Neural Network Exchange)格式

整体代码和后续命令的意义可以分为两部分来解释:

import keras

model_path = "model2/model2.h5"
model = keras.models.load_model(model_path)
model.summary()

model.save('model_2_tfmodel', save_format='tf')
python -m tf2onnx.convert --saved-model ./model_2_tfmodel/ --output ./model2.onnx --opset 11 --verbose

第一部分(Python代码):

设置模型路径并加载模型:

model_path = "model2/model2.h5"  
model = keras.models.load_model(model_path)

这部分代码的作用是设置Keras模型(.h5格式)的路径,并将其加载到内存中,存储在变量model中。

model.summary()

这行代码用于打印模型的架构摘要,包括各层的名称、输出形状和参数数量。

保存模型为TensorFlow SavedModel格式:

model.save('model_2_tfmodel', save_format='tf')

这里,模型被保存为TensorFlow的SavedModel格式,这是一种更为通用和可移植的格式,特别适用于在不同平台或工具之间共享模型。

第二部分(命令行命令):

python -m tf2onnx.convert --saved-model ./model_2_tfmodel/ --output ./model2.onnx --opset 11 --verbose

这条命令使用了tf2onnx工具,该工具用于将TensorFlow模型(SavedModel格式)转换为ONNX(Open Neural Network Exchange)格式。ONNX是一个用于表示深度学习模型的开放标准,旨在使模型能够在不同的深度学习框架之间轻松交换。

–saved-model ./model_2_tfmodel/ 指定了要转换的TensorFlow SavedModel的路径。
–output ./model2.onnx 指定了转换后的ONNX模型的输出路径和文件名。
–opset 11 指定了ONNX操作符集(opset)的版本,这对于确保模型在不同框架之间的兼容性和功能正确性很重要。
–verbose 是一个可选参数,用于在转换过程中输出更多详细信息,有助于调试和了解转换过程的进展。
综上所述,整体代码和命令的意义是:首先,使用Keras加载一个预训练的深度学习模型,查看其结构摘要,并将其保存为TensorFlow SavedModel格式。然后,使用tf2onnx工具将该SavedModel转换为ONNX格式,以便在不同的深度学习框架或工具中使用。

keras指定输出特定层的特征值

from tensorflow.keras.models import Model
model = load_model('./tsimplemodel.h5')
# 创建一个新的 model,该 model 的输出是中间层的输出 -2为倒数第二层 -1为倒数第一层
intermediate_layer_model = Model(inputs=model.input, outputs=model.layers[-3].output)

基于onnx获取指定层的输出特征值

在部署的时候,把上面的keras保存的.h5文件,转换为了onnx文件,同样想获取对应层的输出特征值
我们需要获取输出的中间层的名称,ONNX中并没有直接的层索引
但你可以通过一些方法来识别它,比如查看ONNX模型的结构或使用其他工具

使用ONNX Python库:
可以使用ONNX库来加载模型并检查其结构。这包括获取模型的输入和输出信息,以及遍历模型的节点(层)。
步骤:
安装ONNX库(如果还没有安装的话)
使用ONNX库加载模型,并获取图的节点信息
遍历节点,查找你感兴趣的层,并记下它的名称
示例代码:

import onnx  
import onnx.helper as helper  

# 加载ONNX模型  
model = onnx.load("model2.onnx")  

# 遍历图中的所有节点  
# 打印出模型中所有节点的操作类型、名称、输入和输出
for node in model.graph.node:  
    print(node.op_type, node.name, node.input, node.output)  

# 你可以根据op_type(操作类型)或名称来识别你感兴趣的层

输出结果如下

D:\Anaconda3\envs\py3.8\python.exe E:/doubleNet/checkONNX.py
MatMul StatefulPartitionedCall/sequential_2/dense_10/MatMul ['dense_10_input', 'StatefulPartitionedCall/sequential_2/dense_10/MatMul/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_10/MatMul:0']
Add StatefulPartitionedCall/sequential_2/dense_10/BiasAdd ['StatefulPartitionedCall/sequential_2/dense_10/MatMul:0', 'StatefulPartitionedCall/sequential_2/dense_10/BiasAdd/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_10/BiasAdd:0']
Relu StatefulPartitionedCall/sequential_2/dense_10/Relu ['StatefulPartitionedCall/sequential_2/dense_10/BiasAdd:0'] ['StatefulPartitionedCall/sequential_2/dense_10/Relu:0']
MatMul StatefulPartitionedCall/sequential_2/dense_11/MatMul ['StatefulPartitionedCall/sequential_2/dense_10/Relu:0', 'StatefulPartitionedCall/sequential_2/dense_11/MatMul/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_11/MatMul:0']
Add StatefulPartitionedCall/sequential_2/dense_11/BiasAdd ['StatefulPartitionedCall/sequential_2/dense_11/MatMul:0', 'StatefulPartitionedCall/sequential_2/dense_11/BiasAdd/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_11/BiasAdd:0']
Relu StatefulPartitionedCall/sequential_2/dense_11/Relu ['StatefulPartitionedCall/sequential_2/dense_11/BiasAdd:0'] ['StatefulPartitionedCall/sequential_2/dense_11/Relu:0']
MatMul StatefulPartitionedCall/sequential_2/dense_12/MatMul ['StatefulPartitionedCall/sequential_2/dense_11/Relu:0', 'StatefulPartitionedCall/sequential_2/dense_12/MatMul/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_12/MatMul:0']
Add StatefulPartitionedCall/sequential_2/dense_12/BiasAdd ['StatefulPartitionedCall/sequential_2/dense_12/MatMul:0', 'StatefulPartitionedCall/sequential_2/dense_12/BiasAdd/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_12/BiasAdd:0']
Relu StatefulPartitionedCall/sequential_2/dense_12/Relu ['StatefulPartitionedCall/sequential_2/dense_12/BiasAdd:0'] ['StatefulPartitionedCall/sequential_2/dense_12/Relu:0']
MatMul StatefulPartitionedCall/sequential_2/dense_13/MatMul ['StatefulPartitionedCall/sequential_2/dense_12/Relu:0', 'StatefulPartitionedCall/sequential_2/dense_13/MatMul/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_13/MatMul:0']
Add StatefulPartitionedCall/sequential_2/dense_13/BiasAdd ['StatefulPartitionedCall/sequential_2/dense_13/MatMul:0', 'StatefulPartitionedCall/sequential_2/dense_13/BiasAdd/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_13/BiasAdd:0']
Relu StatefulPartitionedCall/sequential_2/dense_13/Relu ['StatefulPartitionedCall/sequential_2/dense_13/BiasAdd:0'] ['StatefulPartitionedCall/sequential_2/dense_13/Relu:0']
MatMul StatefulPartitionedCall/sequential_2/dense_14/MatMul ['StatefulPartitionedCall/sequential_2/dense_13/Relu:0', 'StatefulPartitionedCall/sequential_2/dense_14/MatMul/ReadVariableOp:0'] ['StatefulPartitionedCall/sequential_2/dense_14/MatMul:0']
Add StatefulPartitionedCall/sequential_2/dense_14/BiasAdd ['StatefulPartitionedCall/sequential_2/dense_14/MatMul:0', 'StatefulPartitionedCall/sequential_2/dense_14/BiasAdd/ReadVariableOp:0'] ['dense_14']

Process finished with exit code 0

在Keras中,可以使用Model来获取任何层的输出作为一个新的模型,这被称为"layer model"或"intermediate model"。在案例中,已经创建了一个intermediate_layer_model来获取倒数第三层的输出。

当将Keras模型转换为ONNX模型后,要获取特定层的特征值,需要执行以下步骤:

  1. 确定ONNX模型中的节点名称:从您提供的ONNX模型输出内容,您需要找到对应于Keras中倒数第三层输出的节点名称。根据输出,这可能是类似StatefulPartitionedCall/sequential_2/dense_11/Relu:0的节点。

  2. 设置ONNX模型的输入:与Keras模型一样,您需要准备输入数据。

  3. 使用ONNX运行时来执行模型:使用ONNX运行时(ONNX Runtime)来运行模型并捕获特定层的输出。

  4. 获取特定层的输出:在ONNX Runtime中,您可以指定输出名称来获取特定层的输出。

以下是一个示例代码,演示如何使用ONNX Runtime获取特定层的特征值:

import onnx
import onnxruntime as ort

# 加载ONNX模型
onnx_model = onnx.load("model1.onnx")

# 创建ONNX运行时会话
session = ort.InferenceSession("model1.onnx")

# 准备输入数据,这里假设您的输入数据名为'input_data'并且已经准备好
input_name = session.get_inputs()[0].name
input_data = ...  # 这里替换为实际的输入数据

# 执行模型,获取倒数第三层的特征值
# 根据上面的ONNX模型输出,假设倒数第三层的输出名称为'StatefulPartitionedCall/sequential_2/dense_11/Relu:0'
output_name = 'StatefulPartitionedCall/sequential_2/dense_11/Relu:0'
raw_output = session.run([output_name], {input_name: input_data})[0]

# raw_output 现在包含了您想要的特定层的特征值

请注意,您需要将'StatefulPartitionedCall/sequential_2/dense_11/Relu:0'替换为实际的层输出名称,这取决于您的模型和转换过程。此外,input_data应该是与您的模型输入维度匹配的NumPy数组或其他合适的数据类型。

确保您已经安装了ONNX和ONNX Runtime库。如果尚未安装,可以通过以下命令进行安装:

pip install onnx onnxruntime

使用ONNX Runtime,您可以方便地在ONNX模型上执行推理,并获取任何层的输出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

upload-labs第八关教程

upload-labs第八关教程 一、源代码分析代码审计 二、绕过分析点绕过上传eval.php使用burp suite进行抓包修改放包,查看是否上传成功使用中国蚁剑进行连接 一、源代码分析 代码审计 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists(U…

第一篇:容器化的未来:从Docker的革命到云原生架构

容器化的未来:从Docker的革命到云原生架构 1. 引言 在当今快速演进的技术领域,容器化技术已经成为云计算和微服务架构的重要组成部分。该技术以其高效的资源利用率、快速的部署能力和卓越的隔离性能,彻底改变了软件开发和部署的方式。容器化…

机器学习:GANs网络在图像和视频技术中的应用前景

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

【漏洞复现】六零导航页 _include_file.php 任意文件上传漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

西门子学习笔记15 - 位逻辑操作的学习

1、点动操作(按下按钮就启动松开就停止) 2、自锁电路(可以自己保持的状态除非常闭停止按下) 3、取反操作(顾名思义就是反过来1就变成0,0就变成1) 4、置为复位(置位之后如果不复位的话…

Elixir学习笔记——进程(Processes)

在 Elixir 中,所有代码都在进程内运行。进程彼此隔离,彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础,而且还提供了构建分布式和容错程序的方法。 Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU…

餐厅点餐系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,商品管理,用户管理,店家管理,广告管理 店家账户功能包括:系统首页,个人中心,商品管理,广告管…

新能源汽车高压上电、高压下电逻辑分析

高压上电逻辑 新能源汽车的上电分为高压上电和低压上电,高压上电流程一般理解为高压件通电的过程,具体流程如下: 1、点火开关处于ON档时,仪表盘点亮,低压电接通。 2、VCU、BMS、MCU等控制模块依次被唤醒并开始进行自检…

驾校在线考试系统源码 手机+PC+平板自适应

Thinkphp在线考题源码 驾校在线考试系统 手机PC平板 自适应,机动车驾驶培训学校驾校类网站源码带手机端 运行环境:phpmysql 内附安装说明 驾校在线考试系统源码 手机PC平板自适应

深入探讨限流算法:固定窗口、滑动窗口、漏桶与令牌桶原理及应用场景

固定窗口算法 简单粗暴,但有临界问题: 滑动窗口算法 滑动窗口通俗来讲是一种流量控制技术,描述接收方TCP数据报缓冲区大小的数据。发送方根据这个数据计算最大可发送的数据量。滑动窗口协议是TCP使用的一种流量控制方法,允许发送…

如何从印刷体的图片中把手写体部分统统去掉?--免费途径

AI图像处理技术 我是从国外某个网站上找到在线AI免费credit的处理方式的。国内的基本没有全功能试用、或者即使收费也不好用。 国内的差距主要是:1、对图片分辨率和大小有更多限制,即使收费用户也是;2、需要安装app之类,然后连线…

给类设置serialVersionUID

第一步打开idea设置窗口(setting窗口默认快捷键CtrlAltS) 第二步搜索找到Inspections 第三步勾选主窗口中Java->Serializations issues->下的Serializable class without serialVersionUID’项 ,并点击“OK”确认 第四步鼠标选中要加…

智能体(Agent)实战——从gpts到auto gen

一.GPTs 智能体以大模型作为大脑,同时配备技能,使其能够完成具体的任务。同时,为了应用于垂直领域,我们需要为大模型定义一个角色,并构建知识库。最后,定义完整的流程,使其完成整个任务。以组会…

【回文 马拉车】214. 最短回文串

本文涉及知识点 回文 马拉车 LeetCode214. 最短回文串 给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1: 输入:s “aacecaaa” 输出:“aaacecaaa” 示…

从最小二乘法的角度来理解卡尔曼滤波(1)

从最小二乘法的角度来理解卡尔曼滤波(1) flyfish 假设你有一堆数据点,比如在一个二维平面上有很多点。你想找到一条直线,能够尽可能接近这些点。这条直线可以用一个方程来表示:y mx b,其中 m 是斜率&am…

Nginx - 反向代理、负载均衡、动静分离(案例实战分析)

目录 Nginx 开始 概述 安装(非 Docker) 配置环境变量 常用命令 配置文件概述 location 路径匹配方式 配置反向代理 实现效果 准备工作 具体配置 效果演示 配置负载均衡 实现效果 准备工作 具体配置 实现效果 其他负载均衡策略 配置动…

MATLAB直方图中bin中心与bin边界之间的转换

要将 bin 中心转换为 bin 边界,请计算 centers 中各连续值之间的中点。 d diff(centers)/2; edges [centers(1)-d(1), centers(1:end-1)d, centers(end)d(end)];要将 bin 边界转换为bin 中心 bincenters binedges(1:end-1)diff(binedges)/2;

16.大模型分布式训练框架 Microsoft DeepSpeed

微调、预训练显存对比占用 预训练LLaMA2-7B模型需要多少显存? 假设以bf16混合精度预训练 LLaMA2-7B模型,需要近120GB显存。即使A100/H100(80GB)单卡也无法支持。 为何比 QLoRA多了100GB?不妨展开计算下显存占用&…

文章MSM_metagenomics(五):共现分析

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2 介绍 本教程是使用一个Python脚本来分析多种微生物(即strains, species, genus等&…

维度建模中的事实表设计原则

维度建模是一种数据仓库设计方法,其核心是围绕业务过程建立事实表和维度表。事实表主要存储与业务过程相关的度量数据,而维度表则描述这些度量数据的属性。 以下是设计事实表时需要遵循的几个重要原则,来源于《维度建模》那本书上&#xff0…