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()