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 の入力と出力 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> Z
</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>