If¶
バージョン名: If-8
カテゴリー: 条件
簡単な説明: If 操作には then_body
と else_body
などの 2 つの内部ネットワーク (サブグラフ) が含まれており、cond
値に応じていずれかを実行します。cond
が True
の場合、then_body
が実行されます。cond
が False
の場合、操作は 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
エントリーはinput
とoutput
が可能です。各エントリーは、対応するマッピングルールを説明します。If には 2 つの port_maps があります:then_body
用のthen_port_map
とelse_body
用のelse_port_map
。-
ポートマップ属性:
- external_port_id
説明: external_port_id は If 操作のポート ID です。
値の範囲: If inputs と outputs の ID
タイプ:
unsigned int
デフォルト値: なし
必須: はい
- internal_layer_id
説明: internal_layer_id は、マップ先のサブグラフ内部の
Parameter
またはResult
操作 ID です。- 値の範囲: サブグラフ内の
Parameter
またはResult
操作の ID - タイプ:
unsigned int
- デフォルト値: なし
- 必須: 這い
- external_port_id
-
入力:
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>