4.7 构建onnx结构模型-Transpose

本文介绍了将PyTorch模型转换为ONNX结构的方法,重点讲解了使用`Transpose`节点的示例,包括如何创建onnx模型、检查和运行onnx计算图,以及使用CPUExecutionProvider执行模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

构建onnx方式通常有两种:
1、通过代码转换成onnx结构,比如pytorch —> onnx
2、通过onnx 自定义结点,图,生成onnx结构

本文主要是简单学习和使用两种不同onnx结构,
下面以transpose 结点进行分析
在这里插入图片描述

方式

方法一:pytorch --> onnx

暂缓,主要研究方式二

方法二: onnx

import onnx 
from onnx import TensorProto, helper, numpy_helper

def run():
    print("run start....\n")
    perm = [0,2,1]
    Transpose = helper.make_node(
            "Transpose",
            perm=perm,
            inputs=["input"],
            outputs=["output"],
            name="Transpose",
        )
    graph = helper.make_graph(
        nodes=[Transpose],
        name="test_graph",
        inputs=[
            helper.make_tensor_value_info(
                "input", TensorProto.FLOAT, (16,397,80)
            )
        ],  # use your input
        outputs=[
            helper.make_tensor_value_info(
                "output", TensorProto.FLOAT, (16,80,397)
            )
        ],  # use your output
        initializer=[
            helper.make_tensor("perm", TensorProto.INT64, [len(perm)], perm),
        ],
        )

    op = onnx.OperatorSetIdProto()
    op.version = 11
    model = helper.make_model(graph, opset_imports=[op])
    print("run done....\n")

    return model

if __name__ == "__main__":
    model = run()
    onnx.save(model, "./test_transpose.onnx")

运行onnx

import onnx
import onnxruntime
import numpy as np


# 检查onnx计算图
def check_onnx(mdoel):
    onnx.checker.check_model(model)
    # print(onnx.helper.printable_graph(model.graph))

def run(model):
    print(f'run start....\n')
    session = onnxruntime.InferenceSession(model,providers=['CPUExecutionProvider'])
    input_name1 = session.get_inputs()[0].name  
    input_data1= np.random.randn(16,397,80).astype(np.float32)
    print(f'input_data1 shape:{input_data1.shape}\n')

    output_name1 = session.get_outputs()[0].name

    pred_onx = session.run(
    [output_name1], {input_name1: input_data1})[0]

    print(f'pred_onx shape:{pred_onx.shape} \n')

    print(f'run end....\n')


if __name__ == '__main__':
    path = "./test_transpose.onnx"
    model = onnx.load("./test_transpose.onnx")
    check_onnx(model)
    run(path)
ONNX(Open Neural Network Exchange)是一个开源框架,用于定义、保存和加载机器学习模型,使得不同深度学习库之间的模型转换变得简单。如果在处理ONNX模型时需要插入Transpose(转置)节点,这是因为某些模型可能需要调整数据的维度顺序,例如当输入或输出通道不是一维数组,而是一组二维切片时。 插入Transpose节点的具体步骤如下: 1. **理解需求**:首先,分析模型结构,确定哪个层或运算需要对输入张量进行转置操作。这通常发生在卷积层之后,输出通道被展平为一个二维矩阵,或者是在某些特定的网络架构中为了保持形状一致性。 2. **找到对应节点**:在ONNX图中查找需要插入转置的地方,这通常是输入到该节点之前的位置。 3. **创建新节点**:使用`onnx.helper.make_node`函数创建一个Transpose节点,提供必要的参数。这包括节点名称(node_name)、输入张量的名字(input_tensor),以及需要转置轴的列表(perm)。比如,`perm=[0, 2, 3, 1]`表示将原第四维(axis=3)放在最前面。 ```python import onnx from onnx.helper import make_node perm = [0, 2, 3, 1] # 假设我们想将四维张量的第三个和第四个轴交换位置 node = make_node('Transpose', inputs=['input_tensor'], outputs=['output_tensor'], perm=perm) ``` 4. **添加节点到模型**:将新创建的节点加入到现有的模型图中,并连接到相关的输入和输出端口。 ```python graph_def = model.graph graph_def.node.extend([node]) model.graph = graph_def ``` 5. **保存更新后的模型**:最后用`onnx.save`方法将修改后的ONNX模型保存到新的文件。 ```python onnx.save(model, 'modified_model.onnx') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nsq_ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值