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