.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'] ['StatefulPartition
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值