Broadcast¶
バージョン名: Broadcast-1
カテゴリー: データ移動
簡単な説明: Broadcast は、最初の入力のデータを複製して、2 番目の入力の特定の形状に適合させます。
詳細な説明:
Broadcast は最初のテンソル data
を取得し、mode
属性と 3 番目の入力 axes_mapping
で指定されたブロードキャスト・ルールに従って、2 番目の入力テンソル target_shape
に一致する形状を持つ新しいテンソルを構築します。target_shape
入力は、出力の必要な形状を表す 1D 整数テンソルです。
mode
属性と 3 番目の入力 axes_mapping
は、入力 data
テンソルのランクが target_shape
入力のサイズと一致しない場合に関連します。どちらも、data
形状の軸を出力軸にマッピングする方法を定義します。mode
が numpy
に設定されている場合、標準の一方向 numpy ブロードキャスト・ルールが適用されることを意味します。これらのルールは、一方向ブロードキャストのみが適用される場合、要素ごとの操作のブロードキャスト・ルールで説明されています: 入力テンソル data
は target_shape
にブロードキャストされますが、その逆は行われません。
mode
が explicit
に設定されている場合、3 番目の入力 axes_mapping
が機能します。これには軸インデックスのリストが含まれており、各インデックスは最初の入力テンソル data
の軸を出力の軸にマップします。axis_mapping
のサイズは入力 data
テンソルのランクと一致する必要があるため、data
テンソルのすべての軸が出力の軸にマッピングされる必要があります。
例えば、axes_mapping = [1]
では、次元 0、2、および 3 に沿った初期テンソルの複製によって、形状 [C]
のテンソルを形状 [N,C,H,W]
にブロードキャストできます。別の例は、axes_mapping = [1, 2]
で形状 [H,W]
のテンソルを形状 [N,H,W,C]
にブロードキャストすることです。どちらの例でも、mode
を explicit
に設定し、前述の axes_mapping
入力を提供する必要があります。これは、このような操作は、axes_mapping
を numpy
に設定して表現できないためです。
属性:
-
mode
説明:
input
テンソル軸を出力形状軸にマッピングするルールを指定します。-
値の範囲:
numpy - ONNX ブロードキャストに準拠した numpy ブロードキャスト・ルール。説明は ONNX ドキュメントで参照できます。
data
からtarget_shape
までは一方向のブロードキャストのみが適用されます。この属性値を使用する場合、操作の 3 番目の入力を指定しないでください。explicit - 入力
data
形状軸の出力形状へのマッピングは、明示的な 3 番目の入力として提供されます。
タイプ: 文字列
デフォルト値: “numpy”
必須: いいえ
入力:
1:
data
- ブロードキャストされるあらゆるタイプおよび形状のソーステンソル。必須。2:
taget_shape
- 出力形状を記述する 1D 整数テンソル。必須。3:
axes_mapping
- 軸インデックスのリストを記述する 1D 整数テンソル。各インデックスは、最初の入力テンソルdata
の軸を出力の軸にマッピングします。このテンソルのインデックス値はソートされる必要があります。これにより、ブロードキャスト中の入力data
テンソルのオンザフライ転置が無効になります。入力axes_mapping
はmode
値に応じてオプションです。
出力:
1: 最初のテンソル
data
から複製されたコンテンツとtarget_shape
に一致する形状を持つ出力テンソル。
例:
<layer ... type="Broadcast" ...>
<data mode="numpy"/>
<input>
<port id="0">
<dim>16</dim>
<dim>1</dim>
<dim>1</dim>
</port>
<port id="1">
<dim>4</dim> <!--The tensor contains 4 elements: [1, 16, 50, 50] -->
</port>
<!-- the 3rd input shouldn't be provided with mode="numpy" -->
</input>
<output>
<port id="2">
<dim>1</dim>
<dim>16</dim>
<dim>50</dim>
<dim>50</dim>
</port>
</output>
</layer>
<layer ... type="Broadcast" ...>
<data mode="explicit"/>
<input>
<port id="0">
<dim>16</dim>
</port>
<port id="1">
<dim>4</dim> <!--The tensor contains 4 elements: [1, 16, 50, 50] -->
</port>
<port id="1">
<dim>1</dim> <!--The tensor contains 1 elements: [1] -->
</port>
</input>
<output>
<port id="2">
<dim>1</dim>
<dim>16</dim>
<dim>50</dim>
<dim>50</dim>
</port>
</output>
</layer>
<layer ... type="Broadcast" ...>
<data mode="explicit"/>
<input>
<port id="0">
<dim>50</dim>
<dim>50</dim>
</port>
<port id="1">
<dim>4</dim> <!--The tensor contains 4 elements: [1, 50, 50, 16] -->
</port>
<port id="1">
<dim>2</dim> <!--The tensor contains 2 elements: [1, 2] -->
</port>
</input>
<output>
<port id="2">
<dim>1</dim>
<dim>50</dim>
<dim>50</dim>
<dim>16</dim>
</port>
</output>
</layer>