BatchToSpace#

バージョン名: BatchToSpace-2

カテゴリー: データ移動

簡単な説明: BatchToSpace 操作は、指定された入力 data のバッチ次元を、block_shape 入力で指定された空間次元のブロックに並べ替えます。次に、出力を生成するために、空間次元が crops_begincrops_end 入力に従ってオプションで切り取られます。

詳細な説明

BatchToSpace 操作は、出力テンソル y を生成する、形状 [batch, D_1, D_2, ..., D_{N-1}] の入力 data および形状 [N]block_shapecrops_begincrops_end 入力に対する次の演算ステップと同等です。

  1. data 入力を再形成して、次の形状のテンソルを生成します: [B1,,BN1,batch(B1××BN1),D1,D2,,DN1]

x=reshape(data,[B1,,BN1,batch(B1××BN1),D1,D2,,DN1])
  1. x の次元を並べ替えて、次の形状のテンソルを生成します: [batch(B1××BN1),D1,B1,D2,B2,,DN1,BN1]

x=transpose(x,[N,N+1,0,N+2,1,,N+N1,N1])
  1. x を変形して、次の形状のテンソルを生成します: [batch(B1××BN1),D1×B1,D2×B2,,DN1×BN1]

x=reshape(x,[batch(B1××BN1),D1×B1,D2×B2,,DN1×BN1])
  1. crops_begincrops_end 入力に従って x の空間次元の開始と終了を切り取り、次の形状の出力 y を生成します:

[batch(B1××BN1),crop(D1×B1,CB1,CE1),crop(D2×B2,CB2,CE2),,crop(DN1×BN1,CBN1,CEN1)]

ここで、

  • Bi = block_shape[i]

  • B0 は 1 であると予想されます

  • CBi = crops_begin[i]

  • CEi = crops_end[i]

  • CB0CE0 は 0 であると予想されます

  • CBi+CEiDi×Bi

BatchToSpace 操作は、SpaceToBatch 操作の逆です。

属性: BatchToSpace 操作には属性がありません。

入力

  • 1: data - タイプ T でランク 2 以上のテンソル。レイアウトは [batch, D_1, D_2 ... D_{N-1}] (バッチ数、空間軸) です。必須。

  • 2: block_shape - 対応する空間軸に移動される data 入力の batch 軸のブロックサイズを指定します。タイプ T_INT および形状 [N] の 1D テンソル。すべての要素の値は 1 以上である必要があります。block_shape[0] は 1 であると予想されます。必須。

  • 3: crops_begin - data 入力の各軸に沿って最初から切り取る量を指定します。タイプ T_INT および形状 [N] の 1D テンソル。すべての要素の値は 0 以上である必要があります。crops_begin[0] は 0 であると予想されます。必須。

  • 4: crops_end - data 入力の各軸に沿って終了点から切り取る量を指定します。タイプ T_INT および形状 [N] の 1D テンソル。すべての要素の値は 0 以上である必要があります。crops_end[0] は 0 であると予想されます。必須。

  • : N は入力 data のランクに対応します。

  • : data 入力の batch 軸は、block_shape 要素の累積積で均等に割り切れる必要があります。

  • : crops_begin[i] + crops_end[i] <= block_shape[i] * input_shape[i] であることが必要です。

出力

  • 1: data 入力テンソルと同じランクおよび形状 [batch / (block_shape[0] * block_shape[1] * ... * block_shape[N - 1]), D_1 * block_shape[1] - crops_begin[1] - crops_end[1], D_2 * block_shape[2] - crops_begin[2] - crops_end[2], ..., D_{N - 1} * block_shape[N - 1] - crops_begin[N - 1] - crops_end[N - 1] を持つ T タイプの並べ替えられたテンソル。

タイプ

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

  • T_INT: サポートされている整数タイプ。

例: 2D 入力テンソル data

<layer type="BatchToSpace" ...> 
    <input> 
        <port id="0"> <!-- data --> 
            <dim>10</dim> <!-- バッチ --> 
            <dim>2</dim> <!-- 空間次元 1 --> 
        </port> 
        <port id="1"> <!-- block_shape 値: [1, 5] --> 
            <dim>2</dim> 
        </port> 
        <port id="2"> <!-- crops_begin 値: [0, 2] --> 
            <dim>2</dim> 
        </port> 
        <port id="3"> <!-- crops_end 値: [0, 0] --> 
            <dim>2</dim> 
        </port> 
    </input> 
    <output> 
        <port id="3"> 
            <dim>2</dim> <!-- data.shape[0] / (block_shape.shape[0] * block_shape.shape[1]) --> 
            <dim>8</dim> <!-- data.shape[1] * block_shape.shape[1] - crops_begin[1] - crops_end[1]--> 
        </port> 
    </output> 
</layer>

例: 5D 入力テンソル data

<layer type="BatchToSpace" ...> 
    <input> 
        <port id="0"> <!-- data --> 
            <dim>48</dim> <!-- バッチ --> 
            <dim>3</dim> <!-- 空間次元 1 --> 
            <dim>3</dim> <!-- 空間次元 2 --> 
            <dim>1</dim> <!-- 空間次元 3 --> 
            <dim>3</dim> <!-- 空間次元 4 --> 
        </port> 
        <port id="1"> <!-- block_shape 値: [1, 2, 4, 3, 1] --> 
            <dim>5</dim> 
        </port> 
        <port id="2"> <!-- pads_begin 値: [0, 0, 1, 0, 0] --> 
            <dim>5</dim> 
        </port> 
        <port id="3"> <!-- pads_end 値: [0, 0, 1, 0, 0] --> 
            <dim>5</dim> 
       </port> 
    </input> 
    <output> 
        <port id="3"> 
            <dim>2</dim> <!-- data.shape[0] / block_shape.shape[0] * block_shape.shape[1] *... * block_shape.shape[4]) --> 
            <dim>6</dim> <!-- data.shape[1] * block_shape.shape[1] - crops_begin[1] - crops_end[1]--> 
            <dim>10</dim> <!-- data.shape[2] * block_shape.shape[2] - crops_begin[2] - crops_end[2] --> 
            <dim>3</dim> <!-- data.shape[3] * block_shape.shape[3] - crops_begin[3] - crops_end[3] --> 
            <dim>3</dim> <!-- data.shape[4] * block_shape.shape[4] - crops_begin[4] - crops_end[4] --> 
        </port> 
    </output> 
</layer>