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 中的以下運算子支援單向廣播