.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 kerasmodel_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.mzph.cn/pingmian/27981.shtml

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

相关文章

力扣hot100:75. 颜色分类(双指针)

75.颜色分类 本题是经典的「荷兰国旗问题」,由计算机科学家 Edsger W. Dijkstra 首先提出。 75. 颜色分类 1、遍历两遍 遍历两遍,第一遍放置0的位置,第二遍放置1的位置,我们只需要维护一个当前放置位置即可。 class Solution…

【DPDK学习路径】七、创建RX/TX队列

上一节我们讲述了如何申请内存池缓冲区以便接下来创建 RX 队列,这一节我们将给出具体如何创建 RX/TX 队列。 在 DPDK 中提供了 rte_eth_rx_queue_setup 及 rte_eth_tx_queue_setup 这两个接口用于接收/发送队列的创建。 下面给出一个为各个网卡创建RX/TX 队列的实例…

pytorch学习笔记6

想要找一些官方的小工具数据集,可以进入pytorch官网,DOCS-》pytorch下拉至libraries,点击torchversion,调整版本至0.9.0就可以找到相应的一些数据集,训练集 ctrlp可以看一个函数中需要设置哪些参数 下载数据集可以参考…

nginx性能不够用了,有没有性能更好的代替方案

面对Nginx服务器性能达到瓶颈,寻找更高性能的替代方案是解决该问题的有效策略。在众多可行的解决方案中,Pingora、Traefik和Caddy是三个值得关注的选项,它们各具特点并在某些方面超越了传统的Nginx。具体介绍如下: 1. **Pingora**…

【设计模式深度剖析】【6】【行为型】【中介者模式】

👈️上一篇:迭代器模式 | 下一篇:观察者模式👉️ 设计模式-专栏👈️ 文章目录 中介者模式定义英文原文直译如何理解? 中介者模式的角色1. 中介者(Mediator)2. 具体中介者(ConcreteMediato…

经验分享:使用Python3删除ansible主机known_hosts文件中已下线主机的公钥信息

使用Python3删除ansible主机known_hosts中已下线主机的公钥信息。 简介代码部分调用方法结果验证清理前清理后 简介 在使用ansible工具批量管理主机时,通常会让ansible主机与被控主机之间实现免密登录,从而方便工作的开展。值得注意的是,当被…

C语言小例程20/100

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #include<stdio.h> #define N 1000 int main() {int i,j,k,n,sum;int a[256];for(i2;i<N;i){suma[0]1;k…

工业网关在智能制造中的具体应用和效果-天拓四方

随着工业4.0时代的到来&#xff0c;智能制造正逐渐成为工业领域的发展趋势。作为连接物理世界与数字世界的桥梁&#xff0c;工业网关在智能制造中发挥着至关重要的作用。本案例将详细阐述工业网关在某一制造企业中的具体应用&#xff0c;展示其如何助力企业实现数字化转型&…

汽车IVI中控开发入门及进阶(二十八):视频SERDES芯片

前言: SerDes不是很常见,SerDes是将Ser和Des两种产品组合在一起的名称。Ser是Serializer或“并串转换器”的缩写,Des是Deserializer或“串并转换器”的简写。 Serdes是不是必须的?上一节介绍了camera,上上节也研究了video decoder,那么带摄像头的应用应该具体选哪个方案…

JS常用的几种函数

在JavaScript中&#xff0c;有很多常用的函数和内置对象方法。以下是一些最常见的JavaScript函数和它们的简要描述&#xff1a; console.log() 用于在浏览器的控制台或Node.js的命令行界面中打印消息。typeof() 返回一个表示变量或表达式的类型的字符串。parseInt() 和 parseF…

【安卓逆向】adb root adbd cannot run as root in production builds

尝试了很多方法不行, 最终在这篇贴纸看到这段代码 su -c "resetprop ro.debuggable 1";su -c "resetprop service.adb.root 1";su -c "magiskpolicy --live allow adbd adbd process setcurrent";su -c "magiskpolicy --live allow adbd su…

固态u盘长期不用会丢数据吗?u盘数据丢失怎么恢复需要多久

在数字化时代&#xff0c;U盘作为便携存储设备&#xff0c;广泛应用于我们的日常生活和工作中。然而&#xff0c;关于固态U盘长期不使用是否会导致数据丢失的问题&#xff0c;以及数据丢失后如何恢复和所需的时间&#xff0c;常常让人感到困惑。本文将针对这些问题进行深入探讨…

leetcode14 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&#xff1a; 输…

Java—文件拷贝

将指定的文件或目录拷贝到指定目录夹下 import java.io.*; import java.util.Scanner;/*** 实现一个文件拷贝*/ public class FileCopy {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.println("请输入要拷贝的源文件路径…

申请国外访问学者面签技巧有哪些?

申请国外访问学者面签是一项重要的步骤&#xff0c;关系到能否成功获得访问学者身份。以下是一些实用的面签技巧&#xff0c;帮助您顺利通过面试。 1.充分准备材料 成功的面签始于准备充分的材料。确保您的申请材料齐全&#xff0c;包括&#xff1a; 个人简历&#xff1a;突出…

3D 图片悬停效果

3D 图片悬停效果 效果展示 CSS 知识点 background 属性的综合运用transform 属性的综合运用 页面整体布局 <div class"box"><span style"--i: 0"></span><span style"--i: 1"></span><span style"--i…

python-基础篇-函数-是什么

文章目录 定义一&#xff1a;如果在开发程序时&#xff0c;需要某块代码多次执行。为了提高编写的效率以及更好的维护代码&#xff0c;需要把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数。定义一&#xff1a;我们把一些数据喂给函数&#xff0c;让他内部消化&…

MATLAB入门教程

MATLAB入门教程可以按照以下结构进行清晰地分点表示和归纳&#xff1a; 一、MATLAB概述 定义&#xff1a;MATLAB&#xff08;Matrix Laboratory&#xff09;是由MathWorks公司开发的一种用于数值计算、可视化以及编程的高级语言环境和交互式系统。特点&#xff1a;简单易学、…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 文件对话框QFileDialog 文章编号&#xff1a;Q…

前端如何接收SSE流式数据传输(大模型网站常用)

使用fetchEventSource 参考&#xff1a;https://blog.csdn.net/qq_43750656/article/details/1315911984 https://zhuanlan.zhihu.com/p/686618062 首先安装&#xff1a; npm install --save microsoft/fetch-event-source我参考各个资料写的函数&#xff1a; // 流式传输处…