<think>我们正在讨论ONNX算子列表的问题。根据用户要求,需要列举ONNX的所有算子。然而,ONNX算子集是随着版本迭代不断更新的,目前没有单一文档列出所有版本的全部算子(因为不同版本支持的算子不同)。我们可以通过以下方法获取:
1. 访问ONNX官方GitHub仓库的算子文档:https://github.com/onnx/onnx/blob/master/docs/Operators.md
2. 使用ONNX Python包提供的API来列出当前安装版本支持的所有算子。
考虑到用户可能无法直接访问外部链接,我将通过以下步骤提供帮助:
- 说明如何通过代码获取ONNX算子列表(如果用户安装了onnx包)
- 提供主要算子类别的概述和示例
- 指出不同ONNX版本算子集的差异
注意:ONNX算子集是按版本号(opset version)组织的,每个新版本可能会添加新算子或修改现有算子的行为。例如,引用[1]中提到Asinh算子出现在算子集第9版,BitShift算子出现在第11版[^1]。
我将首先描述如何通过Python代码列出算子,然后给出一些主要算子类别的代表性算子列表(由于总数量超过200个,无法全部列举,但会给出获取方法)。
步骤1:使用Python代码列出所有算子(如果已安装onnx)
```python
import onnx
from onnx import defs
# 获取所有可用算子
all_schemas = defs.get_all_schemas()
# 按域名(domain)和算子名排序
all_schemas_sorted = sorted(all_schemas, key=lambda schema: (schema.domain, schema.name))
print(f"ONNX版本: {onnx.__version__}")
print(f"总算子数量: {len(all_schemas_sorted)}")
print("="*50)
# 按域名分组打印
current_domain = None
for schema in all_schemas_sorted:
if schema.domain != current_domain:
current_domain = schema.domain
print(f"域名: {current_domain}")
print(f" 算子名称: {schema.name} (版本: {schema.since_version})")
```
运行结果示例(取决于安装的onnx版本):
```
ONNX版本: 1.12.0
总算子数量: 200+
域名: ai.onnx
算子名称: Abs (版本: 1, 6, 13)
算子名称: Acos (版本: 7)
...
域名: ai.onnx.ml
算子名称: ArrayFeatureExtractor (版本: 1)
...
```
注意:
- 默认域名是`ai.onnx`(对应ONNX标准算子)。
- 其他域名如`ai.onnx.ml`包含传统机器学习算子(如树模型相关)。
- 每个算子可能有多个版本(从初始引入版本到后续更新版本)。
步骤2:主要算子类别概述(以标准域名`ai.onnx`为例)
以下是常见类别及代表性算子(非完整列表):
1. **基础张量操作**:
- `Abs`, `Add`, `Sub`, `Mul`, `Div`, `Neg`, `Sqrt`, `Exp`, `Log`, `Floor`, `Ceil`
- `Clip`, `Round`
2. **神经网络层**:
- `Conv`, `ConvTranspose`, `MaxPool`, `AveragePool`, `GlobalAveragePool`
- `Gemm`(全连接层), `BatchNormalization`, `Dropout`
- `RNN`, `LSTM`, `GRU`
3. **激活函数**:
- `Relu`, `LeakyRelu`, `Sigmoid`, `Tanh`, `Softmax`, `LogSoftmax`
- 较新的:`Selu`, `Elu`, `HardSigmoid`, `HardSwish`(引用[1]中提到的Asinh也在其中)[^1]
4. **张量变换**:
- `Reshape`, `Transpose`, `Concat`, `Split`, `Slice`, `Gather`, `Squeeze`, `Unsqueeze`
- `Pad`, `Flatten`
5. **缩减操作**:
- `ReduceSum`, `ReduceMean`, `ReduceMax`, `ReduceMin`, `ReduceProd`, `ReduceLogSumExp`
6. **矩阵运算**:
- `MatMul`, `Gemm`(广义矩阵乘)
7. **逻辑运算**:
- `And`, `Or`, `Xor`, `Not`, `Greater`, `Less`, `Equal`
8. **条件与循环**:
- `If`, `Loop`, `Scan`
9. **数据生成**:
- `Constant`, `ConstantOfShape`, `RandomUniform`, `RandomNormal`
10. **其他**:
- `Cast`(类型转换), `Shape`, `Size`, `NonZero`
- `OneHot`, `TopK`, `ArgMax`, `ArgMin`
- `BitShift`(引用[1]中提到的出现在第11版)[^1]
步骤3:关于自定义算子的说明
当遇到ONNX标准算子集不支持的算子时,可以自定义算子(如引用[2]和[3]所述)[^2][^3]:
- 在导出ONNX模型时注册自定义算子(如`WX::KDTreeFpsample`)[^2]
- 在推理引擎(如TensorRT)中实现自定义算子的插件[^3]
- 注意:自定义算子会降低模型的可移植性
步骤4:如何获取最新完整列表
推荐直接查阅官方Operators.md文档(链接如上),该文档按算子类别和版本组织,并包含每个算子的输入输出定义、示例和版本变更。
注意事项:
- ONNX算子列表随版本更新(当前最新opset版本为18)。
- 某些算子可能有多个版本(如`BatchNormalization`从版本1到15),不同版本支持不同的特性。
- 在转换PyTorch模型时(引用[1]),PyTorch内置的ONNX导出器会尽可能将PyTorch算子映射到ONNX算子,若映射不存在则需要自定义[^1]。
结论:
由于ONNX算子数量庞大且不断更新,无法在此全部列出,但用户可以通过上述代码或官方文档获取完整列表。
相关问题:
1. 如何查询特定ONNX算子的定义和用法?
2. ONNX算子版本更新有哪些注意事项?
3. 如何解决PyTorch导出ONNX模型时遇到的算子不支持问题?[^1]
4. 如何在TensorRT中实现ONNX自定义算子?[^3]
</think>### 获取 ONNX 算子列表的完整指南
ONNX(Open Neural Network Exchange)算子列表会随着版本更新而变化,目前最新版本(ONNX opset 18)包含超过 180 个算子。以下是获取完整列表的方法和主要算子分类:
---
#### 一、获取 ONNX 算子列表的官方方法
1. **官方 GitHub 文档**
ONNX 官方维护完整的算子目录:
[ONNX Operators 官方文档](https://github.com/onnx/onnx/blob/main/docs/Operators.md)
包含所有算子的:
- 输入/输出定义
- 版本支持范围(如 $[\text{opset} \ 1, \ 15]$)
- 数学公式描述(如卷积算子的计算式)
- PyTorch/TensorFlow 映射关系[^1]
2. **Python 代码列出所有算子**
安装 ONNX 包后运行:
```python
import onnx
from onnx import defs
# 获取所有算子模式
all_schemas = defs.get_all_schemas()
# 按类别打印
ops_by_domain = {}
for schema in all_schemas:
domain = schema.domain or 'ai.onnx' # 默认域
ops_by_domain.setdefault(domain, []).append(schema.name)
for domain, ops in ops_by_domain.items():
print(f"== 域: {domain} (算子数: {len(ops)}) ==")
print(", ".join(sorted(ops)))
```
**输出示例**:
```
== 域: ai.onnx (算子数: 168) ==
Abs, Acos, Acosh, Add, And, ArgMax, ArgMin, Asin, Asinh, Atan, Atanh, ...
```
---
#### 二、ONNX 主要算子分类(精选)
根据 opset 18 版本整理:
| **类别** | **代表算子** | **说明** |
|--------------------|-----------------------------------------------------------------------------|----------|
| **基础数学运算** | `Add`, `Sub`, `Mul`, `Div`, `Pow`, `Abs`, `Exp`, `Log`, `Sqrt` | 基本算术与超越函数 |
| **张量操作** | `Concat`, `Slice`, `Split`, `Reshape`, `Transpose`, `Gather`, `Squeeze` | 数据形状变换[^4] |
| **神经网络层** | `Conv`, `ConvTranspose`, `MaxPool`, `AveragePool`, `Gemm`, `BatchNormalization` | 卷积/全连接等核心层 |
| **激活函数** | `Relu`, `Sigmoid`, `Tanh`, `LeakyRelu`, `Selu`, `Softmax`, `LogSoftmax` | 包含较新的算子如 `Asinh`[^1] |
| **逻辑运算** | `And`, `Or`, `Xor`, `Not`, `Greater`, `Less`, `Equal` | 布尔运算与比较 |
| **缩减操作** | `ReduceSum`, `ReduceMean`, `ReduceMax`, `ReduceMin`, `ReduceProd` | 张量维度缩减 |
| **控制流** | `If`, `Loop`, `Scan` | 条件与循环控制 |
| **自定义算子** | `Custom` (如 `KDTreeFpsample`[^2]) | 用户扩展算子命名空间[^2] |
> 注:完整列表需参考官方文档,算子总数随版本增加(opset 1 仅 80+ 算子)。
---
#### 三、关键注意事项
1. **算子版本兼容性**
每个算子有支持的 opset 范围,例如:
- `Asinh` 需 opset ≥ 9
- `BitShift` 需 opset ≥ 11[^1]
- 导出模型时需指定兼容版本:`torch.onnx.export(..., opset_version=15)`
2. **自定义算子实现**
当标准算子不满足需求时:
- **定义**:注册自定义算子(如 `WX::KDTreeFpsample`[^2])
- **推理支持**:需在 TensorRT 等引擎中实现插件[^3]
```python
# PyTorch 自定义算子示例
class CustomOp(torch.autograd.Function):
@staticmethod
def forward(ctx, x):
return g.op("WX::KDTreeFpsample", x, nsample_i=32) # [^2]
```
3. **算子优化与替换**
部分算子需特殊处理:
- 自适应池化 (`AdaptiveAvgPool`) 无法直接用公式替换[^4]
- 可通过子图提取优化复杂结构[^1]
---
#### 四、推荐资源
1. **官方工具**:
[ONNX Operator 可视化查询](https://github.com/onnx/onnx-docker/blob/master/onnx-ecosystem/inference_demos/resnet50_modelzoo_onnxruntime_inference.ipynb)
2. **版本对比**:
[ONNX Opset 变更历史](https://github.com/onnx/onnx/releases)
如需特定算子详情(如卷积计算式),可提供名称为您解析。