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,\;indices[m,\;n,\;\dots,\;p],\;\dots] = updates[\dots,\;m,\;n,\;\dots,\;p,\;\dots]\]

ここで、data の最初の \(\dots\)\([d_0,\;\dots,\;d_{axis - 1}]\) 次元に対応し、data の最後の \(\dots\)rank(data) - (axis + 1) 次元に対応します。

axis = 0 の場合のいくつかの例:

  1. indices\(0\) D テンソル: \(data[indices,\;\dots] = updates[\dots]\)

  2. indices\(1\) D テンソル (\(\forall_{i}\)): \(data[indices[i],\;\dots] = updates[i,\;\dots]\)

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

出力:

  • 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>