tf2使用savemodel保存之后转化为onnx适合进行om模型部署
- tf保存为kears框架h5文件
- 将h5转化为savemodel格式,方便部署
- 查看模型架构
- 将savemodel转化为onnx格式
- 使用netron
- onnx模型细微处理
- 代码转化为om以及推理代码,要么使用midstudio
tf保存为kears框架h5文件
前提环境是tf2.2及其版本以上的框架,模型训练结果保存为h5(也就是kears框架)
将h5转化为savemodel格式,方便部署
之后将h5文件转化为savemodel的格式
custom是在保存模型的时候需要的自定义函数,如果没有则不需要添加
保存结果如下
这个地方记得验证一下savemodel格式是否能成功搭载测试代码
import os
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM,Dense,Dropout
from keras.utils import to_categorical
import tensorflow as tf
from tensorflow.python.keras.layers import Activation os.chdir('D:/software_project/心电信号分类/') # 加载 SavedModel 目录
loaded_model = tf.saved_model.load('tfmodel_save') # 获取默认的服务签名
infer = loaded_model.signatures['serving_default']
print(infer.structured_input_signature)
print(infer.structured_outputs) # 加载CSV文件
file_path = 'data2/shuffled_merged_data.csv'
data = pd.read_csv(file_path)
from sklearn.preprocessing import StandardScaler # 创建StandardScaler实例
scaler = StandardScaler()
features = data.iloc[0:1, :-1] # 获取最后一列作为标签
labels = data.iloc[0:1, -1]
features1 = scaler.fit_transform(features)
# features1 = features1.astype(np.float32) # # 转化为numpy
# features = features.to_numpy()
trainX3 = features1.reshape((features1.shape[0], features1.shape[1], 1)) # # 将数据转换为Tensor
input_data = tf.convert_to_tensor(trainX3, dtype=tf.float32) output = infer(conv1d_input=input_data)
output4=output['dense_3']
print(output4.numpy()) # 为了确定每个样本的预测标签,我们找到概率最高的类别的索引
predicted_indices = np.argmax(output4.numpy(), axis=1)
accuracy = accuracy_score(labels, predicted_indices)
print(accuracy) output2=output["dense_8"]
print(output["dense_8"])
predicted_indices2= np.argmax(output2.numpy(), axis=1)
accuracy2 = accuracy_score(labels, predicted_indices2)
print(accuracy2) output2_1=output["dense_8_1"]
print(output["dense_8_1"])
predicted_indices2= np.argmax(output2_1.numpy(), axis=1)
accuracy3 = accuracy_score(labels, predicted_indices2)
print(accuracy3) print('nihao')
# 不可用
# print(output["StatefulPartitionedCall:0"])
查看模型架构
可以使用这个代码查看模型架构,输入输出的名字
saved_model_cli show --dir D:\software_project\心电信号分类\tfmodel_save --tag_set serve --sig
nature_def serving_default
结构如下
如果可以用咱们继续进行下一步
将savemodel转化为onnx格式
之后将保存的savemodel格式转化为onnx格式
这里直接上大佬博客
在Atlas 200 DK中部署深度学习模型
基本把每个步骤过一遍即可
注意安装tensorflowgpu的版本是很高的
转换指令
python -m tf2onnx.convert --saved-model tensorflow-model-path --output model.onnx
使用netron
把模型放入到netron中
Netron
导出的onnx模型如下
onnx模型细微处理
获得的onnx模型放入netron中进行查看,发现有些未知输出量需要修改
【tensorflow onnx】TensorFlow2导出ONNX及模型可视化教程_tf2onnx-CSDN博客
主要是这种未知量
代码转化为om以及推理代码,要么使用midstudio
之后即可使用代码进行模型的转化为om
转化成功之后,放到atlks200dk板子中进行模型的推理
代码
import numpy as np
import acllite_utils as utils
import constants as const
from acllite_model import AclLiteModel
from acllite_resource import AclLiteResource
import time
import csv
import numpy as np class Reasoning(object): """ class for reasoning """ def __init__(self, model_path): self._model_path = model_path self.device_id = 0 self._model = None def init(self): """ Initialize """ # Load model self._model = AclLiteModel(self._model_path) return const.SUCCESS def inference(self, one_dim_data): """ model inference """ return self._model.execute(one_dim_data) def main(): model_path = 'model_dim_replace.om' # 打开 CSV 文件 with open('shuffled_merged_data.csv', newline='') as csvfile: # 创建 CSV 读取器对象 csvreader = csv.reader(csvfile, delimiter=',') # 跳过第一行(标题行) next(csvreader) # 读取第二行数据 second_row = next(csvreader) # 移除最后一个数据 second_row_without_last = second_row[:-1] # 将数据转换为 NumPy 数组 np_array = np.array(second_row_without_last, dtype=np.float32) print(np_array.dtype) # 输出转换后的 NumPy 数组 acl_resource = AclLiteResource() acl_resource.init() reasoning = Reasoning(model_path) # init ret = reasoning.init() utils.check_ret("Reasoning.init ", ret) start_time = time.time() # 假设你有一个名为 input_data 的 NumPy 数组,它包含模型的输入数据 input_data = np.array([np_array]) # 替换为你的输入数据 result_class = reasoning.inference(input_data) end_time = time.time() execution_time = end_time - start_time print(result_class)
if __name__ == '__main__': main()