ONNX 中的广播¶
在 ONNX 中,逐元素运算符可以接受不同形状的输入,只要输入张量可以广播到相同的形状。ONNX 支持两种类型的广播:多向广播和单向广播。我们将在以下部分分别介绍这两种类型的广播。
多向广播¶
在 ONNX 中,如果满足以下条件之一,则一组张量可以多向广播到相同的形状
所有张量都具有完全相同的形状。
所有张量都具有相同的维度数,并且每个维度的长度要么是共同长度,要么是 1。
维度太少的张量可以通过在其形状前添加长度为 1 的维度来满足属性 2。
例如,以下张量形状受多向广播支持
shape(A) = (2, 3, 4, 5), shape(B) = (,), 即 B 是标量 ==> shape(result) = (2, 3, 4, 5)
shape(A) = (2, 3, 4, 5), shape(B) = (5,), ==> shape(result) = (2, 3, 4, 5)
shape(A) = (4, 5), shape(B) = (2, 3, 4, 5), ==> shape(result) = (2, 3, 4, 5)
shape(A) = (1, 4, 5), shape(B) = (2, 3, 1, 1), ==> shape(result) = (2, 3, 4, 5)
shape(A) = (3, 4, 5), shape(B) = (2, 1, 1, 1), ==> shape(result) = (2, 3, 4, 5)
多向广播与 Numpy 的广播相同。
ONNX 中的以下运算符支持多向广播
单向广播¶
在 ONNX 中,如果满足以下条件之一,则张量 B 可以单向广播到张量 A
张量 A 和 B 都具有完全相同的形状。
张量 A 和 B 都具有相同的维度数,并且每个维度的长度要么是共同长度,要么 B 的长度是 1。
张量 B 的维度太少,并且 B 可以通过在其形状前添加长度为 1 的维度来满足属性 2。
当发生单向广播时,输出的形状与 A 的形状相同(即,两个输入张量中较大的形状)。
在以下示例中,张量 B 可以单向广播到张量 A
shape(A) = (2, 3, 4, 5), shape(B) = (,), 即 B 是标量 ==> shape(result) = (2, 3, 4, 5)
shape(A) = (2, 3, 4, 5), shape(B) = (5,), ==> shape(result) = (2, 3, 4, 5)
shape(A) = (2, 3, 4, 5), shape(B) = (2, 1, 1, 5), ==> shape(result) = (2, 3, 4, 5)
shape(A) = (2, 3, 4, 5), shape(B) = (1, 3, 1, 5), ==> shape(result) = (2, 3, 4, 5)
ONNX 中的以下运算符支持单向广播