当前位置: 首页 > news >正文

ONNX模型修改为自定义节点

参考一

首先,需要将ONNX模型中的节点修改为自定义节点。要实现这一点,您需要了解自定义节点的定义和如何在ONNX中使用它们。ONNX定义了一个自定义运算符的接口,您可以使用该接口定义自己的运算符,并将其编译为ONNX模型可以识别的格式。

具体步骤如下:

  1. 定义自定义节点的运算符:您需要将自定义节点定义为一个具有输入和输出的函数。函数应该遵循ONNX规范中定义的接口。

  2. 编写生成自定义节点的代码:您需要编写代码来生成ONNX模型中的自定义节点。生成代码通常基于ONNX运算符定义,使用您定义的自定义节点。

  3. 加载模型和权重:您需要加载ONNX模型和权重,以便能够对其进行修改和批处理。

  4. 修改节点:使用自定义节点替换现有节点。在这个过程中,您需要根据ONNX规范来处理权重和偏差,以便成为自定义节点的输入。

  5. 导出修改后的模型:将修改后的模型导出为ONNX格式,以便以后使用。

在这个过程中,您需要使用Python编程语言,以及ONNX Python库和其他相关工具来处理ONNX模型。

在下面的代码示例中,假设您有一个ONNX模型,并且要将其中的节点替换为自定义节点。以下是一个简单的代码示例,用于演示如何使用ONNX Python库来读取和修改ONNX模型。

# 导入必要的库
import onnx
from onnx import helper, TensorProto
import numpy as np# 加载模型
model = onnx.load("model.onnx")# 定义自定义节点的运算符
def custom_node(inputs, outputs):output = ...return output# 编写生成自定义节点的代码
node_def = helper.make_node(op_type='CustomNode',inputs=['input'],outputs=['output'],
)# 加载权重
weight = onnx.load_tensor("weight.bin")# 修改节点
for i, node in enumerate(model.graph.node):if node.op_type == 'OldNode':# 替换节点为自定义节点model.graph.node[i] = node_def# 将权重转移到自定义节点weight_value = np.array(weight[i]).astype(np.float32)tensor = onnx.helper.make_tensor(name='weight', data_type=onnx.TensorProto.FLOAT, dims=weight_value.shape, vals=weight_value)model.graph.initializer.append(tensor)# 导出修改后的模型
onnx.save(model, "modified_model.onnx")

请注意,这只是一个示例,您需要根据您的自定义节点和模型进行修改。

参考二

要将ONNX模型中的节点修改为自定义节点,您需要遵循以下步骤:

  1. 将ONNX模型加载到内存中。

  2. 使用ONNX模型API解析模型,找到您要修改的节点。

  3. 将该节点替换为自定义节点。

  4. 确保新的自定义节点与原始节点具有相同的输入和输出属性。

  5. 加载权重参数,并将其与新的自定义节点相结合。

以下是代码示例:

import onnx
import numpy as np# 加载ONNX模型
model = onnx.load('model.onnx')# 找到要修改的节点
old_node = None
for n in model.graph.node:if n.op_type == 'OldNodeType':old_node = nbreak# 如果找到了原来的节点,则替换为自定义节点
if old_node is not None:new_node = onnx.helper.make_node('CustomNodeType',old_node.input,old_node.output,name='new_node',attr={'attribute_name': attribute_value})model.graph.node.remove(old_node)model.graph.node.extend([new_node])# 加载权重参数并将其与新节点相结合weights = onnx.numpy_helper.load_tensor('weights.pb')new_node_weight = np.concatenate((weights, np.zeros((new_node.output[0],))))new_tensor = onnx.numpy_helper.from_array(new_node_weight, 'new_tensor')model.graph.initializer.extend([new_tensor])# 保存新模型
onnx.save(model, 'new_model.onnx')

请替换您需要修改的节点的名称和属性。上面的代码仅供参考,您需要根据实际情况进行修改和调整。

参考三

好的,我可以为您提供一些指导。

ONNX GraphSurgeon 是一个用于修改 ONNX 模型图的 Python 库。您可以使用 GraphSurgeon 将自定义节点添加到 ONNX 模型图中。要添加自定义节点,您需要进行以下步骤:

  1. 安装 ONNX GraphSurgeon:
pip install onnx-graphsurgeon
  1. 加载 ONNX 模型图:
import onnx
import onnx_graphsurgeon as gs# 加载 ONNX 模型
onnx_model = onnx.load("model.onnx")# 创建 GraphSurgeon 对象
graph = gs.import_onnx(onnx_model)
  1. 定义自定义节点:
