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

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

  • tf保存为kears框架h5文件
  • 将h5转化为savemodel格式,方便部署
  • 查看模型架构
  • 将savemodel转化为onnx格式
  • 使用netron
  • onnx模型细微处理
  • 代码转化为om以及推理代码,要么使用midstudio

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/321876.html

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

相关文章

MFC 列表控件修改实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例(源码下载)》 2、程序功能选中列表控件某一项,修改这一项的按钮由禁止变为可用,双击这个按钮弹出对话框可对这一项的记录数据进行修改,点击确定保存修改数…

运维自动化工具:Ansible 概念与模块详解

目录 前言 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 4、Ansible 架构 4.1 Ansible 组成 4.2 Ansible 命令执行来源 5、Ansible 的优缺点 三、Ansible 安装部署 1、环境部署 2、管理节点安装 Ansible 3、…

解锁AI的神秘力量:LangChain4j带你步入智能化实践之门

关注微信公众号 “程序员小胖” 每日技术干货,第一时间送达! 引言 在数字化转型的浪潮中,人工智能(AI)正逐渐成为推动企业创新和增长的关键力量。然而,将AI技术融入到日常业务流程并非易事,它…

20230507,LIST容器

学了又忘学了又忘,明知道会忘又不想复习又还得学 LIST容器 1.1 基本概念 链表是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的;链表由一系列结点组成 结点:一个是存储数据元素的数据域&a…

Electron项目中将CommonJS改成使用ES 模块(ESM)语法preload.js加载报错

问题 将Electron项目原CommonJS语法改成使用ES 模块(ESM)语法,preload.js一直加载不到,报错如下: VM111 renderer_init:2 Unable to load preload script: D:\Vue\wnpm\electron\preload.js VM111 renderer_init:2 E…

NGINX App Protect现已支持NGINX开源版 全方位加强现代应用安全防护

近日,F5 NGINX 发布全新升级的NGINX App Protect 5.0版本,将先前专属于NGINX 商业版本NGINX Plus 的现代应用安全能力拓展至NGINX开源版中,为增强现代应用和API安全防护提供全方位支持。此次升级后,适用于云端及本地部署的NGINX A…

Dell EMC Storage Unity: Remove/Install Memory Module

SP A 一个内存故障 点击system view -> Enclosures->Top查看 再次查看Alert, 确认内存出现问题 进入Service , 将SP A置为service状态 移出SP A ,进行内存更换 更换完内存后,将SP A插入设备,并进行线缆连接 进入…

Maven+Junit5 + Allure +Jenkins 搭建 UI 自动化测试实战

文章目录 效果展示Junit 5Junit 5 介绍Junit 5 与 Junit 4 对比PageFactory 模式编写自动化代码公共方法提取测试用例参数化Jenkins 搭建及配置参数化执行生成 Allure 报告Maven 常用命令介绍POM 文件效果展示 本 chat 介绍 UI 自动化测试框架的搭建: 运用 page factory 模式…

AI大模型探索之路-训练篇16:大语言模型预训练-微调技术之LoRA

系列篇章💥 AI大模型探索之路-训练篇1:大语言模型微调基础认知 AI大模型探索之路-训练篇2:大语言模型预训练基础认知 AI大模型探索之路-训练篇3:大语言模型全景解读 AI大模型探索之路-训练篇4:大语言模型训练数据集概…

教育界最厉害的三个名人颜廷利:处处物尽其用, 时时人尽其才

颜廷利教授在他的著作《升命学说》中提出了“净化论”,这一理论**强调了个人内在心灵的宁静与纯洁对于实现更高层次人生价值的重要性**。 “净化论”是中国最受欢迎的著名起名字大师颜廷利教授关于如何提升个人命运和推动社会发展的哲学思考的一部分。他在书中提出&…

Baidu Comate:智能编码助手,助力编程效率飞跃

文章目录 Baidu Comate智能助手简介安装Baidu ComateBaidu Comate主要功能代码智能补全编程知识问答官方插件函数注释行间注释生成单测代码解释调优建议函数拆分清空对话框help AutoWork工具箱 总结 Baidu Comate智能助手简介 Baidu Comate,Coding Mate Powered by …

Express路由

什么是路由 官方定义&#xff1a;路由确定了应用程序如何响应客户端对特定端点的请求。 路由的使用 一个路由的组成有 请求方法、路径 和 回调函数 组成。 Express中提供了一些列方法&#xff0c;可以很方便的使用路由&#xff0c;使用格式如下&#xff1a; app.<metho…

【编程题-错题集】非对称之美(找规律 / 贪心)

牛客对应题目链接&#xff1a;非对称之美 (nowcoder.com) 一、分析题目 找规律&#xff1a; 判断是否全都是相同字符。判断本身是否是回文。 如果这个字符串每个字符相同&#xff0c;不存在非回文子串&#xff0c;直接返回 0。如果这个字符串不是回文&#xff0c;输出字符串长度…

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

STC15W1K16S和VC6.0串口通讯收发测试实例

/********************************************* STC USB 串口板 2014 4 7 20:12 发送接收数据 使用STC串口调试助手通讯正常&#xff0c;L161 **********************************************/ #include "reg51.h" #include "intrins.h" #define…

sourceTree push失败

新电脑选择commit and push&#xff0c;报错了&#xff0c;不过commit成功&#xff0c;只不过push失败了。 原因是这个&#xff0c;PuTTYs cache and carry on connecting. 这里的ssh选择的是 PuTTY/Plink&#xff0c;本地没有这个ssh密钥&#xff0c;改换成openSSH&#xff…

[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

键盘改造 &#x1f94b; 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…

如何理解GTX接收通道相关模块?(高速收发器三)

前文讲解了GTX的时钟及发送通道相关内容&#xff0c;本文讲解GTX接收通道的一些功能及其IP配置&#xff0c;接收往往比发送设计更难&#xff0c;与调制解调&#xff0c;加密解密其实相差不大&#xff0c;后者难度都比前者高出很多。GTX的接收通道的功能相比发送通道更加重要&am…

【Linux】进程的隔离和控制:namespace 隔离、cgroup 控制

文章目录 五、namespace 隔离dd -- 读取、转换并输出数据mkfs -- 格式化文件系统df -- 显示文件系统磁盘使用情况mount -- 加载文件系统到指定的加载点unshare -- 创建子进程&#xff0c;同时与父程序不共享namespace一个 demo 六、cgroup(Control Group) 相关命令pidstat -- 监…

Redis 源码安装(CentOS 单机)

序言 本文给大家介绍如何在 CentOS 上&#xff0c;通过 Redis 源码单机部署 Redis 服务。 一、部署流程 通过官网下载源码 # 下载源码 wget https://download.redis.io/redis-stable.tar.gz# 解压源码包 tar -xzvf redis-stable.tar.gz在 linux 中执行以下命令&#xff0c;安…