Loop¶
バージョン名: Loop-5
カテゴリー: インフラストラクチャー
簡単な説明: Loop 操作は、body
で記述されているネットワークの反復実行し、データを反復処理します。この操作には、ONNX ループ操作と同様のセマンティクスがあります。
詳細な説明:
ループのボディーは、“トリップカウント”、“実行条件” と呼ばれるループ操作入力、および “現在の反復” と呼ばれるループボディーの入力に渡される値に応じて、0 回以上実行できます。
これらのループ操作入力には次の意味があります。
トリップカウントは、最大反復数を指定する 1 要素入力を持つ整数スカラーまたは 1D テンソルです。無限ループをシミュレートするには、定数
-1
を入力とします。ループ実行条件の入力は、最初のループ反復を実行するかどうかを指定する 1 要素入力を持つブールスカラーまたは 1D テンソルです。ループのボディーは、連続する反復の条件値を設定する必要があることに注意してください。
これら 2 つの入力 (trip_count, execution condition)
にはいくつかの組み合わせがありますが、次のコードで説明します。
input (-1, true) // infinite loop
bool cond = true;
for (int i = 0; cond; ++i)
{
cond = true; // sub-graph calculating condition must always return "true"!
}
input (-1, cond) // while loop
bool cond = ...;
for (int i = 0; cond; ++i)
{
cond = ...;
}
input (-1, true) // do-while loop
bool cond = true;
for (int i = 0; cond; ++i)
{
cond = ...;
}
input (trip_count, true) // for loop
int trip_count = ...;
bool cond = true;
for (int i = 0; i < trip_count; ++i)
{
cond = true; // sub-graph calculating condition must always return "true"!
}
input (trip_count, cond) // for with condition
int trip_count = ...;
bool cond = ...;
for (int i = 0; i < trip_count && cond; ++i)
{
cond = ...;
}
“現在の反復” と呼ばれるボディーグラフ入力の 1 つは、現在の反復数を指定する数値を持つ整数スカラーまたは 1D 整数テンソルです。反復数は 0 から始まり、反復ごとに 1 ずつ増加します。この入力はオプションであり、反復数の値がボディーで使用されていないと存在しない可能性があります。
ボディーグラフ出力の 1 つは “条件” と呼ばれ、ブールスカラーまたは 1 つの要素の 1D テンソルです。この値は、次の反復を実行するか決定するために使用されます。
IR のループ操作の記述には、input
と output
という通常のセクションがあります。ループボディーを外側のグラフに接続し、条件を指定します。IR のループ操作の記述には、いくつかの特別なセクションもあります: body
、port_map
および back_edges
は、TensorIterator 操作と似ていますが、以下で説明する重要な機能があります。
メイングラフから入力を取得するボディーの操作には、ループ操作の
port_map
セクションにエントリーが必要です。これらのエッジは、ループの入力ポートをボディーの ``Parameter`` に接続します。ループの入力テンソルは指定された軸に沿ってスライスでき、ループはスライスされたすべての部分を反復できます。
port_map
内の対応するinput
エントリーには、スライスする軸を指定するaxis
属性が必要です。したがって、axis
属性のないport_map
のinput
エントリーに対応するループ操作への入力は、“そのまま” (スライスなしで) 使用されます。後続の反復で使用されるテンソルを生成するボディー操作 (RNN モデルなど) には、操作の
back_edges
セクションで記述されるバックエッジが必要です。バックエッジは、それぞれのボディーのParameter
とResult
操作を接続します。この場合、ループ操作ノードは最初の反復に入力を提供し、対応するループ操作の出力は最後の反復中に計算されたテンソルを生成します。すべての反復にわたる特定のボディー操作で生成された出力テンソルは、連結してループ操作出力として返すことができます (これは ONNX* ループ操作仕様 による “スキャン出力” です)。
port_map
内の対応するoutput
エントリーには、連結する軸を指定するaxis
属性が必要です。したがって、axis
属性のないport_map
のoutput
エントリーに対応する操作からの出力は、“そのまま” (連結せずに) 返されます。port_map
を介して接続されていないボディーの 1 つのParameter
操作があります。これは “現在の反復” 入力です。ループ操作は、各反復に適切な値を提供する責任があります。ループボディー内のノードとメイングラフとの接続は、
Parameter
とResult
ボディーの操作で行う必要があります。グラフを接続する他の方法は許可されません。
ループ属性:
-
ボディー:
body
は反復的に実行されるネットワークです。このネットワークは、典型的な IR ネットワークとして動作ごとに記述されます。-
Body 属性:
利用可能な属性はありません。
-
-
ポートマップ:
port_map は、
Loop
操作の入力または出力データテンソルをbody
データテンソルにマッピングするルールのセットです。port_map
エントリーは `` input`` とoutput
に使用できます。各エントリーは、対応するマッピングルールを説明します。-
ポートマップ属性:
- external_port_id
説明: external_port_id は、
Loop
操作のポート ID です。値-1
は、ボディーノードが-1
操作に接続されていないことを意味します。値の範囲: ループ出力の ID
タイプ:
int
デフォルト値: なし
必須: はい
- internal_layer_id
説明: internal_layer_id は、マッピング先の
body
ネットワーク内のParameter
またはResult
オペレーション ID です。値の範囲: ループ操作内の
Parameter
操作の IDタイプ:
int
デフォルト値: なし
必須: はい
- axis
説明:
output
エントリーに axis が指定されている場合、それはすべての反復にわたってボディーのResult
出力を連結する軸になります。
input
エントリーに axis が指定されている場合、それは反復処理の対象となる軸であり、入力テンソルのスライスをトリガーします。値の範囲: 整数。負の値は、次元を端から数えることを意味します。
タイプ:
int
デフォルト値: なし
必須: いいえ
- external_port_id
-
-
バックエッジ:
back_edges は、ある反復での
body
出力から次の反復へのbody
パラメーターにテンソル値を転送するルールのセットです。バックエッジは、body
内の一部のResult
操作を同じbody
内のParameter
操作に接続します。-
バックエッジ属性:
- from-layer
説明: from-layer は、
body
ネットワーク内のResult
操作 ID です。値の範囲: ループ内の
Result
操作の IDタイプ:
int
デフォルト値: なし
必須: はい
- to-layer
説明: to-layer は、マッピングを終了する
body
ネットワーク内のParameter
操作 ID です。値の範囲: ループ内の
Parameter
操作の IDタイプ:
int
デフォルト値: なし
必須: はい
- from-layer
-
ループの入力:
トリップカウント: 最大反復回数を指定する
int64
またはint32
タイプの要素を持つスカラーまたは 1D テンソル。必須。ExecutionCondition: 最初の反復を実行するか指定する
boolean
タイプの要素を持つスカラーまたは 1D テンソル。True
値は、最初の反復を実行することを意味します。必須。他の複数の入力: さまざまなタイプと形状のテンソル。オプション。
ループの出力:
複数の出力:
body
の実行結果。あらゆるタイプと形状のテンソル。
ボディーの入力:
複数の入力: 現在の反復数に対応するものを除く、さまざまなタイプと形状のテンソル。この入力は、port_map 内で属性
purpose = "current_iteration"
でマークされ、int64
またはint32
タイプの要素を持つスカラーまたは 1D テンソルを生成します。オプション。
ボディーの出力:
複数の出力:
body
の実行結果。実行条件付きの出力に対応するものを除く、任意のタイプおよび形状のテンソル。この出力は、port_map 内で属性purpose = "execution_condition"
でマークされており、必須であり、boolean
タイプの要素を持つスカラーまたは 1D テンソルを生成します。他の出力はオプションです。
例:
例 1: 典型的な Loop 構造
<layer type="Loop" ... >
<input> ... </input>
<output> ... </output>
<port_map>
<input external_port_id="0" internal_layer_id="0"/>
<input external_port_id="1" internal_layer_id="1"/>
<input external_port_id="-1" internal_layer_id="2" purpose="current_iteration"/>
...
<output external_port_id="3" internal_layer_id="4"/>
<output external_port_id="4" internal_layer_id="10" axis="1"/>
<output external_port_id="-1" internal_layer_id="22" purpose="execution_condition"/>
...
</port_map>
<back_edges>
<edge from-layer="1" to-layer="5"/>
...
</back_edges>
<body>
<layers> ... </layers>
<edges> ... </edges>
</body>
</layer>