Range

バージョン名: Range-4

カテゴリー: 生成

簡単な説明: Range 操作は、入力値 [start, stop) に従ってステップで一連の数値を生成します。

属性:

  • output_type

    • 説明: 出力テンソルのタイプ

    • 値の範囲: 任意の数値タイプ

    • タイプ: 文字列

    • 必須: はい

入力:

  • 1: “start” - T1 タイプのスカラー。必須。

  • 2: “stop” - T2 タイプのスカラー。必須。

  • 3: “step” - T3 タイプのスカラー。output_type へのキャスト後に step が 0 に等しい場合、動作は未定義です。必須。

出力:

  • 1: 属性 output_typeで指定されたタイプのテンソル。

タイプ:

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

詳細説明:

Range 操作では、次の式に従って、最初の入力 (start) の値から始まり、2 番目の入力 (stop) の値を含まない step で 3 番目の入力の値に等しい一連の数値が生成されます。

前方 step:

\[start<=val[i]<stop,\]

後方 step:

\[start>=val[i]>stop,\]

i 番目の要素は次の式で計算されます。

\[val[i+1]=val[i]+step.\]

計算は、すべての値を accumulate_type(output_type) にキャストした後に行われます。accumulate_type は、現在のハードウェアの output_type よりも累積精度が高いか同等の精度を持つタイプです。例: fp16fp64。要素数は浮動小数点タイプで次の式で計算されます。

\[max(ceil((end − start) / step), 0)\]

これは PyTorch の操作 torch.arange と連携しており、tensorflow 操作 tf.range と連携するには、Range を呼び出す前にすべての入力を output_type にキャストする必要があります。キャスト値はゼロに丸められます。

例:

例 1: ポジティブステップ

 <layer ... type="Range">
     <data output_type="i32">
     <input>
         <port id="0">  <!-- start value: 2 -->
         </port>
         <port id="1">  <!-- stop value: 23 -->
         </port>
         <port id="2">  <!-- step value: 3 -->
         </port>
     </input>
     <output>
         <port id="3">
             <dim>7</dim> <!-- [ 2,  5,  8, 11, 14, 17, 20] -->
         </port>
     </output>
 </layer>

例 2: ネガティブステップ

 <layer ... type="Range">
     <data output_type="i32">
     <input>
         <port id="0">  <!-- start value: 23 -->
         </port>
         <port id="1">  <!-- stop value: 2 -->
         </port>
         <port id="2">  <!-- step value: -3 -->
         </port>
     </input>
     <output>
         <port id="3">
             <dim>7</dim> <!-- [23, 20, 17, 14, 11, 8, 5] -->
         </port>
     </output>
 </layer>

例 3: 浮動小数点

 <layer ... type="Range">
     <data output_type="f32">
     <input>
         <port id="0">  <!-- start value: 1 -->
         </port>
         <port id="1">  <!-- stop value: 2.5 -->
         </port>
         <port id="2">  <!-- step value: 0.5 -->
         </port>
     </input>
     <output>
         <port id="3">
             <dim>3</dim> <!-- [ 1.0,  1.5,  2.0] -->
         </port>
     </output>
 </layer>