【问题标题】:Upgrade ONNX model from version 9 to 11将 ONNX 模型从版本 9 升级到 11
【发布时间】:2021-11-09 13:31:13
【问题描述】:

我正在使用我需要量化以减小其大小的 ONNX 模型,为此我遵循官方 documentation 上的说明:

import onnx
from onnxruntime.quantization import quantize_dynamic, QuantType

model_fp32 = 'path/to/the/model.onnx'
model_quant = 'path/to/the/model.quant.onnx'
quantized_model = quantize_dynamic(model_fp32, model_quant, weight_type=QuantType.QUInt8)

但是当我运行它时,我收到以下警告:

WARNING:root:The original model opset version is 9, which does not support quantization. Please update the model to opset >= 11. Updating the model automatically to opset 11. Please verify the quantized model.

我测试了量化模型并没有工作,它会产生这个错误:

 INVALID_GRAPH : Load model from model_a2_quant.onnx failed:This is an invalid model. Error in Node:Upsample__477 : Op registered for Upsample is deprecated in domain_version of 11

此时我有什么替代方法来量化模型?

我从这个 repo 获得了张量流中的原始模型:https://github.com/ciber-lab/pictor-ppe

并使用以下代码将其转换为 ONNX:

# input and output
input_tensor = Input( shape=(input_shape[0], input_shape[1], 3) ) # input
num_out_filters = ( num_anchors//3 ) * ( 5 + num_classes )        # output

## Build and load the model 
model = yolo_body(input_tensor, num_out_filters)

weight_path = 'ONNX_demo/models/pictor-ppe-v302-a1-yolo-v3-weights.h5'

model.load_weights( weight_path )
tf.saved_model.save(model, "ONNX_demo/models/save_model")

# convert it to ONNX format: 

python3 -m tf2onnx.convert --saved-model "ONNX_demo/models/save_model" --output "ONNX_demo/models/model.onnx"

【问题讨论】:

    标签: python tensorflow machine-learning onnx onnxruntime


    【解决方案1】:

    我没有时间测试您的应用程序,但我相信问题发生在您尝试将模型转换为 ONNX 格式时。

    默认情况下,tensorflow-onnx 使用 opset-9 生成 ONNX 图。可能是因为您的模型 opset 版本是 9。或者因为您系统上安装的 ONNX 版本是这个版本。

    将模型转换为 ONNX 格式时,您可以指定 opset 版本,只需在命令行中键入以下参数即可:

    --opset 11
    

    在您的情况下,完整的命令行如下所示:

    python3 -m tf2onnx.convert \
               --saved-model "ONNX_demo/models/save_model" \
               --output "ONNX_demo/models/model.onnx" \
               --opset 11
    

    在官方tensorflow-onnx GitHub repository中,他们说:

    默认情况下,我们使用 opset 9 来生成图形。通过指定 --opset 用户可以覆盖默认值以生成具有所需 opset 的图形。例如 --opset 13 将创建一个 onnx 图 仅使用 opset 13 中可用的 ops。因为较旧的 opset 在大多数 较旧的情况下操作较少,某些模型可能无法在 opset 上转换。

    希望我在某些方面有所帮助。

    【讨论】:

    • 如果答案解决了您的问题,或者您认为这是最好的解决方案。请投票并将此答案标记为已接受!谢谢!如果它不能解决您的问题,请告诉我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2021-05-23
    • 1970-01-01
    • 2018-04-07
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多