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