You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从量化TFLite转换得到的ONNX模型中获取量化参数?

从量化ONNX模型中提取Scale和Zero Point的解决方案

方法1:使用ONNX原生API解析模型

直接读取ONNX模型文件,可通过两种方式获取量化参数:

  • 读取输入/输出张量的量化属性:如果模型的量化参数直接绑定在张量上,可直接访问quantization_params属性
    import onnx
    
    # 加载ONNX模型
    model = onnx.load("quantized_yolov5.onnx")
    
    # 提取输入张量量化参数
    for input_tensor in model.graph.input:
        if hasattr(input_tensor, "quantization_params"):
            scale = input_tensor.quantization_params.scale
            zero_point = input_tensor.quantization_params.zero_point
            print(f"输入 {input_tensor.name}:scale={scale}, zero_point={zero_point}")
    
    # 提取输出张量量化参数
    for output_tensor in model.graph.output:
        if hasattr(output_tensor, "quantization_params"):
            scale = output_tensor.quantization_params.scale
            zero_point = output_tensor.quantization_params.zero_point
            print(f"输出 {output_tensor.name}:scale={scale}, zero_point={zero_point}")
    
  • 遍历量化操作节点:如果是动态量化模型,量化参数通常嵌入在QuantizeLinear或DequantizeLinear节点的常量输入中
    # 遍历模型节点查找量化相关操作
    for node in model.graph.node:
        if node.op_type in ("QuantizeLinear", "DequantizeLinear"):
            # 定位scale和zero_point对应的常量张量
            scale_tensor = next(t for t in model.graph.initializer if t.name == node.input[1])
            zero_point_tensor = next(t for t in model.graph.initializer if t.name == node.input[2])
            # 解析常量值
            scale = scale_tensor.float_data[0] if scale_tensor.float_data else onnx.numpy_helper.to_array(scale_tensor)[0]
            zero_point = zero_point_tensor.int32_data[0] if zero_point_tensor.int32_data else onnx.numpy_helper.to_array(zero_point_tensor)[0]
            print(f"{node.op_type}节点 {node.name}:scale={scale}, zero_point={zero_point}")
    

方法2:通过ONNX Runtime获取量化参数

虽然get_inputs()/get_outputs()不直接显示量化参数,但可通过ORT的内部属性访问:

import onnxruntime as ort

# 加载量化模型
sess = ort.InferenceSession("quantized_yolov5.onnx")

# 提取输入量化参数
for input_info in sess.get_inputs():
    if hasattr(input_info, "quantization"):
        q_params = input_info.quantization
        print(f"输入 {input_info.name}:scale={q_params.scale}, zero_point={q_params.zero_point}")

# 提取输出量化参数
for output_info in sess.get_outputs():
    if hasattr(output_info, "quantization"):
        q_params = output_info.quantization
        print(f"输出 {output_info.name}:scale={q_params.scale}, zero_point={q_params.zero_point}")

如果上述方法无效,可尝试读取模型元数据中的量化信息:

meta = sess.get_modelmeta().custom_metadata_map
if "quantization_scale" in meta:
    print(f"全局scale:{meta['quantization_scale']}")

方法3:转换时确保量化参数被保留

使用tf2onnx转换TFLite模型时,添加特定参数保证量化信息完整导出:

python -m tf2onnx.convert --tflite quantized_yolov5.tflite --output quantized_yolov5.onnx --opset 13 --enable_mlir

--enable_mlir参数能提升量化模型转换的准确性,确保scale和zero point等参数被正确写入ONNX模型的对应属性中。


内容的提问来源于stack exchange,提问作者PesozuSejin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:55:15