合并两个onnx文件到一个onnx

该代码段展示了如何将两个ONNX模型(一个编码器和一个解码器)进行合并。首先,它遍历解码器的节点,修改其名称、输入和输出以避免与编码器冲突。接着,将解码器的初始化器添加到编码器中。然后,添加一个新的输出节点(ReduceSum操作)。最后,保存合并后的ONNX模型。

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

import onnx
import copy

def combine_onnx(list_modelname, output_combine_name):
    # 模型中节点和输入输出名字可能一样,合并前vocoder要加个前缀
    # onnx包含的数据类型: node\input\output\tensor(initializer)

    model_encoder = onnx.load(list_modelname[0])
    model_vocoder = onnx.load(list_modelname[1])
    #1、替换vocoder中的所有node的name、input、output并添加到encoder中
    for node in model_vocoder.graph.node:
        if 'c' in node.input:
            node.input.pop(0)
            node.input.append('dict')
        
        if node.name[0] == '/':
            node.name = '/vocoder_' + node.name[1:]

        for index in range(len(node.input)):
            if 'dict' in node.input: 
                input = node.input.pop(0)
                node.input.append('dict')

                continue
            input = node.input.pop(0)

            input = '/vocoder_' + input[1:] if input[0] == '/' else '/vocoder_' + input
            node.input.append(input)

        for index in range(len(node.output)):
            output = node.output.pop(0)
            output = '/vocoder_' + output[1:] if output[0] == '/' else '/vocoder_' + output
            node.output.append(output)

        model_encoder.graph.node.append(node)

    #2、添加vocoder中的initializer

    for weight in model_vocoder.graph.initializer:
        weight.name = '/vocoder_' + weight.name[1:] if weight.name[0] == '/' else '/vocoder_' + weight.name
        model_encoder.graph.initializer.append(weight)

    #3、添加 output
    model1_output_tensor_type = model_vocoder.graph.output[0].type.tensor_type
    output_elem_type = model1_output_tensor_type.elem_type
    output_shape = []
    output_name = '/vocoder_wav'

    for s in model1_output_tensor_type.shape.dim:
        if (s.dim_value > 0):
            output_shape.append(s.dim_value)
        else:        
            output_shape.append(s.dim_param)
    
    model_encoder_output = onnx.helper.make_tensor_value_info(
                                    output_name,
                                    output_elem_type,
                                    output_shape
                                )


    #4、添加duration sum 节点

    node = onnx.helper.make_node(
        'ReduceSum',
        name='output_duration',
        inputs=['duration'],
        outputs=['/output_duration_sum'],
    )
    node.attribute.append(onnx.helper.make_attribute("keepdims", 0))


    model_encoder.graph.node.append(node)

    model1_output_tensor_type = model_encoder.graph.output[1].type.tensor_type
    output_elem_type = model1_output_tensor_type.elem_type
    output_shape = [1]
    output_name = '/output_duration_sum'
    
    model_encoder_dur_output = onnx.helper.make_tensor_value_info(
                                    output_name,
                                    output_elem_type,
                                    output_shape
                                )
    model_encoder.graph.output.pop(0)
    model_encoder.graph.output.pop(0)
    model_encoder.graph.output.append(model_encoder_output)
    model_encoder.graph.output.append(model_encoder_dur_output)


    #4、保存新模型
    onnx.save(model_encoder, output_combine_name)

if __name__ == "__main__":
    list_modelname = ['fs2_conformer/encoder_ipu.onnx', 'fs2_conformer/vocoder.online.onnx']
    output_name = 'fs2_conformer/combine.onnx'
    combine_onnx(list_modelname, output_name)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值