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中的以下运算符支持单方向广播