ScatterUpdate¶
バージョン名: ScatterUpdate-3
カテゴリー: データ移動
簡単な説明: ScatterUpdate は、2 番目と 3 番目の入力テンソルで指定された更新された要素を含む最初の入力テンソルのコピーを作成します。
詳細な説明: ScatterUpdate は、indices
入力で指定された位置に更新された要素を含む最初の入力テンソルのコピーを作成し、インデックス axis
を持つ次元から始まる更新テンソルで指定された値を作成します。形状 \([d_0,\;d_1,\;\dots,\;d_n]\) の data
テンソルの場合、形状 \([i_0,\;i_1,\;\dots,\;i_k]\) の indices
テンソルと、形状 \([d_0,\;d_1,\;\dots,\;d_{axis - 1},\;i_0,\;i_1,\;\dots,\;i_k,\;d_{axis + 1},\;\dots, d_n]\) のテンソルの操作では、indices
テンソル・インデックスの各 m, n, ..., p
が計算されます。
ここで、data
の最初の \(\dots\) は \([d_0,\;\dots,\;d_{axis - 1}]\) 次元に対応し、data
の最後の \(\dots\) は rank(data) - (axis + 1)
次元に対応します。
axis = 0 の場合のいくつかの例:
indices
は \(0\) D テンソル: \(data[indices,\;\dots] = updates[\dots]\)indices
は \(1\) D テンソル (\(\forall_{i}\)): \(data[indices[i],\;\dots] = updates[i,\;\dots]\)indices
は \(N\) D テンソル (\(\forall_{i,\;\dots,\;j}\)): \(data[indices[i],\;\dots,\;j],\;\dots] = updates[i,\;\dots,\;j,\;\dots]\)
属性: ScatterUpdate には属性がありません。
入力:
1: 任意のランク
r
および T_NUMERIC タイプのdata
テンソル。必須。-
2: T_IND タイプのインデックスを持つ
indices
テンソル。すべてのインデックス値は、サイズs
の軸に沿った範囲[0, s - 1]
内にあることが期待されます。複数のインデックスが同じ出力場所を指している場合、値を更新する順序は未定義です。インデックスが存在しない出力テンソル要素を指している、または負の場合、例外が発生します。必須。 3: T_NUMERIC タイプのテンソルと、
rank(indices) + rank(data) - 1
に等しいランクを更新します。必須。-
4: スカラーを使用した
axis
テンソル、または散乱の軸を指定するタイプ T_AXIS の 1 つの要素を使用した 1D テンソル。値の範囲は[ -r, r - 1]
で、r
はdata
のランクです。必須。
出力:
1: T_NUMERIC タイプの
data
テンソルと等しい形状を持つテンソル。
タイプ:
T_NUMERIC: 任意の数値タイプ。
T_IND: サポートされている整数タイプ。
T_AXIS: サポートされている整数タイプ。
例:
例 1
<layer ... type="ScatterUpdate">
<input>
<port id="0"> <!-- data -->
<dim>1000</dim>
<dim>256</dim>
<dim>10</dim>
<dim>15</dim>
</port>
<port id="1"> <!-- indices -->
<dim>125</dim>
<dim>20</dim>
</port>
<port id="2"> <!-- updates -->
<dim>1000</dim>
<dim>125</dim>
<dim>20</dim>
<dim>10</dim>
<dim>15</dim>
</port>
<port id="3"> <!-- axis -->
<dim>1</dim> <!-- value [1] -->
</port>
</input>
<output>
<port id="4" precision="FP32"> <!-- output -->
<dim>1000</dim>
<dim>256</dim>
<dim>10</dim>
<dim>15</dim>
</port>
</output>
</layer>
例 2
<layer ... type="ScatterUpdate">
<input>
<port id="0"> <!-- data -->
<dim>3</dim> <!-- {{-1.0f, 1.0f, -1.0f, 3.0f, 4.0f}, -->
<dim>5</dim> <!-- {-1.0f, 6.0f, -1.0f, 8.0f, 9.0f}, -->
</port> <!-- {-1.0f, 11.0f, 1.0f, 13.0f, 14.0f}} -->
<port id="1"> <!-- indices -->
<dim>2</dim> <!-- {0, 2} -->
</port>
<port id="2"> <!-- updates -->
<dim>3</dim> <!-- {1.0f, 1.0f} -->
<dim>2</dim> <!-- {1.0f, 1.0f} -->
</port> <!-- {1.0f, 2.0f} -->
<port id="3"> <!-- axis -->
<dim>1</dim> <!-- {1} -->
</port>
</input>
<output>
<port id="4"> <!-- output -->
<dim>3</dim> <!-- {{1.0f, 1.0f, 1.0f, 3.0f, 4.0f}, -->
<dim>5</dim> <!-- {1.0f, 6.0f, 1.0f, 8.0f, 9.0f}, -->
</port> <!-- {1.0f, 11.0f, 2.0f, 13.0f, 14.0f}} -->
</output>
</layer>