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 形状の軸を出力軸にマッピングする方法を定義します。modenumpy に設定されている場合、標準の一方向 numpy ブロードキャスト・ルールが適用されることを意味します。これらのルールは、一方向ブロードキャストのみが適用される場合、要素ごとの操作のブロードキャスト・ルールで説明されています: 入力テンソル datatarget_shape にブロードキャストされますが、その逆は行われません。

modeexplicit に設定されている場合、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] にブロードキャストすることです。どちらの例でも、modeexplicit に設定し、前述の axes_mapping 入力を提供する必要があります。これは、このような操作は、axes_mappingnumpy に設定して表現できないためです。

属性:

  • 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_mappingmode 値に応じてオプションです。

出力:

  • 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>