ScatterElementsUpdate¶
バージョン名: ScatterElementsUpdate-12
カテゴリー: データ移動
簡単な説明: axis
に沿った reduction 属性と indices
によって指定されたロジックに従って適用された更新入力からの要素を含む、最初の入力テンソルのコピーを作成します。
詳細な説明: 最初の入力テンソルのコピーを作成し、reduction 属性で指定されたロジックに従って更新の要素を適用します。更新の各要素について、同じインデックスに対応する indices
の値があり、これは axis
で指定された次元に沿ったインデックスです。axis
が指す次元のインデックスは、入力された indices
の値によって提供されます。それ以外の場合、インデックスはエントリー自体のインデックスと同じになります。
更新テンソルの次元は、data
テンソルの対応する次元以下であることが許可されますが、axis
によって指される次元は大きくすることもできます (特に indices
入力に重複した値が含まれている場合)。
対応する要素間で実行する操作は、reduction 属性によって指定されます。デフォルトでは、data
テンソルの要素は、更新入力からの値によって単純に上書きされます。
さらに、use_init_val 属性を使用して、data
入力テンソルの要素を初期値として使用するかどうかを制御できます (デフォルトで有効)。
1D テンソルの出力値計算の一般的なロジックを以下に示します。[i]
に対応する要素は次のように実行されます。
output[indices[i]] = reduction(updates[i], output[indices[i]]), axis = 0
追加操作なしで上書き、reduction = “none”
output[indices[i]] = updates[i], axis = 0
対応する要素を追加して更新、reduction = “sum”
output[indices[i]] += updates[i], axis = 0
対応する要素の乗算によって更新、reduction = “prod”
output[indices[i]] *= updates[i], axis = 0
対応する要素の最小値で更新、reduction = “min”
output[indices[i]] = min(updates[i], output[indices[i]]) axis = 0
対応する要素の最大値で更新、reduction = “max”
output[indices[i]] = max(updates[i], output[indices[i]]) axis = 0
対応する要素の平均値で更新、reduction = “mean”。整数タイプの場合、計算された平均は (負の無限大に向かって) 切り捨てられます。このリダクション・タイプは、ブール・データ・タイプではサポートされていません。
output[indices[i]] = mean(updates[i], output[indices[i]]) axis = 0
2D テンソルの場合、[i][j]
に対応する要素の更新は次のように実行されます。
output[indices[i][j]][j] = reduction(updates[i][j], output[indices[i][j]][j]) if axis = 0
output[i][indices[i][j]] = reduction(updates[i][j], output[indices[i][j]][j]) if axis = 1
したがって、3D テンソルの場合、[i][j][k]
に対応する要素の更新は次のように実行されます。
output[indices[i][j][k]][j][k] = reduction(updates[i][j][k], output[indices[i][j][k]][j][k]) if axis = 0
output[i][indices[i][j][k]][k] = reduction(updates[i][j][k], output[i][indices[i][j][k]][k]) if axis = 1
output[i][j][indices[i][j][k]] = reduction(updates[i][j][k], output[i][j][indices[i][j][k]]) if axis = 2
属性:
-
reduction
説明: 入力に対して実行する操作のタイプ。
値の範囲: 次のいずれか:
none
、sum
、prod
、min
、max
、mean
タイプ: string
デフォルト値:
none
必須: いいえ
-
use_init_val
説明: データ入力テンソルの要素を reduce 操作の初期値として使用するかどうかを制御します。
-
値の範囲:
- true - データ入力要素が使用されます
- false - データ入力要素は使用されません
タイプ: ブール値
デフォルト値: true
必須: いいえ
注: この属性は reduction == “none” には影響しません
入力:
1: 任意のランク
r
およびタイプ T のdata
テンソル。必須。2: T_IND タイプのインデックスを持つ
indices
テンソル。テンソルのランクはdata
テンソルのランクと同じです。すべてのインデックス値は、axis
が指す次元d
に沿った範囲[-d, d - 1]
内にあることが期待されます。複数のインデックスが同じ出力場所を指している場合、値を更新する順序は未定義です。インデックスの負の値は逆インデックスを意味し、値len(data.shape[axis] + index)
に正規化されます。インデックスが存在しない要素を指している場合、例外が発生します。必須。3:
indices
テンソルの形状と等しい形状の T タイプのテンソルを更新します。必須。4: スカラーを使用した
axis
テンソル、または散乱の軸を指定するタイプ T_AXIS の 1 つの要素を使用した 1D テンソル。負のaxis
は逆インデックスを意味し、値axis = data.rank + axis
に正規化されます。値の範囲は[-r, r - 1]
で、r
はdata
のランクです。必須。
出力:
1: T タイプの
data
テンソルと等しい形状を持つテンソル。
タイプ:
T: サポートされるタイプ。
T_IND: 任意の整数値タイプ。
T_AXIS: 任意の整数値タイプ。
data
入力のboolean
タイプ、リダクション合計の場合、prod
はそれに応じて論理OR
、AND
のように動作しますが、boolean
データタイプとリダクション平均の実装はありません。
例:
例 1
<layer ... use_init_val="true" reduction="sum" type="ScatterElementsUpdate">
<input>
<port id="0">> <!-- data -->
<dim>4</dim> <!-- values: [2, 3, 4, 6] -->
</port>
<port id="1"> <!-- indices (negative values allowed) -->
<dim>6</dim> <!-- values: [1, 0, 0, -2, -1, 2] -->
</port>
<port id="2">> <!-- updates -->
<dim>6</dim> <!-- values: [10, 20, 30, 40, 70, 60] -->
</port>
<port id="3"> <!-- values: [0] -->
<dim>1</dim>
</port>
</input>
<output>
<port id="4" precision="FP32">
<dim>4</dim> <!-- values: [52, 13, 104, 76] -->
</port>
</output>
</layer>
例 2
<layer ... use_init_val="false" reduction="sum" type="ScatterElementsUpdate">
<input>
<port id="0">> <!-- data -->
<dim>4</dim> <!-- values: [2, 3, 4, 6] -->
</port>
<port id="1"> <!-- indices -->
<dim>6</dim> <!-- values: [1, 0, 0, 2, 3, 2] -->
</port>
<port id="2">> <!-- updates -->
<dim>6</dim> <!-- values: [10, 20, 30, 40, 70, 60] -->
</port>
<port id="3"> <!-- values: [0] -->
<dim>1</dim>
</port>
</input>
<output>
<port id="4" precision="FP32">
<dim>4</dim> <!-- values: [50, 10, 100, 70] -->
</port>
</output>
</layer>
例 3
<layer ... use_init_val="true" reduction="none" type="ScatterElementsUpdate">
<input>
<port id="0">> <!-- data -->
<dim>3</dim>
<dim>4</dim> <!-- values: [[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]] -->
</port>
<port id="1"> <!-- indices -->
<dim>2</dim>
<dim>2</dim> <!-- values: [[1, 2],
[0, 3]] -->
</port>
<port id="2">> <!-- updates -->
<dim>2</dim>
<dim>2</dim> <!-- values: [[11, 12],
[13, 14]]) -->
</port>
<port id="3"> <!-- values: [1] -->
<dim>1</dim>
</port>
</input>
<output>
<port id="4" precision="I32">
<dim>3</dim>
<dim>4</dim> <!-- values: [[ 0, 11, 12, 0],
[13, 0, 0, 14],
[ 0, 0, 0, 0]] -->
</port>
</output>
</layer>
例 4
<layer ... use_init_val="true" reduction="sum" type="ScatterElementsUpdate">
<input>
<port id="0">> <!-- data -->
<dim>3</dim>
<dim>4</dim> <!-- values: [[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]] -->
</port>
<port id="1"> <!-- indices -->
<dim>2</dim>
<dim>2</dim> <!-- values: [[1, 1],
[0, 3]] -->
</port>
<port id="2">> <!-- updates -->
<dim>2</dim>
<dim>2</dim> <!-- values: [[11, 12],
[13, 14]]) -->
</port>
<port id="3"> <!-- values: [1] -->
<dim>1</dim>
</port>
</input>
<output>
<port id="4" precision="I32">
<dim>3</dim>
<dim>4</dim> <!-- values: [[ 1, 24, 1, 1],
[14, 1, 1, 15],
[ 1, 1, 1, 1]] -->
</port>
</output>
</layer>
例 5
<layer ... use_init_val="true" reduction="prod" type="ScatterElementsUpdate">
<input>
<port id="0">> <!-- data -->
<dim>3</dim>
<dim>4</dim> <!-- values: [[2, 2, 2, 2],
[2, 2, 2, 2],
[2, 2, 2, 2]] -->
</port>
<port id="1"> <!-- indices -->
<dim>2</dim>
<dim>2</dim> <!-- values: [[1, 1],
[0, 3]] -->
</port>
<port id="2">> <!-- updates -->
<dim>2</dim>
<dim>2</dim> <!-- values: [[11, 12],
[13, 14]]) -->
</port>
<port id="3"> <!-- values: [1] -->
<dim>1</dim>
</port>
</input>
<output>
<port id="4" precision="I32">
<dim>3</dim>
<dim>4</dim> <!-- values: [[ 2, 264, 2, 2],
[ 26, 2, 2, 28],
[ 2, 2, 2, 2]] -->
</port>
</output>
</layer>
例 6
<layer ... type="ScatterElementsUpdate">
<input>
<port id="0">
<dim>1000</dim>
<dim>256</dim>
<dim>7</dim>
<dim>7</dim>
</port>
<port id="1">
<dim>125</dim>
<dim>20</dim>
<dim>7</dim>
<dim>6</dim>
</port>
<port id="2">
<dim>125</dim>
<dim>20</dim>
<dim>7</dim>
<dim>6</dim>
</port>
<port id="3"> <!-- values: [0] -->
<dim>1</dim>
</port>
</input>
<output>
<port id="4" precision="FP32">
<dim>1000</dim>
<dim>256</dim>
<dim>7</dim>
<dim>7</dim>
</port>
</output>
</layer>