目 录CONTENT

文章目录

将您的机器学习模型导出为ONNX格式

Administrator
2026-02-05 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/export-your-ml-model-in-onnx-format/

原文作者:Jason Brownlee


ONNX(开放神经网络交换)是一种开放格式,用于表示机器学习模型。它可以用于在不同的AI框架之间轻松共享模型。例如,您可以在PyTorch中训练模型,然后将其转换为ONNX格式,以便在支持ONNX的推理引擎(如ONNX Runtime)中进行部署。

本指南将介绍如何将深度学习模型导出为ONNX格式,主要关注使用Python进行操作。

什么是ONNX?

ONNX是一种开放格式,用于表示机器学习模型。它旨在支持模型在不同框架之间的互操作性。

ONNX格式包括两部分:

  • 模型:一个定义了模型拓扑和参数的序列化文件。
  • 运行时:一个推理引擎,可以在不同硬件和操作系统上运行ONNX模型。

将模型导出到ONNX格式的主要优势包括:

  • 框架互操作性:在不同框架(如PyTorch、TensorFlow、Keras)之间共享模型。
  • 硬件加速:支持许多硬件加速器,例如NVIDIA GPU、Intel CPU等。
  • 生态系统支持:有许多工具和库支持ONNX格式,可以用于模型部署、可视化和分析。

如何将模型导出为ONNX?

将模型导出为ONNX通常涉及以下步骤:

  1. 创建一个用于导出的模型。
  2. 准备一个示例输入张量,以确定模型的输入形状和数据类型。
  3. 使用框架的特定工具将模型转换为ONNX格式。
  4. 验证导出的ONNX模型是否正确。

使用PyTorch导出ONNX模型

PyTorch提供了一个内置的torch.onnx.export()函数,用于将模型导出为ONNX格式。您需要提供模型、示例输入和文件名。

以下是一个简单的例子,展示如何导出PyTorch模型:

import torch
import torch.nn as nn

# 1. 定义一个简单的模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(10, 5)

    def forward(self, x):
        return self.linear(x)

model = SimpleModel()

# 2. 创建一个示例输入张量
# 形状 (batch_size, input_features) = (1, 10)
dummy_input = torch.randn(1, 10, requires_grad=True)

# 3. 导出模型
output_onnx_file = "simple_model.onnx"

torch.onnx.export(model,               # 要导出的模型
                  dummy_input,         # 示例输入数据
                  output_onnx_file,    # 输出文件名
                  export_params=True,  # 导出模型权重
                  opset_version=12,    # ONNX操作集版本
                  do_constant_folding=True,  # 是否折叠常量
                  input_names=['input'],   # 输入名称
                  output_names=['output'], # 输出名称
                  dynamic_axes={'input': {0: 'batch_size'},    # 动态批次大小
                                'output': {0: 'batch_size'}})

print(f"Model exported to {output_onnx_file}")

关键参数解释:

  • opset_version:指定ONNX操作集版本。建议使用较新的版本,如11或12。
  • dynamic_axes:允许模型在推理时使用不同大小的输入批次。

使用Keras/TensorFlow导出ONNX模型

对于TensorFlow和Keras模型,您可以使用tf2onnx库将它们转换为ONNX格式。首先需要安装该库:

pip install tf2onnx

Keras导出示例:

假设您已经训练了一个Keras模型:

import tensorflow as tf
import tf2onnx

# 假设my_keras_model是您已训练好的Keras模型
# 创建一个简单的Keras模型用于演示
model = tf.keras.Sequential([
    tf.keras.layers.Dense(5, input_shape=(10,)),
    tf.keras.layers.Softmax()
])

# 准备示例输入
input_signature = [tf.TensorSpec([1, 10], tf.float32, name="input")]

# 导出到ONNX
model_proto, external_tensor_storage = tf2onnx.convert.from_keras(
    model, 
    input_signature=input_signature,
    output_path="keras_model.onnx"
)

print("Keras model exported to keras_model.onnx")

TensorFlow导出示例:

对于TensorFlow SavedModel格式,导出过程类似:

import tensorflow as tf
import tf2onnx

# 假设您有一个SavedModel路径
saved_model_path = "my_saved_model"

# 导出模型
model_proto, external_tensor_storage = tf2onnx.convert.from_saved_model(
    saved_model_path,
    output_path="tf_model.onnx"
)

print("TensorFlow SavedModel exported to tf_model.onnx")

验证ONNX模型

导出模型后,强烈建议验证其功能是否与原始模型一致。您可以使用ONNX Runtime库来加载和运行ONNX模型。

首先安装ONNX Runtime:

pip install onnxruntime

然后,您可以使用Python脚本进行验证。以下是一个通用的验证概念:

import onnxruntime
import numpy as np

# 1. 加载ONNX模型
ort_session = onnxruntime.InferenceSession("simple_model.onnx")

# 2. 准备输入数据(必须是NumPy数组,并且与导出时的数据类型和形状匹配)
# 假设输入形状为 (1, 10)
input_data = np.random.randn(1, 10).astype(np.float32)

# 3. 获取输入和输出名称
input_name = ort_session.get_inputs()[0].name
output_name = ort_session.get_outputs()[0].name

# 4. 运行推理
ort_inputs = {input_name: input_data}
ort_outputs = ort_session.run([output_name], ort_inputs)

# 5. 比较结果(需要原始框架的输出进行对比)
print("ONNX Runtime output shape:", ort_outputs[0].shape)

通过将ONNX Runtime的输出与原始框架(如PyTorch或TensorFlow)的输出进行比较,您可以确保转换过程没有引入错误。

总结

ONNX为机器学习模型的跨框架部署提供了一个强大的解决方案。无论是使用PyTorch还是TensorFlow/Keras,都有相应的工具链支持导出为ONNX格式。掌握这些导出和验证技术,是实现生产环境中高效、灵活部署的关键步骤。




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区