ONNX中的广播

在ONNX中,元素级运算符可以接受不同形状的输入,只要输入张量可以广播到相同的形状。 ONNX支持两种类型的广播:多向广播和单向广播。我们将在以下部分分别介绍这两种类型的广播。

多向广播

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

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

  • 所有张量都具有相同的维度数,并且每个维度的长度要么是公共长度,要么是1。

  • 维度太少的张量可以在其形状前添加一个长度为1的维度,以满足属性2。

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

  • 形状(A) = (2, 3, 4, 5), 形状(B) = (,), 即 B 是一个标量 ==> 形状(结果) = (2, 3, 4, 5)

  • 形状(A) = (2, 3, 4, 5), 形状(B) = (5,), ==> 形状(结果) = (2, 3, 4, 5)

  • 形状(A) = (4, 5), 形状(B) = (2, 3, 4, 5), ==> 形状(结果) = (2, 3, 4, 5)

  • 形状(A) = (1, 4, 5), 形状(B) = (2, 3, 1, 1), ==> 形状(结果) = (2, 3, 4, 5)

  • 形状(A) = (3, 4, 5), 形状(B) = (2, 1, 1, 1), ==> 形状(结果) = (2, 3, 4, 5)

多向广播与Numpy的广播相同。

ONNX 中的以下运算符支持多向广播:

单向广播

在ONNX中,如果满足以下任一条件,张量B可以单向广播到张量A:

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

  • 张量A和B都具有相同数量的维度,并且每个维度的长度要么是相同的长度,要么B的长度为1。

  • 张量 B 的维度太少,B 可以在其形状前添加一个长度为 1 的维度以满足属性 2。

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

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

  • 形状(A) = (2, 3, 4, 5), 形状(B) = (,), 即 B 是一个标量 ==> 形状(结果) = (2, 3, 4, 5)

  • 形状(A) = (2, 3, 4, 5), 形状(B) = (5,), ==> 形状(结果) = (2, 3, 4, 5)

  • 形状(A) = (2, 3, 4, 5), 形状(B) = (2, 1, 1, 5), ==> 形状(结果) = (2, 3, 4, 5)

  • 形状(A) = (2, 3, 4, 5), 形状(B) = (1, 3, 1, 5), ==> 形状(结果) = (2, 3, 4, 5)

ONNX 中的以下操作符支持单向广播: