onnx手动操作001

news2024/10/6 12:33:44
  • 使用onnx.helper可以进行onnx的制造组装操作:
对象描述
ValueInfoProto 对象张量名、张量的基本数据类型、张量形状
算子节点信息 NodeProto算子名称(可选)、算子类型、输入和输出列表(列表元素为数值元素)
GraphProto对象用张量节点和算子节点组成的计算图对象
ModelProto对象GraphProto封装后的对象
方法描述
onnx.helper.make_tensor_value_info制作ValueInfoProto对象
onnx.helper.make_tensor使用指定的参数制作一个张量原型(与ValueInfoProto相比可以设置具体值)
onnx.helper.make_node构建一个节点原型NodeProto对象 (输入列表为之前定义的名称)
onnx.helper.make_graph构造图原型GraphProto对象(输入列表为之前定义的对象)
make_model(graph, **kwargs)GraphProto封装后为ModelProto对象
make_sequence使用指定的值参数创建序列
make_operatorsetid
make_opsetid
make_model_gen_version推断模型IR_VERSION的make_model扩展,如果未指定,则使用尽力而为的基础。
set_model_props
set_model_props
make_map使用指定的键值对参数创建 Map
make_attribute
get_attribute_value
make_empty_tensor_value_info
make_sparse_tensor

提取出一个子模型

import onnx  
 
onnx.utils.extract_model('whole_model.onnx', 'partial_model.onnx', ['22'], ['28']) 

提取时添加额外输出

onnx.utils.extract_model('whole_model.onnx', 'submodel_1.onnx', ['22'], ['27', '31'])  # 本来只有31节点输出,现在让27节点的值也输出出来

使用(尝试构建一个模型)

在这里插入图片描述

import onnx 
from onnx import helper 
from onnx import TensorProto 
import numpy as np

def create_initializer_tensor(
        name: str,
        tensor_array: np.ndarray,
        data_type: onnx.TensorProto = onnx.TensorProto.FLOAT
) -> onnx.TensorProto:

    # (TensorProto)
    initializer_tensor = onnx.helper.make_tensor(
        name=name,
        data_type=data_type,
        dims=tensor_array.shape,
        vals=tensor_array.flatten().tolist())

    return initializer_tensor


 
# input and output 
a = helper.make_tensor_value_info('a', TensorProto.FLOAT, [None,3,10,  10]) 
x = helper.make_tensor_value_info('weight', TensorProto.FLOAT, [10, 10]) 


b = helper.make_tensor_value_info('b', TensorProto.FLOAT, [None,3, 10,10]) 
output = helper.make_tensor_value_info('output', TensorProto.FLOAT, [None,None,None, None]) 
 
# Mul 
mul = helper.make_node('Mul', ['a', 'weight'], ['c']) 
 
# Add 
add = helper.make_node('Add', ['c', 'b'], ['output_of_liner']) 


# Conv
conv1_W_initializer_tensor_name = "Conv1_W"
conv1_W_initializer_tensor = create_initializer_tensor(
    name=conv1_W_initializer_tensor_name,
    tensor_array=np.ones(shape=(1, 3,*(2,2))).astype(np.float32),
    data_type=onnx.TensorProto.FLOAT)
conv1_B_initializer_tensor_name = "Conv1_B"
conv1_B_initializer_tensor = create_initializer_tensor(
    name=conv1_B_initializer_tensor_name,
    tensor_array=np.ones(shape=(1)).astype(np.float32),
    data_type=onnx.TensorProto.FLOAT)

conv_node = onnx.helper.make_node(
    name="Convnodename",  # Name is optional.
    op_type="Conv",       # Must follow the order of input and output definitions. # https://github.com/onnx/onnx/blob/rel-1.9.0/docs/Operators.md#inputs-2---3
    inputs=[ 'output_of_liner', conv1_W_initializer_tensor_name,conv1_B_initializer_tensor_name ],
    outputs=["output"],
    kernel_shape= (2, 2), 
    #pads=(1, 1, 1, 1),
)

 
# graph and model 
graph = helper.make_graph([mul, add,conv_node], 'test', [a, x, b], [output],
        initializer=[conv1_W_initializer_tensor, conv1_B_initializer_tensor,],
                          ) 
