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 的维度过少,并且可以通过在其形状前添加一个长度为 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 中支持单向广播: