If

バージョン名: If-8

カテゴリー: 条件

簡単な説明: If 操作には then_bodyelse_body などの 2 つの内部ネットワーク (サブグラフ) が含まれており、cond 値に応じていずれかを実行します。condTrue の場合、then_body が実行されます。condFalse の場合、操作は else_body サブグラフを実行します。

詳細説明:

If には空のサブグラフを含めてはなりません。それぞれの操作には少なくとも 1 つの操作 Result が必要です。また、If からの出力の数は常に 0 より大きく、各サブグラフからの出力の数と等しくなければなりません。

If 属性:

  • サブグラフ:

    then_body/else_body は、cond 値に応じて実行されるサブグラフです。サブグラフは、典型的な IR ネットワークとして操作ごとに説明されます。サブグラフには入力 (Parameter 操作) と出力 (Result 操作) があります。

    • サブグラフの入力 - port_map を介して If 入力に関連付けられたサブグラフへの入力。

      サブグラフには任意の数の入力 (ゼロでも) を含めることができます。

    • サブグラフの出力 - port_map を介して If 出力に関連付けられたサブグラフからの出力。

      サブグラフには少なくとも 1 つの出力が含まれている必要があります。各 If 出力は、サブグラフからの 1 つの出力に関連付けられます。したがって、then_body 出力の数は、If からの出力の数と else_body 出力の数に等しくなります。サブグラフ出力のタイプと、If からの関連出力のタイプは等しくなければなりません。

  • ポートマップ:

    port_map は、If 操作の入力または出力データテンソルをサブグラフ・データ・テンソルにマッピングするルールのセットです。port_map エントリーは inputoutput が可能です。各エントリーは、対応するマッピングルールを説明します。If には 2 つの port_maps があります: then_body 用の then_port_mapelse_body 用の else_port_map

    • ポートマップ属性:

      • external_port_id
        • 説明: external_port_idIf 操作のポート ID です。

        • 値の範囲: If inputs と outputs の ID

        • タイプ: unsigned int

        • デフォルト値: なし

        • 必須: はい

      • internal_layer_id
        • 説明: internal_layer_id は、マップ先のサブグラフ内部の Parameter または Result 操作 ID です。

        • 値の範囲: サブグラフ内の Parameter または Result 操作の ID
        • タイプ: unsigned int
        • デフォルト値: なし
        • 必須: 這い

入力:

  • cond: 実行するサブグラフを指定する boolean タイプの 1 つの要素を持つスカラーまたは 1D テンソル。True value は then_body を実行することを意味し、False - else_body を意味します。必須

  • 他の複数の入力: さまざまなタイプと形状のテンソル。オプションです。

出力:

  • 複数の出力: いずれかのサブグラフの実行結果。あらゆるタイプと形状のテンソル。

ボディーの入力:

  • 複数の入力: さまざまなタイプと形状のテンソル。オプションです。

ボディーの出力:

  • 複数の出力: サブグラフの実行結果。あらゆるタイプと形状のテンソル。

例:

例 1: 典型的な If 構造

<layer id="6" name="if/cond" type="If" version="opset8">
    <input>
        <port id="0"/>
        <port id="1">
            <dim>2</dim>
            <dim>4</dim>
        </port>
        <port id="2">
            <dim>2</dim>
            <dim>4</dim>
        </port>
        <port id="3">
            <dim>2</dim>
            <dim>4</dim>
        </port>
    </input>
    <output>
        <port id="4" names="if/cond/Identity:0,if/cond:0" precision="FP32">
            <dim>2</dim>
            <dim>4</dim>
        </port>
    </output>
    <then_port_map>
        <input external_port_id="1" internal_layer_id="0"/>
        <input external_port_id="2" internal_layer_id="1"/>
        <output external_port_id="0" internal_layer_id="3"/>
    </then_port_map>
    <else_port_map>
        <input external_port_id="1" internal_layer_id="0"/>
        <input external_port_id="3" internal_layer_id="1"/>
        <output external_port_id="0" internal_layer_id="3"/>
    </else_port_map>
    <then_body>
        <layers>
            <layer id="0" name="add_x" type="Parameter" version="opset1">
                <data element_type="f32" shape="2,4"/>
                <output>
                    <port id="0" names="add_x:0" precision="FP32">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </output>
            </layer>
            <layer id="1" name="add_z" type="Parameter" version="opset1">
                <data element_type="f32" shape="2,4"/>
                <output>
                    <port id="0" names="add_z:0" precision="FP32">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </output>
            </layer>
            <layer id="2" name="Add" type="Add" version="opset1">
                <data auto_broadcast="numpy"/>
                <input>
                    <port id="0">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                    <port id="1">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </input>
                <output>
                    <port id="2" names="Add:0" precision="FP32">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </output>
            </layer>
            <layer id="3" name="Identity/sink_port_0" type="Result" version="opset1">
                <input>
                    <port id="0">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </input>
            </layer>
        </layers>
        <edges>
            <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
            <edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
            <edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
        </edges>
    </then_body>
    <else_body>
        <layers>
            <layer id="0" name="add_x" type="Parameter" version="opset1">
                <data element_type="f32" shape="2,4"/>
                <output>
                    <port id="0" names="add_x:0" precision="FP32">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </output>
            </layer>
            <layer id="1" name="add_w" type="Parameter" version="opset1">
                <data element_type="f32" shape="2,4"/>
                <output>
                    <port id="0" names="add_w:0" precision="FP32">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </output>
            </layer>
            <layer id="2" name="Add" type="Add" version="opset1">
                <data auto_broadcast="numpy"/>
                <input>
                    <port id="0">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                    <port id="1">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </input>
                <output>
                    <port id="2" names="Add:0" precision="FP32">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </output>
            </layer>
            <layer id="3" name="Identity/sink_port_0" type="Result" version="opset1">
                <input>
                    <port id="0">
                        <dim>2</dim>
                        <dim>4</dim>
                    </port>
                </input>
            </layer>
        </layers>
        <edges>
            <edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
            <edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
            <edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
        </edges>
    </else_body>
</layer>