onnx_ir.convenience¶
- onnx_ir.convenience.convert_attribute(name, attr, attr_type=None)¶
将 Python 对象转换为 _core.Attr 对象。
此方法在构造带属性的节点时很有用。它根据 Python 值的类型推断属性类型。
- 参数:
name (str) – 属性的名称。
attr (str | int | float | Sequence[int] | Sequence[float] | Sequence[str] | TensorProtocol | TensorProto | Attr | GraphProtocol | Sequence[GraphProtocol] | GraphProto | TypeProtocol | Sequence[TypeProtocol] | None) – 属性的值。
attr_type (AttributeType | None) – 属性的类型。当 attr 为 None 时,此项为必填。如果提供,它将覆盖推断的类型。
- 返回:
一个
Attr对象。- 引发:
ValueError – 如果
attr为None且未提供attr_type。TypeError – 如果不支持属性的类型。
- 返回类型:
- onnx_ir.convenience.convert_attributes(attrs)¶
将属性字典转换为 _core.Attr 对象列表。
它根据值的类型推断属性类型。支持的类型有:int、float、str、Sequence[int]、Sequence[float]、Sequence[str]、
_core.Tensor和_core.Attr>>> import onnx_ir as ir >>> import onnx >>> import numpy as np >>> attrs = { ... "int": 1, ... "float": 1.0, ... "str": "hello", ... "ints": [1, 2, 3], ... "floats": [1.0, 2.0, 3.0], ... "strings": ["hello", "world"], ... "tensor": ir.Tensor(np.array([1.0, 2.0, 3.0])), ... "tensor_proto": ... onnx.TensorProto( ... dims=[3], ... data_type=onnx.TensorProto.FLOAT, ... float_data=[1.0, 2.0, 3.0], ... name="proto", ... ), ... "graph": ir.Graph([], [], nodes=[], name="graph0"), ... "graphs": [ir.Graph([], [], nodes=[], name="graph1"), ir.Graph([], [], nodes=[], name="graph2")], ... "type_proto": ir.TensorType(ir.DataType.FLOAT), ... "type_protos": [ir.TensorType(ir.DataType.FLOAT), ir.TensorType(ir.DataType.FLOAT)], ... } >>> convert_attributes(attrs) [Attr('int', INT, 1), Attr('float', FLOAT, 1.0), Attr('str', STRING, 'hello'), Attr('ints', INTS, (1, 2, 3)), Attr('floats', FLOATS, (1.0, 2.0, 3.0)), Attr('strings', STRINGS, ('hello', 'world')), Attr('tensor', TENSOR, Tensor<DOUBLE,[3]>(array([1., 2., 3.]), name=None)), Attr('tensor_proto', TENSOR, TensorProtoTensor<FLOAT,[3]>(array([1., 2., 3.], dtype=float32), name='proto')), Attr('graph', GRAPH, Graph( name='graph0', inputs=( ), outputs=( ), len()=0 )), Attr('graphs', GRAPHS, (Graph( name='graph1', inputs=( ), outputs=( ), len()=0 ), Graph( name='graph2', inputs=( ), outputs=( ), len()=0 ))), Attr('type_proto', TYPE_PROTO, Tensor(FLOAT)), Attr('type_protos', TYPE_PROTOS, (Tensor(FLOAT), Tensor(FLOAT)))]
重要提示
空序列应通过使用属性类型初始化 Attr 对象来创建显式类型,以避免类型模糊性。例如
ir.Attr("empty", [], type=ir.AttributeType.INTS)
- 参数:
attrs (Mapping[str, str | int | float | Sequence[int] | Sequence[float] | Sequence[str] | TensorProtocol | TensorProto | Attr | GraphProtocol | Sequence[GraphProtocol] | GraphProto | TypeProtocol | Sequence[TypeProtocol] | None]) – 要转换的 {<属性名称>:
} 字典。 - 返回:
一个
_core.Attr对象列表。- 引发:
TypeError – 如果不支持属性类型。
- 返回类型:
- onnx_ir.convenience.create_value_mapping(graph)¶
返回将图中的名称映射到值的字典。
映射包括来自子图的值。重复的名称被省略,并返回具有该名称的第一个值。空名称的值被排除在映射之外。
0.1.2 版本中已更改: 子图中的值现在包含在映射中。
- onnx_ir.convenience.get_const_tensor(value, propagate_shape_type=False)¶
如果存在,从值中获取常量张量。
如果值设置了
const_value(如初始化器的情况),或者值由 Constant 节点生成,则可以获取常量张量。此函数不会更改值的
const_value,但如果 propagate_shape_type 设置为 True,它会将常量张量的形状和类型传播到值。0.1.2 版本新增。
- 参数:
- 返回:
如果存在常量张量,则返回常量张量,否则返回 None。
- 引发:
ValueError – 如果 Constant 节点没有恰好一个输出或一个属性。
- 返回类型:
TensorProtocol | None
- onnx_ir.convenience.replace_all_uses_with(values, replacements, replace_graph_outputs=False)¶
将给定值的所有用途替换为替代值。
当图中的节点被新节点替换时,这很有用,旧的用户需要更新以使用新节点的输出。
例如,假设我们有以下图
A -> {B, C}
我们想用新节点 D 替换节点 A
>>> import onnx_ir as ir >>> input = ir.val("input") >>> node_a = ir.Node("", "A", [input]) >>> node_b = ir.Node("", "B", node_a.outputs) >>> node_c = ir.Node("", "C", node_a.outputs) >>> node_d = ir.Node("", "D", [input]) >>> replace_all_uses_with(node_a.outputs, node_d.outputs) >>> len(node_b.inputs) 1 >>> node_b.inputs[0].producer().op_type 'D' >>> len(node_c.inputs) 1 >>> node_c.inputs[0].producer().op_type 'D' >>> len(node_a.outputs[0].uses()) 0
当值和替换是序列时,它们被压缩成对。第一个值的所有用户都被第一个替换值替换,依此类推。
注意
如果不再需要旧节点,请务必使用
graph.remove()从图中删除它们,或者使用onnx_ir.passes.common.RemoveUnusedNodesPass删除图中所有未使用的节点。提示
处理图输出
要替换引用正在替换的值的图输出,请将
replace_graph_outputs设置为 True,或者在调用此函数之前手动更新图输出,以避免在replace_graph_outputs=False时引发错误。当一个值在图输出中多次出现时要小心——这是无效的。需要在每个重复输出上添加一个恒等节点,以确保有效的 ONNX 图。
您可能还需要将此值的名称分配给替换值,以在它作为图输出时保持名称。
0.1.12 版本中新增: 添加了
replace_graph_outputs参数。0.1.12 版本中新增: 当
replace_graph_outputs为 False 且要替换的值是图输出时,会引发 ValueError。- 参数:
- 引发:
ValueError – 当
replace_graph_outputs为 False 且要替换的值是图输出时。- 返回类型:
无
- onnx_ir.convenience.replace_nodes_and_values(graph_or_function, /, insertion_point, old_nodes, new_nodes, old_values, new_values)¶
替换图或函数中的节点和值。