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((endstart)/step),0)

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

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

 <layer ... type="Range"> 
    <data output_type="i32"> 
    <input> 
        <port id="0">
            <!-- start 値: 2 --> 
        </port> 
        <port id="1">
            <!-- stop 値: 23 --> 
        </port> 
        <port id="2">
            <!-- step 値: 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 値: 23 --> 
        </port> 
        <port id="1">
            <!-- stop 値: 2 --> 
        </port> 
        <port id="2">
            <!-- step 値: 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 値: 1 --> 
        </port> 
        <port id="1">
            <!-- stop 値: 2.5 --> 
        </port> 
        <port id="2">
            <!-- step 値: 0.5 --> 
        </port> 
    </input> 
    <output> 
        <port id="3"> 
            <dim>3</dim>
            <!-- [ 1.0, 1.5, 2.0] --> 
        </port> 
    </output> 
</layer>