model = helper.make_model(graph) 
 
# save model 
onnx.checker.check_model(model) 
print(model) 
onnx.save(model, 'test.onnx') 




###################EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAALLLLLLLLLLLLLLLLLLLLLLLL#########
import onnxruntime 
# import numpy as np 
 
sess = onnxruntime.InferenceSession('test.onnx') 
a = np.random.rand(1,3,10, 10).astype(np.float32) 
b = np.random.rand(1,3,10, 10).astype(np.float32) 
x = np.random.rand(10, 10).astype(np.float32) 
 
output = sess.run(['output'], {'a': a, 'b': b, 'weight': x})[0] 
 
print(output)

替换操作

在这里插入图片描述

import onnx

onnx_model = onnx.load("model.onnx")
graph = onnx_model.graph
node  = graph.node

for i in range(len(node)):
    print(i)
    print(node[i])
	


print(123)


old_scale_node = node[3372]
new_scale_node = onnx.helper.make_node('Add', ['onnx::Add_4676', 'onnx::Add_4676'], ['onnx::Gather_4677']) 

graph.node.remove(old_scale_node)  
graph.node.insert(3372, new_scale_node) 
graph.node.remove(node[3364])  
onnx.checker.check_model(onnx_model)
onnx.save(onnx_model, 'out2.onnx')


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

王道计组(23版)3_存储系统

概述 RAM:随机存储器,任一个存储单元可以随机存取,易失。用作主存(DRAM)或Cache(SRAM) ROM:只读存储器,可随机读出,写入较慢,需刷新,非易失。Flash、SSD固态硬盘、U盘 _____SSD&…

某医院网络安全分析案例

背景 我们已将NetInside流量分析系统部署到某市医院的机房内,使用流量分析系统提供实时和历史原始流量。本次分析重点针对网络流量安全进行分析,以供安全取证、网络质量监测以及深层网络分析。 分析时间 报告分析时间范围为:2023-04-12 16…

牛客网Verilog刷题——VL3

牛客网Verilog刷题——VL3 题目答案 题目 要求设计一个奇偶校验模块,根据sel信号选择进行奇校验还是偶校验(sel0,进行偶校验;sel1,进行奇校验),根据输入的32位数据生成1位的奇偶校验位。   …

云安全监控及云数据保护

如今,许多公司已经迁移到云,目的是进行扩展和现代化,但在此过程中,他们面临着新的、代价高昂的风险。云安全是一种多管齐下的方法,专注于保护数据和业务内容,同时确保企业的业务运营高效运行。 监控云访问 …

JMM 内存模型

文章目录 1、 java 内存模型1.1 原子性1.2 问题分析1.3 解决方法 2、可见性2.1 退不出的循环2.2 解决方法2.3 可见性 3、有序性3.1 诡异的结果3.2 解决方法3.3 有序性理解3.4 happens-before 4、CAS 与 原子类4.1 CAS4.2 乐观锁与悲观锁4.3 原子操作类 5、synchronized 优化5.1…

MemCache详细解读

目录 一、MemCache是什么 二、MemCache特性和限制 三、MemCache实现原理 四、MemCache的Java实现实例 五、MemCache指令汇总 一、MemCache是什么 MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它…

【李宏毅】自注意力机制self-attention

课件网址: 【機器學習2021】自注意力機制 (Self-attention) (上) - YouTube 【機器學習2021】自注意力機制 (Self-attention) (下) - YouTube 这两章课程主要在讲self-attention是怎么做的,对应的矩阵操作是什么,以及为什么要这样处理。 …

MySQL_第13章_约束

第13章_约束 1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息…

SQL Server 意向锁