# 创建一个包含两个输入和一个输出的自定义节点
custom_node = gs.Node(op="CustomOp",inputs=["input1", "input2"],outputs=["output"]
)# 将自定义节点添加到图中
graph.nodes.append(custom_node)
  1. 导入权重参数:
# 将 ONNX 模型中的权重参数导入到 GraphSurgeon 图中
# 可以使用 onnxruntime 加载模型,然后使用 GraphSurgeon 将权重参数添加到图中。
import onnxruntime# 加载 ONNX 模型
onnx_model = onnx.load("model.onnx")# 创建 onnxruntime inference session
session = onnxruntime.InferenceSession("model.onnx")# 遍历图中的所有张量
for tensor in graph.tensors:# 如果节点是权重张量,则从 ONNX runtime 会话中获取它们的值if tensor.name in session.get_inputs():tensor.value = session.run([], {session.get_inputs()[0].name: tensor.name})[0]
  1. 导出修改后的 ONNX 模型:
# 导出修改后的 ONNX 模型
# 您可以导出图,然后使用 onnxruntime 加载模型,并开始进行推断。
onnx_model = graph.make_model("custom_model")
onnx.save(onnx_model, "custom_model.onnx")

这就是您可以通过 ONNX GraphSurgeon 修改 ONNX 模型图和导入权重参数的步骤。

参考四

您好!您要将一个ONNX计算图中的一个或多个节点替换为自定义节点,并导入权重参数。以下是一些基本步骤可以帮助您完成:

  1. 使用 ONNX GraphSurgeon 工具加载 ONNX 模型。您可以使用以下代码进行加载:
import onnx
from onnx_graphsurgeon import GraphSurgeononnx_model = onnx.load("model.onnx")
graph = GraphSurgeon(onnx_model.graph)
  1. 创建自定义节点,并将其添加到图中。您可以使用以下代码创建一个自定义节点:
from onnx_graphsurgeon import Nodenode = Node(op="MyCustomOp",inputs=["input1", "input2"],outputs=["output"],attrs={"param": 123},
)

并将它添加到计算图中:

# 获取需要替换的节点
old_node = graph.find_node_by_name("NodeToReplace")# 将自定义节点添加到计算图中
new_node = graph.add_node(node)# 更新新节点的输入和输出
new_node.inputs = old_node.inputs
new_node.outputs = old_node.outputs# 删除旧节点
graph.remove_node(old_node)

请注意,此代码段仅演示了如何将节点添加到计算图中。您需要根据您自定义节点的实际需求进行修改。

  1. 导入权重参数。如果您的自定义节点包含参数,则需要将这些参数导入计算图中。您可以使用以下代码将权重参数加载到 ONNX 图中:
import numpy as np# 使用 numpy 加载权重参数
weights = np.load("weights.npy")# 创建一个常量节点,将权重参数添加到计算图中
const_node = onnx.helper.make_node("Constant", [], ["weights"], value=onnx.helper.make_tensor(name="const", data_type=onnx.TensorProto.FLOAT, dims=weights.shape, vals=weights.flatten()))

并将为新节点添加上原来的输入和新增的权重输入:

# 将常量节点添加到计算图中
graph.append(const_node)# 更新新节点输入
new_node.inputs.append("weights")

在完成所有这些步骤之后,您可以将 ONNX 模型保存回磁盘:

onnx_model.graph = graph.export()
onnx.save(onnx_model, "new_model.onnx")

希望这能够帮助您完成您的任务!

相关文章:

ONNX模型修改为自定义节点

参考一 首先,需要将ONNX模型中的节点修改为自定义节点。要实现这一点,您需要了解自定义节点的定义和如何在ONNX中使用它们。ONNX定义了一个自定义运算符的接口,您可以使用该接口定义自己的运算符,并将其编译为ONNX模型可以识别的…...

内存对齐原则

struct (1)结构体第一个数据成员放在offset为0的地方,后面每个成员相对于结构体首地址的偏移量(offset)都是成员大小(该变量类型所占字节)的整数倍,如有需要编译器会在成员之间加上填…...

Java SPI 一 之SPI(Service Provider Interface)进阶 AutoService

​ 一、SPI(Service Provider Interface) 1.1 介绍 SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制),可以用来启用框架扩展和替换组件,其…...

C++ list类成员函数介绍

目录 🤔list模板介绍: 🤔特点: 🤔list内存结构图解: 🤔 list的成员函数: 😊list构造函数: 🔍代码示例: 🔍运行结果&…...

【服务器】本地搭建PHP简单Imagewheel私人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道(云端设置)3.3.Cpolar稳定隧道(本地设置) 4.公网访问测…...

