tf2使用savemodel保存之后转化为onnx适合进行om模型部署

tf保存为kears框架h5文件

前提环境是tf2.2及其版本以上的框架,模型训练结果保存为h5(也就是kears框架)
Pasted image 20240507233042

将h5转化为savemodel格式,方便部署

之后将h5文件转化为savemodel的格式
Pasted image 20240507233120

custom是在保存模型的时候需要的自定义函数,如果没有则不需要添加

保存结果如下
Pasted image 20240507233222

这个地方记得验证一下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

结构如下
Pasted image 20240507233536

如果可以用咱们继续进行下一步

将savemodel转化为onnx格式

之后将保存的savemodel格式转化为onnx格式

这里直接上大佬博客
在Atlas 200 DK中部署深度学习模型

基本把每个步骤过一遍即可

注意安装tensorflowgpu的版本是很高的
Pasted image 20240507233803

转换指令

python -m tf2onnx.convert --saved-model tensorflow-model-path --output model.onnx

使用netron

把模型放入到netron中
Netron

导出的onnx模型如下
Pasted image 20240507234346

onnx模型细微处理

获得的onnx模型放入netron中进行查看,发现有些未知输出量需要修改
【tensorflow onnx】TensorFlow2导出ONNX及模型可视化教程_tf2onnx-CSDN博客

主要是这种未知量
Pasted image 20240507233928

代码转化为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()
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值