🥹ONNX中的广播机制

Broadcasting in ONNX

在 ONNX 中,只要输入的张量可以广播到相同的形状,那么按元素排列的算子就可以接受不同形状的输入。ONNX 支持两种广播方式:多向广播和单向广播。我们将在下文中分别介绍这两种广播类型。

多向广播

在 ONNX 中,如果以下条件之一为真,则一组张量可以多向广播到相同的形状:

  • 所有张量的形状完全相同。

  • 所有张量都有相同的维数。

  • 维数少的张量可以在其形状前添加长度为 1 的维数,以满足性质 2 的要求。

例如,多向广播支持以下张量形状:

  • shape(A) = (2, 3, 4, 5), shape(B) = (,), i.e. B is a scalar ==> 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)

Multidirectional broadcasting is the same as Numpy’s broadcasting.

ONNX 的下列算子支持多向广播:

单向广播

在 ONNX 中,如果以下条件之一为真,则张量 B 可单向广播到张量 A:

  • 张量 A 和张量 B 的形状完全相同。

  • 张量 A 和张量 B 的维数相同。

  • 张量 B 的维数少,可以在 B 的形状前添加长度为 1 的维数,以满足性质 2。

当发生单向广播时,输出的形状与 A 的形状相同(即两个输入张量中较大的那个shape)。

在以下示例中,张量 B 可单向广播到张量 A:

  • shape(A) = (2, 3, 4, 5), shape(B) = (,), i.e. B is a scalar ==> 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 的下列算子支持单向广播:

Last updated