SpaceToBatch

バージョン名: SpaceToBatch-2

カテゴリー: データ移動

簡単な説明: SpaceToBatch 操作は、data 入力の “空間” 次元 [1, ..., N - 1]block_shape 形状のブロックのグリッドに分割し、これらのブロックをバッチ次元 (0) でインターリーブします。出力では、空間次元 [1, ..., N - 1] はグリッド内の位置に対応し、バッチ次元は空間ブロック内の位置と元のバッチ位置の両方を組み合わせます。ブロックに分割する前に、入力の空間次元は、pads_begin および pads_end に従ってオプションでゼロ埋められます。

詳細な説明:

この操作は、形状 [batch, D_1, D_2 ... D_{N - 1}] の入力テンソル data と、形状 [N]block_shapepads_beginpads_endY 出力テンソルに変換することと等価です。

pads_beginpads_end に従って、入力の次元 \([D_0, \dots, D_{N - 1}]\) の開始点と終了点をゼロで埋めます。

\[x = [batch + P_0, D_1 + P_1, D_2 + P_2, \dots, D_{N - 1} + P_{N - 1}]\]
\[x' = reshape(x, [batch, \frac{D_1 + P_1}{B_1}, B_1, \frac{D_2 + P_2}{B_2}, B_2, \dots, \frac{D_{N - 1} + P_{N - 1}}{B_{N - 1}}, B_{N - 1}])\]
\[x'' = transpose(x', [2, 4, \dots, (N - 1) + (N - 1), 0, 1, 3, \dots, N + (N - 1)])\]
\[y = reshape(x'', [batch \times B_1 \times \dots \times B_{N - 1}, \frac{D_1 + P_1}{B_1}, \frac{D_2 + P_2}{B_2}, \dots, \frac{D_{N - 1} + P_{N - 1}}{B_{N - 1}}]\]

説明:

  • \(P_i\) = pads_begin[i] + pads_end[i]

  • \(B_i\) = block_shape[i]

  • バッチ次元の \(P_0\) は 0 (パディングなし) であると想定されます

  • バッチの \(B_0\) は無視されます

属性:

利用可能な属性はありません。

入力:

  • 1: data - rank >= 2 の T1 タイプの入力 N-D テンソル [batch, D_1, D_2 ... D_{N - 1}]必須。

  • 2: block_shape - data 入力形状のサイズに等しい形状 [N] を持つ T2 タイプの入力 1 次元テンソル。すべての値は >= 1 である必要があります。block_shape[0] は 1 であると予想されます。必須。

  • 3: pads_begin - data 入力形状のサイズに等しい形状 [N] を持つ T2 タイプの入力 1 次元テンソル。すべての値は負ではない必要があります。pads_begin は、data 入力の各軸に沿った先頭のパディングを指定します。block_shape[i]data_shape[i] + pads_begin[i] + pads_end[i] を除算する必要があります。pads_begin[0] は 0 であると予想されます。必須。

  • 4: pads_end - data 入力形状のサイズに等しい形状 [N] を持つ T2 タイプの入力 1 次元テンソル。すべての値は負ではない必要があります。pads_end は、data 入力の各軸に沿った終了のパディングを指定します。block_shape[i]data_shape[i] + pads_begin[i] + pads_end[i] を除算する必要があります。pads_end[0] は 0 であると予想されます。必須。

出力:

  • 1: data 入力と同じタイプの形状 [batch * block_shape[0] * block_shape[1] * ... * block_shape[N - 1], (D_1 + pads_begin[1] + pads_end[1]) / block_shape[1], (D_2 + pads_begin[2] + pads_end[2]) / block_shape[2], ..., (D_{N -1} + pads_begin[N - 1] + pads_end[N - 1]) / block_shape[N - 1] を持つ N-D テンソル。

タイプ:

  • T1: サポートされている任意のタイプ。

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

例:

 <layer type="SpaceToBatch" ...>
     <input>
         <port id="0">       <!-- data -->
             <dim>2</dim>    <!-- batch -->
             <dim>6</dim>    <!-- spatial dimension 1 -->
             <dim>10</dim>   <!-- spatial dimension 2 -->
             <dim>3</dim>    <!-- spatial dimension 3 -->
             <dim>3</dim>    <!-- spatial dimension 4 -->
         </port>
         <port id="1">       <!-- block_shape value: [1, 2, 4, 3, 1] -->
             <dim>5</dim>
         </port>
         <port id="2">       <!-- pads_begin value: [0, 0, 1, 0, 0] -->
             <dim>5</dim>
         </port>
         <port id="3">       <!-- pads_end value: [0, 0, 1, 0, 0] -->
             <dim>5</dim>
         </port>
     </input>
     <output>
         <port id="3">
             <dim>48</dim>   <!-- data.shape[0] * block_shape.shape[0] * block_shape.shape[1] *... * block_shape.shape[4] -->
             <dim>3</dim>    <!-- (data.shape[1] + pads_begin[1] + pads_end[1]) / block_shape.shape[1]  -->
             <dim>3</dim>    <!-- (data.shape[2] + pads_begin[2] + pads_end[2]) / block_shape.shape[2] -->
             <dim>1</dim>    <!-- (data.shape[3] + pads_begin[3] + pads_end[3]) / block_shape.shape[3] -->
             <dim>3</dim>    <!-- (data.shape[4] + pads_begin[4] + pads_end[4]) / block_shape.shape[4] -->
         </port>
     </output>
 </layer>