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

    • 説明: 入力に対して実行する操作のタイプ。

    • 値の範囲: 次のいずれか: nonesumprodminmaxmean

    • タイプ: string

    • デフォルト値: none

    • 必須: いいえ

  • use_init_val

    • 説明: データ入力テンソルの要素を reduce 操作の初期値として使用するかどうかを制御します。

    • 値の範囲:

      • true - データ入力要素が使用されます
      • false - データ入力要素は使用されません
    • タイプ: ブール値

    • デフォルト値: true

    • 必須: いいえ

    • 注: この属性は reduction == “none” には影響しません

入力:

  • 1: 任意のランク r およびタイプ Tdata テンソル。必須。

  • 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] で、rdata のランクです。必須。

出力:

  • 1: T タイプの data テンソルと等しい形状を持つテンソル。

タイプ:

  • T: サポートされるタイプ。

  • T_IND: 任意の整数値タイプ。

  • T_AXIS: 任意の整数値タイプ。

  • data 入力の boolean タイプ、リダクション合計の場合、prod はそれに応じて論理 ORAND のように動作しますが、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>