第四十二回:DateRangePickerDialog Widget

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了DatePickerDialog Widget相关的内容,本章回中将介绍 DateRangePickerDialog Widget.闲话休提,让我们一起Talk Flutter吧。 概念介绍 我们在这里说的DateRangePickerDialog是一种弹出窗口,只不…...

【C++系列P3】‘类与对象‘-三部曲——[基础知识](1/3)

前言 大家好吖,欢迎来到 YY 滴 C系列 ,热烈欢迎! 【 类与对象-三部曲】的大纲主要内容如下: 如标题所示,本章是【 类与对象-三部曲】三章中的第一章节——基础知识章节,主要内容如下: 目录 一.…...

Android UEvent事件分析之Kernel上报电量

kernel-4.4\drivers\power\power_supply_core.c 当电量信息需要更新的时候,kernel会调用power_supply_changed_work这个工作队列,使用kobject_uevent函数往上发送uevent事件,action是KOBJ_CHANGE; static void power_supply_changed_work(struct work_struct *work) {uns…...

C++ vector模板和deque的简单应用

目录 🤔vector模板和deque的简单介绍: 🤔vector和deque的主要不同之处: 🤔今天我们用vector模板和deque模板实现以下简单的功能: 代码实现: 🤔讲解: 🤔vector模板和d…...

声明式事务控制

声明式事务控制 编程式事务控制相关对象 PlatformTransactionManager PlatformTransactionManager接口是spring的事务管理器,它里面提供了常用的操作事务的方法 方法说明TransactionStatus getTransaction(TransactionDefaultion defination)获取事务的状态信息…...

cisp pte模拟题

1.信息搜集 本题共三个key 端口 1433 27689 存活ip 192.168.85.137 2.访问网站27689进行信息搜集 一个登录框,sql注入失败,暴力破解失败 扫描目录 发现三个文件robots.txt ,web.config 除了robots.txt,其他都访问不了 访问robots.txt,发现一个file参数…...

Docker容器 和 Kubernetes容器集群管理系统

一、快速了解Docker 1. 什么是Docker的定义 Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以…...

港联证券|资金疯狂涌入AI,这一板块涨幅超90%!万亿巨头继续狂飙

国内外资金继续加码AI概念股。 当前,国内政策层面对于通用人工智能和算力中心的创新发展扶持政策不断推出,资本市场对于AI(人工智能)热情不断升温。在AI下游应用中,游戏板块成为最被看好的投资标的,资金流入…...

短视频矩阵系统源码-开源开发php语言搭建

短视频矩阵系统源码---------- php源码是什么? PHP源码指的就是PHP源代码,源代码是用特定编程语言编写的人类可读文本,源代码的目标是为可以转换为机器语言的计算机设置准确的规则和规范。因此,源代码是程序和网站的基础。 PHP…...

PFEA112-20 3BSE050091R20 张力控制器

您的张力测量系统包括: 张力电子PFEA111或PFEA112–PFEA111是一款经济高效的紧凑型用户友好型张力电子产品,提供 来自两个称重传感器的精确可靠的快速模拟SUM信号,用于控制 和/或监测。显示器可以显示SUM、单个A&B和差异信号小尺寸和DIN导…...

Java springboot+vue生成报纸排版页面的新闻官网

实现方案,可以作为您开始开发的参考: 后端: 使用Spring Boot框架构建Java Web应用;使用MyBatis Plus进行ORM映射,管理MySQL数据库;按照需求定义新闻数据表、类别数据表和用户数据表,使用默认的…...

Terra-Luna归零一年后:信任重建、加密未来路在何方?

本月既是Terra-Luna归零的一周年,也是FTX崩溃的第六个月,而这两个事件分别代表着2022年加密市场连环爆的开始与高潮,引发了加密行业15年历史上最可怕的生存危机。 尽管今年市场行情有所回暖,比特币开年至今涨幅70%,以太…...

Android 12.0 手动安装Persistent app失败的解决方案

1.概述 在12.0的系统产品开发中,对于一些安装app的失败问题,需要看日志 和抛出异常来判断问题所在,在最近的一些app安装失败抛出了关于Presistent app安装失败的问题,就需要从PMS安装的过程中看异常抛出的原因解决问题所在 2.手动安装Persistent app失败的解决方案的核心类…...

Unity3D安装:从命令行安装 Unity

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 从命令行安装 Unity 如果要在组织中自动部署 Unity,可以从命令行安装 Editor 和其他组件。这些组件是普通的安装程序可执行程序和软件包,可以给用来自动部署…...

C++模板(详解)

非类型模板参数 模板参数可分为类型形参和非类型形参。类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。非类型形参: 用一个常量作为类(函数)模板的一个参数,在类&#xff…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...