SQL Server 数据库引擎使用意向锁来确保共享锁(S 锁)或排他锁(X 锁)放置在锁层次结构的底层资源上。 意向锁之所以命名为意向锁,是因为在较低级别锁前可获取它们,因此会通知意向将锁放置在较低级别上。 意向…

fastadmin后台用户管理中余额记录显示

查询明细JS代码 {field: buttons,width: "200px",title: __(查询明细),table: table,events: Table.api.events.operate,buttons: [{name: money,text: __(余额),title: __(余额),classname: btn btn-xs btn-success btn-dialog,icon: fa fa-database,url: user/us…

按照条件向Spring容器中注册bean

1.Conditional注解概述 Conditional注解可以按照一定的条件进行判断,满足条件向容器中注册bean,不满足条件就不向容器中注册bean。 package org.springframework.context.annotation;import java.lang.annotation.Documented; import java.lang.annota…

数据转换器的工程师指南

数据转换是连接模拟和数字世界的重要电路,在大多数嵌入式系统中,您都会发现模拟到数字转换和数字到模拟转换,从物联网(IoT)传感器到无线网络,从智能家居自动化到电源,数据转换无处不在。在本文中…

Git在工作中的使用流程

Git中的分支 master分支:所有用户可见的正式版本,都从master发布(也是用于部署生产环境的分支,确保master分支稳定性)。主分支作为稳定的唯一代码库,不做任何开发使用。master 分支一般由develop以及hotfi…

自学黑客/网络安全,三个月究竟能学到多少知识?

现在可以看到很多标题都是三个月零基础转行网络安全,三个月成为网络安全工程师月入15K,还有很多一系列类似吸引人的标题,那这些话是不是真实情况呢?那我们就来整理一下这三个月可以学到什么,然后再来看根据三个月的学习…

PyTorch训练提升

1. 更换学习率schedule 学习率 schedule 的选择对模型的收敛速度和泛化能力有很大的影响。Leslie N. Smith 等人在论文《Cyclical Learning Rates for Training Neural Networks》、《Super-Convergence: Very Fast Training of Neural Networks Using Large Learning Rates 》…

web前端 --- CSS(1)

CSS&#xff08;Cascade Style Sheet&#xff09; --- 级联样式表&#xff08;1&#xff09; <head><style>选择器{属性名&#xff1a;属性值;属性名&#xff1a;属性值;}</style> </head>属性名&#xff1a;修饰对象的属性&#xff08;样式&#xff…

docker ——安装tomcat

环境&#xff1a;centos7 安装tomcat 第一步&#xff1a;联网 第二步&#xff1a;开启docker systemctl start docker 第三步&#xff1a;拉取镜像 docker pull tomcat //下载tomcat镜像 docker pull tomcat 第四步&#xff1a;创建容器 docker run -d …

Solr之查询页面,索引,SolrJ

文章目录 1 Solr查询1.1 查询页面1.1.1 基本查询1.1.2 Solr检索运算符1.1.3 高亮1.1.4 分组1.1.4.1 分组&#xff08;Field Facet&#xff09;1.1.4.2 分组&#xff08;Date Facet&#xff09; 1.2 创建索引文件1.2.1 使用Post上传文件1.2.1.1 Linux下使用1.2.1.1.1 索引XML1.2…

BDCC- 数据湖体系

文章目录 数据湖的概念数据湖 vs 数据仓库 vs Lakehouse① 业界进展&#xff08;Databricks 2.0&#xff09;-湖上建仓② 业界进展&#xff08;Snowflake EDW 2.0&#xff09;-仓外挂湖 LakeHouse 的演进&#xff08;1&#xff09;Lakehouse 的演进路线&#xff08;2&#xff0…

基于matlab的长短期神经网络LSTM的电力负荷预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的电力负荷预测 MATALB代码 效果图 结果分析 展望 参考论文 背影 电力负荷预测的实质是从已知的电力系统&#xff0c;经济&#xff0c;社会&#xff0c;气象等情况出发&#xff0c;根据历史负荷变化规律…