onnx模型修改输入维度

代码参考
这个代码实现将原始onnx模型的所有输入的第一个维度修改为sym_batch_dim=1

import onnx
def change_input_dim(model):
    # Use some symbolic name not used for any other dimension
    sym_batch_dim = "1" 
    # or an actal value
    actual_batch_dim = 4

    # The following code changes the first dimension of every input to be batch-dim
    # Modify as appropriate ... note that this requires all inputs to
    # have the same batch_dim
    inputs = model.graph.input
    for input in inputs:
        # Checks omitted.This assumes that all inputs are tensors and have a shape with first dim.
        # Add checks as needed.
        dim1 = input.type.tensor_type.shape.dim[0]
        # update dim to be a symbolic value
        dim1.dim_param = sym_batch_dim
        # or update it to be an actual value:
        # dim1.dim_value = actual_batch_dim

def apply(transform, infile, outfile):
    model = onnx.load(infile)
    transform(model)
    onnx.save(model, outfile)
onnx_path = r'org.onnx'
apply(change_input_dim, onnx_path, "modified.onnx")
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') ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值