onnx模型结构
时间: 2025-04-01 09:13:25 浏览: 45
### ONNX模型结构详解
ONNX(Open Neural Network Exchange)是一种开放的神经网络交换格式,旨在使不同框架之间能够无缝共享机器学习模型。其核心组成部分包括 **Graph**、**Node** 和 **Tensor**,这些组件共同定义了一个计算图及其数据流。
#### 1. Model
Model 是整个 ONNX 文件的核心对象,它包含了完整的模型描述以及元信息。加载一个 ONNX 模型可以通过 `onnx.load` 方法实现[^3]:
```python
import onnx
model = onnx.load("demo.onnx")
```
- **Opset 版本**: 定义了模型使用的操作符集版本号。
- **导出程序类型**: 表明该模型是由哪种工具或框架导出的。
#### 2. Graph (模型图)
Graph 描述了模型的整体架构,它是 ONNX 的中心概念之一。Graph 中的关键属性如下:
- **Nodes**: 图中的节点集合,表示具体的运算单元,例如卷积层、批量归一化层等。每个 Node 都有对应的输入 (`input`) 和输出 (`output`) 属性来定义与其他节点的关系:
```python
nodes = model.graph.node
```
- **Initializers**: 存储权重和其他常量参数的数据。它们通常是预训练好的张量,在推理阶段被固定下来:
```python
initializers = model.graph.initializer
```
- **Inputs**: 整个模型的输入列表,指定了哪些节点作为外部数据源接入到计算图中,并提供了形状和数据类型的详细说明:
```python
inputs = model.graph.input
```
- **Outputs**: 类似于 Inputs,但用于指定最终的结果出口位置及相应的特性:
```python
outputs = model.graph.output
```
#### 3. Tensor 数据存储
Tensors 被广泛应用于保存各种形式的数据,比如激活值或者权值矩阵。对于较大的权重向量来说,一般会存放在 Initializers 当中;而对于较小规模或者是临时性的中间变量,则可能直接嵌入 Nodes 内部处理。
---
以下是基于上述理论的一个简单验证过程实例[^4]:
```python
import numpy as np
import torch
from torchvision.models import efficientnet_b0
import onnxruntime as ort
# 导出 PyTorch EfficientNet-B0 到 ONNX 格式
dummy_input = torch.randn(1, 3, 224, 224)
torch_model = efficientnet_b0(pretrained=True).eval()
torch_out = torch_model(dummy_input)
torch.onnx.export(
torch_model,
dummy_input,
"efficientnet_b0.onnx",
export_params=True,
opset_version=11,
do_constant_folding=True,
input_names=['input'],
output_names=['output']
)
# 加载并检查 ONNX 模型
onnx_model = onnx.load("efficientnet_b0.onnx")
onnx.checker.check_model(onnx_model)
# 使用 NumPy 进行精度对比测试
ort_session = ort.InferenceSession("efficientnet_b0.onnx")
def to_numpy(tensor):
return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy()
# 计算 ONNX 输出并与原始 PyTorch 结果比较
ort_inputs = {ort_session.get_inputs()[0].name: to_numpy(dummy_input)}
ort_outs = ort_session.run(None, ort_inputs)
np.testing.assert_allclose(to_numpy(torch_out), ort_outs[0], rtol=1e-03, atol=1e-05)
print("Exported model has been tested with ONNXRuntime, and the result looks good!")
```
此脚本展示了如何从 PyTorch 将分类模型转换成 ONNX 并完成基本的功能性和准确性检验。
---
阅读全文
相关推荐
















