ScatterNDUpdate

バージョン名: ScatterNDUpdate-3

カテゴリー: データ移動

簡単な説明: 2 番目と 3 番目の入力テンソルで指定された更新された要素を含む最初の入力テンソルのコピーを作成します。

詳細な説明: この操作は data テンソルのコピーを生成し、その値を indices で指定された特定のインデックス位置での更新で指定された値に更新します。出力形状は data の形状と同じです。indices テンソルには重複したエントリーがあってはなりません。indices 内のエントリーが重複している場合、結果は未定義です。

indices の最後の次元は、最大でも data.shape のランクです。indices の最後の次元は、indices.shape[-1] = data.shape.rank の場合は要素へのインデックス、または indices.shape[-1] < data.shape.rank の場合はスライスに対応します。更新は形状を持つテンソルです indices.shape[:-1] + data.shape[indices.shape[-1]:]

例 1 は data 内の 4 つの単一要素の更新を示します。

data    = [1, 2, 3, 4, 5, 6, 7, 8]
indices = [[4], [3], [1], [7]]
updates = [9, 10, 11, 12]
output  = [1, 11, 3, 10, 9, 6, 7, 12]

例 2 は data 内の 4x4 形状の 2 つのスライスの更新を示します。

data    = [[[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
          [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
          [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]],
          [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]
indices = [[0], [2]]
updates = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
          [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]]
output  = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
          [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
          [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]],
          [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]

属性: ScatterNDUpdate には属性がありません。

入力:

  • 1: 任意のランク r >= 1 およびタイプ T のデータテンソル。必須。

  • 2: 任意のランク q >= 1 およびタイプ T_IND のインデックスを持つ indices テンソル。インデックス・エントリー (i_0, i_1, ...,i_k) (k = indices.shape[-1]) 内のすべてのインデックス値 i_j は、範囲 [0, s_j - 1] 内になければなりません。ここで、s_j = data.shape[j] です。k は最大でも r でなければなりません。必須。

  • 3: ランク r - indices.shape[-1] + q - 1 のタイプ T のテンソルを更新します。期待される更新ランクが 0D の場合、単一要素を持つテンソルにすることができます。 必須。

出力:

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

タイプ:

  • T: 任意の数値タイプ。

  • T_IND: int32 または int64

例:

 <layer ... type="ScatterNDUpdate">
     <input>
         <port id="0">
             <dim>1000</dim>
             <dim>256</dim>
             <dim>10</dim>
             <dim>15</dim>
         </port>
         <port id="1">
             <dim>25</dim>
             <dim>125</dim>
             <dim>3</dim>
         </port>
         <port id="2">
             <dim>25</dim>
             <dim>125</dim>
             <dim>15</dim>
         </port>
     </input>
     <output>
         <port id="3">
             <dim>1000</dim>
             <dim>256</dim>
             <dim>10</dim>
             <dim>15</dim>
         </port>
     </output>
 </layer>